Управление 595 сдвиговыми регистрами при помощи AVR по SPI

На самом деле управлять сдвиговыми регистрами при помощи AVR микроконтроллера довольно просто. Большинство микроконтроллеров имеют SPI (последовательный периферийный интерфейс). Сдвиговый регистр является периферийным устройством, подключаемым через последовательный порт. Все, что нам нужно сделать, это присоединить к микроконтроллеру сдвиговый регистр и написать достаточно простую программу. О сдвиговых регистрах и принципах их работы можно прочитать здесь.

Отечественным аналогом популярной микросхемы 74HC595 является отечественная КР1564ИР52 (правда первую найти бывает проще у нас).

В подключении контактов Clear и Enable к микроконтроллеру необходимости нет. Если используется мало регистров сдвига, можно подать на них нули, закрыв их. Я просто подключил вывод SCLR к VCC и вывод Enable к GND.

После этого у нас осталось три вывода: SI, SCK и RCK. Можно подавать сигнал на выводы SCK и RCK по одному проводу, но это уже другая тема.  Я подключил эти контакты к ATmega168. Обратите внимание, что выводы SCK и RCK для обоих сдвиговых регистров связаны между собой. Вывод SI  первого чипа подключен к микроконтроллеру. Вывод QH первого сдвигового регистра подключен к выводу SI второго чипа.

Работа с SPI

Работа с SPI довольно проста. Необходимо сделать несколько вещей для работы с ним:
1. Настройте используемые контакты как выход.
2. Включите SPI в режиме Master
3. Подайте низкий уровень на СС
4. Передайте команды в SPDR, он автоматически подготовит и предаст их сдвиговому регистру.
5. Дайте команду сдвиговому регистру для исполнения полученных команд.

В качестве SPI выводов можно использовать лишь заранее определённые выводы, которые можно узнать в документации.

#define SHIFT_REGISTER DDRB
#define SHIFT_PORT PORTB
#define DATA (1<< PB3) //MOSI (SI)
#define LATCH (1<< PB2) //SS (RCK)
#define CLOCK (1<< PB5) //SCK (SCK)

SHIFT_REGISTER |= (DATA | LATCH | CLOCK); //Set control pins as outputs
SHIFT_PORT &= ~(DATA | LATCH | CLOCK); //Set control pins low

SPI включается в режиме Master одной строкой:

SPCR = (1 << SPE) | (1 << MSTR); //Start SPI as Master

На пин SS необходимо подать низкий уровень. В документации на микроконтроллер написано: «Когда SPI включен в режиме Master, СС не контролируется автоматически. Это должно быть сделано пользователем». Это делается так:

//Pull LATCH low (Important: this is necessary to start the SPI transfer!)
SHIFT_PORT &= ~LATCH;

Сейчас мы пишем наши команды для регистра сдвига:

//Shift in some data
SPDR = 0b01010101; //This should light alternating LEDs
//Wait for SPI process to finish
while(!(SPSR & (1<< SPIF)));

Пока данные хранятся в регистре сдвига светодиоды не загорятся:

//Toggle latch to copy data to the storage register
SHIFT_PORT |= LATCH;
SHIFT_PORT &= ~LATCH;

Готовая программа:

#include «avr/io.h»

#define SHIFT_REGISTER DDRB
#define SHIFT_PORT PORTB
#define DATA (1<< PB3) //MOSI (SI)
#define LATCH (1<< PB2) //SS (RCK)
#define CLOCK (1<< PB5) //SCK (SCK)

int main(void)
{
//Setup IO
SHIFT_REGISTER |= (DATA | LATCH | CLOCK); //Set control pins as outputs
SHIFT_PORT &= ~(DATA | LATCH | CLOCK); //Set control pins low

//Setup SPI
SPCR = (1<< SPE) | (1<< MSTR); //Start SPI as Master

//Pull LATCH low (Important: this is necessary to start the SPI transfer!)
SHIFT_PORT &= ~LATCH;

//Shift in some data
SPDR = 0b01010101; //This should light alternating LEDs
//Wait for SPI process to finish
while(!(SPSR & (1<< SPIF)));

//Shift in some more data since I have two shift registers hooked up
SPDR = 0b01010101; //This should light alternating LEDs
//Wait for SPI process to finish
while(!(SPSR & (1<< SPIF)));

//Toggle latch to copy data to the storage register
SHIFT_PORT |= LATCH;
SHIFT_PORT &= ~LATCH;

while(1)
{
//Loop forever
}
}


Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот

IC
МК AVR 8-битATmega81
U, U
Сдвиговый регистрCD74HC5952
R
Резистор16
Номинал выбирается под тип светодиодаLED
Светодиод16
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Добавить комментарий

Ваш адрес email не будет опубликован.