Последовательный периферийный интерфейс - SPI
Функциональная схема интерфейса SPI
Внешнее соединение ведущего (мастера) и подчиненного SPI
Если работа SPI разрешена, то разрешается альтернативное направление выводов MOSI, MISO, SCK и SS (см. таблицу А).
Таблица А. – Направление выводов SPI
Вывод | Направление для ведущего SPI | Направление для подчиненного SPI |
MOSI | Определяется пользователем | Вход |
MISO | Вход | Определяется пользователем |
SCK | Определяется пользователем | Вход |
SS | Определяется пользователем | Вход |
Примечание:
- См. "Альтернативные функции порта B", где подробно описано как установить направление на выводах порта SPI.
В следующих примерах показаны инициализация SPI как мастера и организация простой передачи данных. В данных примерах DDR_SPI должен быть заменен на имя фактического регистра направления данных, управляющий выводами интерфейса SPI (для ATmega128 DDRB). DD_MOSI, DD_MISO и DD_SCK также должны быть заменены на имена соответствующих бит регистров направления данных, связанных с этими выводами. Например, если MOSI размещен на выв. PB5, то DD_MOSI необходимо заменить на DDB5, а DDR_SPI на DDRB.
Пример кода на Ассемблере[1]
SPI_MasterInit:
; Установка MOSI и SCK на вывод, все остальные на ввод
ldi r17,(1<<DD_MOSI)|(1<<DD_SCK)out DDR_SPI,r17
; Разрешение SPI в режиме мастера, установка скорости связи fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret
SPI_MasterTransmit:
; Запуск передачи данных (r16)
out SPDR,r16
Wait_Transmit:
; Ожидание завершения передачи данных
sbis SPSR,SPIF
rjmp Wait_Transmit
ret
Пример кода на Си[2]
void SPI_MasterInit(void)
{
/* Установка MOSI и SCK на вывод, все остальные на ввод */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* Разрешение SPI в режиме мастера, установка скорости связи fck/16
*/SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(char cData)
{
/* Запуск передачи данных */
SPDR = cData;
/* Ожидание завершения передачи данных */
while(!(SPSR & (1<<SPIF)))
;
}
В следующем примере показано как инициализировать SPI как подчиненного и как выполнить простой прием данных.
Пример кода на Ассемблере
SPI_SlaveInit:
; Установка MISO на вывод и всех ост. на ввод
ldi r17,(1<<DD_MISO)
out DDR_SPI,r17
; Разрешение SPI
ldi r17,(1<<SPE)
out SPCR,r17
ret
SPI_SlaveReceive:
; Ожидание завершения передачи
sbis SPSR,SPIF
rjmp SPI_SlaveReceive
; Чтение принятых данных и выход из процедуры
in r16,SPDR
ret
Пример кода на Си
void SPI_SlaveInit(void)
{
/* Установка MISO на вывод и всех ост. на ввод */
DDR_SPI = (1<<DD_MISO);
/* Разрешение SPI */
SPCR = (1<<SPE);
}
char SPI_SlaveReceive(void)
{
/* Ожидание завершения передачи */
while(!(SPSR & (1<<SPIF)));
/* Чтение принятых данных и выход из процедуры */
return SPDR;
}
Max187 – аналого-цифровой преобразователь |
Электрические характеристики
(напряжение питания: +5V ±5%; частота выборки – 75 кГц, тактовая частота – 4 МГц (половина рабочего цикла); MAX187 – опорное напряжение - 4.096V (обеспечивается конденсатором 4,7 МкФ на ножку REF) )
[1] В примере предполагается, что подключен файл специфических заголовков.
[2] В примере предполагается, что подключен файл специфических заголовков.