Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



Функциональная схема интерфейса SPI

Внешнее соединение ведущего (мастера) и подчиненного SPI

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

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

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

Примечание:

  1. См. "Альтернативные функции порта 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 как подчиненного и как выполнить простой прием данных.





Дата публикования: 2015-09-18; Прочитано: 261 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2025 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.103 с)...