Аппаратный вариант Для работы с аппаратным SPI его нужно сначала, естественно, инициализировать. Посмотрим, как это будет выглядеть для ATmega8535 (а также для многих других МК того же класса, например, ATmega8515, ATmega16 и пр., у которых выводы аппаратного SPI совпадают с интерфейсом SPI-программирования и занимают старшие 4 бита порта В). Заодно инициализируем и вывод для управления "выбором кристалла" — в большинстве случаев он в интерфейсе SPI играет важную роль (например, микросхемы памяти, которые мы рассмотрим далее, высокий уровень на этом выводе, кроме всего прочего, устанавливает в состояние с низким потреблением). Часто для этого выбирают вывод /SS, который в режиме "мастера" не задействован (не забудем, что его нужно сконфигурировать на выход!), но мы для разнообразия выберем вывод РВО — часто требуется управлять несколькими устройствами, одного вывода /SS тогда все равно недостаточно, и младшие биты порта В, идущие подряд, оказываются более удобными (листинг 11.1). [ Листинг 11.1 ] .equ CS = РВ0 .equ MOSI = PB5 .equ MISO = РВ6 .equ SCK = PB7 ;разряды порта В, используемые интерфейсом SPL. Листинг 11.2 иллюстрирует инициализацию в режиме 0 ("мастер", DORD = 0 — старший бит первым, SPR1 и SPR0 = 0 — скорость fрез/4). [ Листинг 11.2 ] ldi temp,(1<out DDRB,temp ;SCK,MOSI,CS, SS - выходы ser temp ;0xFF out PORTB,temp ;PB7..0 — высокий уровень, весь порт В Процедура записи-чтения тогда будет выглядеть очень просто (листинг 11.4). [ Листинг 11.4 ] WR_spi: ;запись-чтение SPI, в temp данные на входе и на выходе out SPDR,temp ; начать передачу wait_spi: sbis SPSR,SPIF ; ожидаем конца передачи rjmp wait_spi in temp,SPDR ; чтение данных ret При работе с большинством устройств через SPI, к сожалению, этой простой процедурой дело не ограничивается — чаще всего требуется, по крайней мере, вовремя правильно установить "выбор кристалла", причем иногда (если интерфейс у ведомого устройства недостаточно скоростной) с формированием искусственных задержек и прочими сложностями, сильно загромождающими программу. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Программный вариант Программный вариант процедур чтения-записи более громоздок, но зато позволяет задействовать любые удобные выводы портов МК (в том числе и таких, которые вообще аппаратного SPI не имеют) и не требует особой инициализации, кроме формирования направления работы соответствующих выводов. Листинг 11.5 иллюстрирует, как будет выглядеть чтение-запись в варианте, соответствующем режиму 0. [ Листинг 11,5 ] .equ CS = 0 ; выводы PortB .equ MOSI = 1 .equ MISO = 2 .equ SCK = 3 ... ; инициализация SPI ; установка MOSI, SCK, CS на выход ldi temp,(1<