Синхронная передача данных по интерфейсу SPI

Документация

Интерфейс Serial Peripheral Interface (SPI) предназначен для обмена данными с переферийными устройствами (LCD экраны, карты памяти и т.д).

При обмене данными по этому интерфесу микроконтроллер ATmega8 работает в режиме ведущего устройства (MASTER), к которому можно подключить 1 или несколько ведомых блоков (SLAVE). Передача данных начинается, когда ведомое устройство активизируется ведущим по линии /SS. Передача данных происходит следующим образом:

  • Ведущее устройство записывает байт, подлежащий передаче, в сдвиговый регистр SPDR
  • При каждом тактовом импульсе (тактовые импульсы задаются выходом SCK) ведущее устройство перемещает 1 бит данных на выход MOSI, а ведомое устройство одновременно передаёт 1 бит данных на вход MISO ведущего. Таким образом за 8 тактовых импульсов устройства Master и Slave обмениваются 1 байтом данных
  • По окончании передачи данных в регистре SPCR устанавливается флаг запроса на прерывание

Текущая передача данных может быть преждевременно завершена подачей в линию SS логической единицы.

Схема передачи данных по SPI:

К микроконтроллеру atmega8 можно подключить несколько ведомых устройств. Активным будет тот, на вход SS которого подан лог.0. Пример подключения нескольких SLAVE блоков к микроконтроллеру:

В Atmega8 выходы SPI расположены на порту B: B2 - линия SS, B3 - MOSI, B4 - MISO, B7 - SCK

Регистры управления и состояния SPI в Atmega8

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

7 6 5 4 3 2 1 0
SPIE
SPE
DORD
MSTR
CPOL CPHA  SPR1
SPR0

SPIE=1 : прерывание по завершению передачи данных по SPI разрешено

SPE=1 : активация интерфейса SPI. При поступлении сигнала сброса SPE переводится в состояние лог.0 и интерфейс SPI отключается

DODR=1: первым передаётся младший разряд байта данных. При DODR=0 первым передаётся старший разряд байта данных

MSTR=0 - atmega8 определяется как ведомое устройство (SLAVE). MSTR=1 - микроконтроллер с  интерфейсом SPI определяется как ведущее устройство.  Если линия SS (вывод 2 порта B) настроена в качестве входа, то при низком уровне сигнала на этой линии MSTR сбрасывается в лог.0

CPOL=1 - на линии SCK в неактивном состоянии находится сигнал высокого уровня. С помощью этого разряда, а также разряда CPHA устанавливается один из четырёх возможных  режимов передачи данных.

SPR0, SPR1 предназначены для выбора частоты тактирования на линии SCK (в режиме Master). Если микроконтроллер работает в режиме SLAVE, то эти регистры не имеют никакого значения

Выбор режима работы SPI:

CPOL CPHA Режим работы SPI
0 0 MASTER переводит линию SS в состояние лог.0. По ниспадающему фронту сигнала соответствующий ведомый блок включается в обмен данными. Передача начинается с того, что устройство MASTER помещает в свой регистр SPDR байт, подлежащий передаче. После 8-го тактового импульса линии SCK передача завершается, в регистрах SPSR устанавливается флаг SPIF. Одновременно со сбросом линии SS в исходное состояние (лог.1) ведущее устройство завершает передачу, ведомое устройство становится неактивным
0 1  
1 0  
1 1  

Выбор частоты тактирования на линии SCK:

SPR1 SPR0 Частота SCK
0 0 Тактовая частота микроконтроллера / 4
0 1
Тактовая частота микроконтроллера / 16
1 0 Тактовая частота микроконтроллера / 64
1 1 Тактовая частота микроконтроллера / 128

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

7 6 5 4 3 2 1 0
SPIF
WCOL
 -
 - 
 -  -   - 
 -

Флаг WCOL устанавливается в случае, когда во время передачи данных предпринимается попытка записи в регистр данных SPI

Флаг SPIF указывает на завершение передачи и вызывает запрос на прерывание (если прерывания разрешены)

Пример работы с SPI в atmega8:

void spi_init(void)
{
SPCR = 0x52;
SPSR = 0x00;
}

unsigned char SPI_transmit(unsigned char data)
{

SPDR = data;

while(!(SPSR & (1<<7)));
  data = SPDR;

return(data);
}

unsigned char SPI_receive(void)
{
unsigned char data;

SPDR = 0xff;
while(!(SPSR & (1<<7)));
  data = SPDR;

return data;
}

Если у вас есть какие-то замечания по этому документу или что-то осталось непонятно, то вы можете оставить свой отзыв или вопрос

Комментарии (Ваш комментарий будет первым! :))

Анонимная отправка сообщений запрещена! Пожалуйста зарегистрируйтесь