Стандарт синхронного периферийного интерфейса (SPI) наращивает свою популярность за счет возможности организации более быстродействующей связи по сравнению с двухпроводными интерфейсами, а также за счет использования меньшего числа элементов для реализации на кристалле полупроводника. Хотя многие мощные представители семейства AVR содержат полнофункциональный интерфейс SPI, в недорогие версии он не входит. В связи с этим, в данном документе описывается набор процедур, написанных на языке низкого уровня, реализующих программно протокол SPI в режиме мастера (связь под управлением AVR-микроконтроллера). Данная разработка может использоваться для организации доступа к последовательной памяти ЭСППЗУ семейства 25XXX производства Atmel, а также для связи с другими починенными интегральными схемами, например, с драйверами индикатора.
Рис. 14. Пример подключения к AVR-микроконтроллера подчиненного устройства (последовательное ЭСППЗУ)
Рис. 14. Временная диаграмма интерфейса SPI
Принцип действия SPI в режиме 0 подразумевает выполнение следующих условий:
1. SCK = 0 в режиме холостого хода (Idle).
2. Выход данных MOSI (из AVR) должен быть стабильным в
течение определенного промежутка времени (tSETUP) перед нарастающим фронтом тактового сигнала SCK.
3. Выход данных MISO (из подчиненного устройства)
действительный после некоторого времени (tVALID) после падающего фронта тактового сигнала SCK.
4. Первым всегда передается старший бит (MSB).
Рассматриваемые ниже процедуры написаны с учетом выполнения этих требований, а также особое внимание уделено граничным условиям, таким как tVALID и tSETUP. Данные временные параметры рассмотрены ниже.
Рис. 15. Блок-схема интерфейса SPI в режиме мастера
Таблица 7. Описание подпрограмм
init_spi:
| Данная процедура инициализирует линии SPI-порта. Используемые в процедуре макросы необходимо отредактировать, если используется не порт B. При необходимости также можно изменить линии SPI-порта в разделе программы Port Definition, задавая значения EQU для SCK, MOSI, MISO и NSS (нет выбора подчиненного устройства). Данная процедура не имеет ни входных, ни выходных данных.
|
ena_spi
| Данная процедура формирует SCK=0 перед установкой SS в активное состояние. Данная процедура не имеет ни входных, ни выходных данных.
|
disa_spi:
| Данная процедура устанавливает SS=1 (неактивное состояние). Вызывается после завершения передачи последовательности для предотвращения сбоев в работе связи. Также не имеет ни входных, ни выходных данных.
|
rw_spi:
| Данная процедура отправляет/принимает 8- или 16-разрядное слово данных в зависимости от изменения пользователем настроек в тексте программы. Она оставляет SCK=0 при выходе и не изменяет сигнал SS. Поэтому, при передаче посылок, состоящих из нескольких слов, допускается неоднократно вызвать эту процедура. Входные требования- данные для передачи spi_lo (и spi_hi в 16-разрядном формате) этой процедурой. При выходе из процедуры в этих же регистрах хранятся данные, принятые из подчиненного SPI-порта.
|