Последовательный периферийный интерфейс – SPI

 

Последовательный порт ввода-вывода SPI (Serial Peripheral Interface), реализованный во всех микроконтроллерах семейства Mega, имеет двуяковое назначение. Во-первых, через SPI может быть осуществлено, так называемое, последовательное программирование (перепрограммирования) памяти программ и памяти данных микроконтроллера, непосредственно в устройстве, а во-вторых, SPI предназначен для ввода и вывода байтов при обмене данными с другими устройствами, имеющими порт SPI. Обмен выполняется под управле­нием тактового сигнала порта. Устройство, инициализирующее обмен и вырабатывающее тактовый сигнал, является ведущим (master). Устройство, выполняющее обмен при поступлении тактового сигнала, является ведомым (slave). В процессе обмена оба устройства последо­вательно бит за битом одновременно выдают и принимают байт. Обмен выполняется с использованием трех шин.

Интерфейс SPI позволяет организовать последовательную синхронную высокоскоростную передачу данных между микроконтроллером и другим периферийным устройством или между несколькими AVR-микроконтроллерами.

Отличительные особенности интерфейса SPI:

· Полнодуплексная, трехпроводная синхронная передача данных

· Ведущая или подчиненная работа

· Передача первым младшего или старшего бита

· Семь программируемых скоростей связи

· Флаг прерывания для индикации окончания передачи данных

· Защитный флаг при повторной записи

· Пробуждение из режима холостого хода (Idle)

· Режим ведущего (мастера) SPI с удвоением скорости (CK/2)


Внешние соединения между ведущим (мастером) и подчиненным CPU через интерфейс SPI показаны на рис. 2.26. Система состоит из двух сдвиговых регистров и генератора ведущей синхронизации. Ведущий SPI инициирует сеанс связи подачей низкого уровня на вход SS того подчиненного устройства, с которым необходимо обмениваться данными. Оба респондента (ведущий и подчиненный) подготавливают данные к передаче в своем сдвиговом регистре, при этом на стороне ведущего генерируются также импульсы синхронизации на линии SCK. По линии MOSI всегда осуществляется передача данных от ведущего к подчиненному, а по MISO, наоборот, от подчиненного к мастеру. По окончании передачи каждого пакета данных ведущий SPI должен засинхронизировать подчиненный путем подачи высокого уровня на линию SS (выбор подчиненного интерфейса).

Если SPI настроен как ведущий (мастер), то управление линией SS происходит не автоматически. Данная операция должна быть выполнена программно перед началом сеанса связи. После этого запись в регистр данных SPI инициирует генерацию синхронизации и аппаратный сдвиг 8-ми разрядов в подчиненное устройство. По окончании сдвига одного байта генератор синхронизации SPI останавливается, при этом устанавливая флаг окончания передачи (SPIF). Если установлен бит SPIE в регистре SPCR, то разрешается прерывание SPI и по окончании передачи байта будет генерирован запрос на прерывание. Мастер может продолжить сдвигать следующий байт, если записать его в регистр SPDR, или подать сигнал окончания пакета путем установки низкого уровня на линии SS. Последний принятый байт сохраняется в буферном регистре. В режиме подчиненного, интерфейс SPI находится в состоянии ожидания, в котором MISO переводится в третье состояние, до тех пор, пока на выводе SS присутствует высокий уровень. В этом состоянии программа может обновлять содержимое регистра данных SPI (SPDR), но при этом входящие импульсы синхронизации не сдвигают данные до подачи низкого уровня на вывод SS. После того как, один байт был полностью сдвинут, устанавливается флаг окончания передачи SPIF. Если установлен бит разрешения прерывания SPI (SPIE) в регистре SPCR, то установка флага SPIF приводит к генерации запроса на прерывание. Подчиненный может продолжать размещать новые данные для передачи в регистр SPDR перед чтением входящих данных. Последний принятый байт хранится в буферном регистре.

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

В подчиненном режиме SPI управляющая логика осуществляет выборку входящего сигнала SCK. Чтобы гарантировать корректность выборки тактового сигнала необходимо использовать частоту синхронизации SPI не более fosc/4.

Если работа SPI разрешена, то разрешается альтернативное направление выводов MOSI, MISO, SCK и SS (см. табл. 2.48).

Таблица 2.48. Направление выводов SPI

Вывод Направление для ведущего SPI Направление для подчиненного SPI
MOSI Определяется пользователем Вход
MISO Вход Определяется пользователем
SCK Определяется пользователем Вход
SS Определяется пользователем Вход

 

Примечание. См. «Альтернативные функции порта B», где подробно описано, как установить направление на выводах порта SPI.

 

В следующих примерах показаны инициализация SPI как мастера и организация простой передачи данных.

;Программа производит чтение данных из ОЗУ и передает их по ;SPI порту

.include «m128def.inc»

;*********************************************************

 

.DSEG

var1: .BYTE 5 ; резервирует 5 байт для var1

 

.CSEG

ldi r30,low(var1) ;Загружает младший байт регистра Z

ldi r31,high(var1) ;Загружает старший байт регистра Z

ld r1,Z ;Загружает VAR1 в регистр r1

;Инициализация стека

 

ldi r16,high(ramend)

out sph,r16

ldi r16,low(ramend)

out spl,r16

mm11:

Ldi r18,$05 ; счетчик байтов

;Установка MOSI (PB2) и SCK (PB1) на вывод,

;все остальные на ввод

ldi r16,(1<<PB2)|(1<<PB1)

out DDRB,r16

 

;Разрешение SPI в режиме мастера, установка скорости связи ;fck/16

ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)

out SPCR,r17

SPI_MasterInit:

Ld r16,Z+

Call SPI_MT

dec r18

Brne SPI_MasterInit

rjmp mm11

; Запуск передачи данных (r16)

SPI_ MT:

out SPDR,r16

Wait_Transmit:

sbis SPSR,SPIF ;Ожидание завершения передачи данных

rjmp Wait_Transmit

ret