Подключаем 8-битный сдвиговый регистр SN74HC595 к микроконтроллеру Atmega8 через SPI.

Прежде чем приступить к написанию кода, немного рассмотрим настройки самого SPI:

SS – это ножка выбора устройства. При установке  на ведомом устройстве низкого уровня  — устройства начнет обмен данными, при высоком уровне — обмена не будет.

MOSI  –  выход данных ведущего устройства и вход данных ведомого устройства.

MISO  – выход данных ведомого устройства и вход данных ведущего устройства.

SCK – выход синхронизации.

В Atmega 8 используется 3 регистра для настройки SPI режима:
— управляющий регистр SPCR,
— статусный регистр SPSR,
— регистр данных SPDR.

Все  регистра восьмиразрядные.

Регистр управления SPCR :

Этот регистр контролирует SPI:  устанавливает тактовую частоту, настраивают ведущий / ведомый и т.д.

Бит 7: SPIE — Разрешение прерываний
Бит включения прерываний. При этом глобальные прерывания должны быть включены для использования функций прерывания.

Бит 6: SPE — SPI Enable

Бит включения SPI. Когда этот бит установлен в 1 -SPI включен, когда в 0 — SPI выключен.

Бит 5: DORD — Порядок  передачи данных

При установке 1 — сначала передается LSB, при установке  в 0 — сначала отправляет MSB.

Бит 4: MSTR — Выбор ведущего / ведомого.

Настраивает устройство в качестве ведущего или ведомого. Когда  бит установлен в 1 — SPI находится в режиме Master,  когда бит установлен в 0, устройство находится в режиме ведомого SPI.

Бит 3: CPOL

Выбор данных по переднему фронту — 0 или по заднему — 1

Бит 2: CPHA

Определяет когда забирать данные, по переднему фронту — 1 , или по заднему фронту -0.

Бит 1,0: SPR1, SPR0

Выбор тактовой частоты SPI.  Эти биты вместе с битом SPI2X в регистре SPSR  используются для выбора делителя частоты генератора.

Регистр состояния SPSR

Регистр состояния SPI — это регистр, с данного регистра можно получить статус шины SPI, а так же в нем  установлен флаг прерывания.

Бит 7: SPIF — флаг прерывания. 
Флаг устанавливается при завершении последовательной передачи. Прерывание также генерируется, если бит SPIE (бит 7 в SPCR) включен и глобальные прерывания включены.  Сброс флага происходит аппаратно, при вызове подпрограммы обработки прерывания или после чтения регистра SPSR с последующим обращением к регистру данных SPDR.

Бит 6: WCOL- флаг конфликта записи.

Биты 5- 1 Это зарезервированные биты.

Бит 0: SPI2x — режим двойной скорости SPI

Бит режима двойной скорости SPI уменьшает делитель частоты с 4x до 2x,  как следствие, удваивая скорость. При установке бита в 1, включается режим двойной скорости. Этот бит используется вместе с битами SPR1: 0 регистра SPCR.

Регистр данных SPDR

Регистр данных SPI является 8-битным регистром чтения / записи. Это регистр, из которого мы читаем входящие данные и записываем данные.

7-й бит является старшим значащим битом (MSB), а 0-й бит — младшим значащим битом (LSB).

Теперь зная основные настройки режима SPI можно приступить к написанию кода.

Схема подключения:

Так же необходимо подать +5V на 16 ножку микросхемы, а на 8 ножку нулевой потенциал.

Программный код:

#define F_CPU 4000000UL

#include <avr/io.h>
#include <avr/interrupt.h> //подключаем библиотеку работы с прерываниями
#include <util/delay.h>

void zdvig (char z);

int main(void)
{
/* Replace with your application code */
DDRB = 0b00111100;//ножки SPI на выход
PORTB= 0b11000011;//низкий уровень
SPCR = ((1<<SPE)|(1<<MSTR));//Включим шину, объявим ведущим
SPDR = 0b00000000;

sei();// разрешаем работу прерываниям

while (1)
{
_delay_ms(500);
zdvig(0b00000001);
_delay_ms(500);
zdvig(0b00000010);
_delay_ms(500);
zdvig(0b00000100);
_delay_ms(500);
zdvig(0b00001000);
_delay_ms(500);
zdvig(0b00010000);
_delay_ms(500);
zdvig(0b00100000);
_delay_ms(500);
zdvig(0b01000000);
_delay_ms(500);
zdvig(0b10000000);
}
}

void zdvig(char z) {
SPDR = z;
while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
//сгенерируем отрицательный фронт для записи в STORAGE REGISTER
PORTB |= (1<<PB2); //высокий уровень
_delay_ms(100);
PORTB &= ~(1<<PB2); //низкий уровень
}