AVR320
Программный интерфейс SPI в режиме мастера
Отличительные особенности:
- Производительность до 444 кбайт/сек. при тактовой частоте 10 МГц
- Прямая поддержка записей больших блоков
- Легко расширяется для нескольких подчиненных SPI-интерфейсов
- Работает в режиме 0 SPI-интерфейса
- 16-разрядные данные, легко преобразуемые к 8-разрядному формату
- Не требует использования прерываний
- Малое число задействованных регистров: всего необходимо три регистра (два в 8-разрядном режиме)
- Малый размер кода: 35 слов, в т.ч. инициализация
- Поддержка последовательных ЭСППЗУ AT25xxx производства Atmel
Введение
Стандарт синхронного периферийного интерфейса (SPI) наращивает свою популярность за счет возможности организации более быстродействующей связи по сравнению с двухпроводными интерфейсами, а также за счет использования меньшего числа элементов для реализации на кристалле полупроводника. Хотя многие мощные представители семейства AVR содержат полнофункциональный интерфейс SPI, в недорогие версии он не входит. В связи с этим, в данном документе описывается набор процедур, написанных на языке низкого уровня, реализующих программно протокол SPI в режиме мастера (связь под управлением AVR-микроконтроллера). Данная разработка может использоваться для организации доступа к последовательной памяти ЭСППЗУ семейства 25XXX производства Atmel, а также для связи с другими починенными интегральными схемами, например, с драйверами индикатора.
Рисунок 1 – Пример подключения к AVR-микроконтроллера подчиненного устройства (последовательное ЭСППЗУ)
Рисунок 2 – Временная диаграмма интерфейса SPI
Принцип действия SPI в режиме 0 подразумевает выполнение следующих условий:
- SCK = 0 в режиме холостого хода (Idle).
- Выход данных MOSI (из AVR) должен быть стабильным в течение определенного промежутка времени (tSETUP) перед нарастающим фронтом тактового сигнала SCK.
- Выход данных MISO (из подчиненного устройства) действительный после некоторого времени (tVALID) после падающего фронта тактового сигнала SCK.
- Первым всегда передается старший бит (MSB).
Рассматриваемые ниже процедуры написаны с учетом выполнения этих требований, а также особое внимание уделено граничным условиям, таким как tVALID и tSETUP. Данные временные параметры рассмотрены ниже.
Рисунок 3 – Блок-схема интерфейса SPI в режиме мастера
Описание подпрограмм
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-порта. |
Преобразование к 8-разрядному формату
При необходимости использования 8-разрядного формата передаваемых слов требуется изменить всего 2 строки программы. Оба изменения касаются процедуры rw_spi. Первое – начальное значение счетчика бит необходимо изменить с 16 на 8, второе – строку “rol spi_hi” необходимо отделить в комментарий. Следует отметить, что в этом случае регистр spi_hi не нужен и в дальнейшем этой программой не используется и может быть задействован для других нужд.
Для повышения читабельности в код программы включены макросы. Принято, что линии порта В используются в качестве интерфейса SPI. Если используется другой порт, то в макросе в наименовании служебных регистров необходимо указать используемый порт. Используемые линии для 4 сигналов SPI-порта перечислены в разделе “PORT DEFINITIONS” как значения EQU и могут быть легко изменены.
Макрокоманда функции задержки требует дополнительного разъяснения. Для исключения необходимости применения дополнительных регистров данная процедура определяет второе назначение регистра TEMP, хранящего значение 5-разрядного счетчика, - измерение длительности SCK с высоким и низким уровнями. Последние данные хранятся в старших разрядах. За счет простого увеличения старших трех разрядов и определения переполнения можно задавать временные интервалы, не влияя на младшие 5 разрядов. Обратите внимание, что фактически выполняется операция вычитания вместо сложения. Конечный результат тот же, за исключением того, что флаг переноса C сброшен (чаще всего он установлен), когда значение старших трех бит изменяется из 7 в 0.
Рисунок 4 – Временная диаграмма установки и удержания данных
Задержка от обновления MOSI до нарастающего фронта SCK
Период задержки от обновления MOSI до нарастающего фронта SCK – критичный параметр, т.к. фактически это время установления данных (tSETUP) для подключенного периферийного устройства. В данной процедуре длительность времени установки – 2 цикла при изменении MOSI к низкому уровню и 3 цикла при изменении к высокому уровню. При тактовой частоте 10 МГц это время составляет 200-300 нс. Если требуются более длительные временные интервалы необходимо добавить NOPы непосредственно перед макрокомандой sck_hi.
Коэффициент заполнения импульса SCK
Выход SCK большинство времени цикла генерации сообщения находится в низком состоянии за счет пауз на установление уровней, при которых этот выход имеет низкий уровень. Для связи с периферийным устройством, способного работать на более высокой скорости, длительность верхнего уровня (tHILO) может быть уменьшена в соответствии с требованиями по минимальной длительности высокого уровня SCK.
При установке единичного значения на выполнение процедуры затрачивается приблизительно 22.5 цикла на каждый бит данных, а на генерацию высокого уровня SCK – ровно 4 цикла. При тактовой частоте микроконтроллера 10 МГц этим значениям соответствуют длительность высокого уровня SCK 400 нс и общая скорость связи до 444 кбайт/сек.
Длительность нахождения в низком состоянии определяется требованием периферийного устройства к параметру “Длительность подготовки данных на MISO после падающего фронта SCK“ (задержка на вывод данных подчиненным устройством) (tVALID). Если значение этой задержки установить равное 1, то в процедуре перед защелкиванием данных на MISO будет выполнено три такта задержки. По аналогии тактовой частоте 10 МГц соответствует период 300 нс, который может быть изменен для увеличения длительности задержки.
Документация:
|
|
3 Kb Пример программы |
|
|
76 Kb Engl Исходный фаил |
оказание юридических услуг
|