ADSP-BF70x SPI Печать
Добавил(а) microsin   

Здесь приведен перевод описания интерфейса SPI из даташитов [1, 2].

[29. Serial Peripheral Interface (SPI)]

Последовательный периферийный интерфейса (serial peripheral interface, SPI) является стандартным промышленным каналом связи, поддерживающим обмен данными с многими SPI-совместимыми устройствами. Базовое периферийное устройство SPI является синхронным, 4-проводным интерфейсом с 2 выводами для передачи данных (вход и выход), 1 вывод выбора устройства, и еще 1 вывод для управляемых тактов бит данных. 2 вывода данных позволяют осуществить полно-дуплексное функционирование по передаче при обмене с другими SPI-совместимыми устройствами. Два дополнительных (опциональных вывода данных) предоставлены для специальных SPI для поддержки работы quad SPI. Также поддерживаются такие расширенные режимы, как flow control (управление потоком данных), fast mode (быстрый режим), режим двойного ввода/вывода (dual-I/O mode, DIOM). Дополнительно прямой доступ к памяти позволяет передавать несколько слов данных с минимальным взаимодействием с процессором. С конфигурируемыми опциями порты предоставляют прозрачное аппаратное соединение с другими SPI-совместимыми устройствами в режиме главного устройства (master mode), подчиненного устройства (slave mode), и в режиме с несколькими мастерами (multimaster). Периферийное устройство SPI включает программируемую скорость обмена, подстройку фазы и полярности тактов. Периферийное устройство может работать в окружении multimaster, работая с несколькими другими устройствами, действуя либо как устройство master, либо как устройство slave. В окружении multimaster, периферийное устройство SPI использует выходы с открытым стоком, чтобы избежать конфликтов нескольких выходов на шине, соединенных параллельно. Функция flow control разрешает медленным устройствам работать с быстрыми master-устройствами, предоставляя вывод SPI ready, который гибко управляет передачами.

[Возможности SPI]

Модуль SPI поддерживает следующие функции:

• Полнодуплексный, синхронный последовательный интерфейс.
• Размер слова может быть 8, 16 и 32 бита.
• Программируемые скорость бит (baud rate), фаза тактов и полярность тактов.
• Программируемая задержка внутри фрейма.
• Управление потоком (Flow control).
• Поддержка специальных режимов Fast и DIOM.
• Режимы Quad (счетверенный) и memory-mapped (отображение на память), поддерживаемые только SPI2.
• Независимые каналы DMA приема и передачи.
• Пакетный режим передачи (Burst transfer mode) для доступов записи не DMA.

[Функциональное описание SPI]

Регистр сдвига. В сущности SPI это сдвиговый регистр, который последовательно передает биты данных в другие устройства SPI и принимает из них биты данных. Во время обмена SPI данные одновременно передаются (последовательно выдвигаются) и принимаются (последовательно вдвигаются). Сигнал тактов последовательных данных синхронизирует сдвиг и оцифровку сигнала на двух линях передачи данных (выход и вход).

Функционал главного (master) и подчиненного (slave) устройства. Во время передачи данных одна система SPI действует как master канала связи, который управляет потоком данных. Другая система действует как slave, которая вдвигает и выдвигает данные по тактам системы master. Разные устройства могут брать на себя роль master, однако в любой момент на шине должно быть только одно устройство master, которое может одновременно вдвигать данные в несколько подчиненных устройств (режим широковещания, broadcast). Также только одно устройство slave в любой момент времени может управлять выходом, подавая данные для устройства master. Это правило должно быть применено в режиме broadcast. Несколько slave-устройств могут быть выбраны для приема данных в этом режиме, но только одному slave разрешено отправлять данные обратно устройству master.

Расширенные рабочие режимы. SPI поддерживает дополнительно такие режимы, как fast mode, DIOM и Quad-SPI. Также опционально поддерживается управление потоком со стороны slave-устройства. В режиме fast принятые данные анализируются на перепаде такта передачи вместо стандартного перепада приема (в стандартном режиме перепад такта приема противоположен перепаду передачи), что позволяет осуществить для приема full-cycle path (насколько я понял, можно принимать данные по обоим перепадам тактов). В режиме DIOM, оба сигнала MOSI и MISO конфигурируются как входы или как выходы, и 2 бита вдвигаются или выдвигаются на каждом перепаде приема или передачи. В режиме Quad-SPI все выводы SPI_D3:0 конфигурируются как вход или как выход, и 4 бита вдвигаются или выдвигаются на каждом перепаде приема или передачи. Более медленное slave-устройство может управлять потоком, приостанавливая слишком быстрое master-устройство, с помощью специального сигнала готовности (SPI0_RDY).

Использование одного и нескольких устройств master. SPI можно использовать в рабочем окружении, где имеется как 1 master, так и несколько устройств master (условия работы multi-master). Сигналы SPI_MOSI, SPI_MISO и SPI_CLK соединяются у всех устройств параллельно в любой из конфигураций. Передача и прием SPI может быть разрешена одновременно или индивидуально, в зависимости от настроек регистров SPI_RXCTL и SPI_TXCTL. В режиме широковещания (broadcast), нескольким устройствам slaves может быть разрешен прием, но только одно slave-устройство должно находиться в режиме передаче, управляя своей линией SPI_MISO.

[Список SPI-регистров ADSP-BF70x]

Таблица 29-1. Регистры SPI ADSP-BF70x.

Имя регистра Описание
SPI_CLK Clock Rate Register (регистр управления частой переключения тактов)
SPI_CTL Control Register (регистр управления)
SPI_DLY Delay Register (регистр задержки)
SPI_ILAT Masked Interrupt Condition Register (регистр маскирования событий прерывания)
SPI_ILAT_CLR Masked Interrupt Clear Register (регистр маскирования очистки прерываний)
SPI_IMSK Interrupt Mask Register (регистр маски прерываний)
SPI_IMSK_CLR Interrupt Mask Clear Register (регистр маски очистки прерываний)
SPI_IMSK_SET Interrupt Mask Set Register (регистр маски установки прерываний)
SPI_MMRDH Memory Mapped Read Header (заголовок привязанного к памяти чтения)
SPI_MMTOP SPI Memory Top Address (верхний адрес памяти SPI)
SPI_RFIFO Receive FIFO Data Register (регистр FIFO данных приема)
SPI_RWC Received Word Count Register (регистр счетчика принятых слов)
SPI_RWCR Received Word Count Reload Register (регистр перезагрузки счетчика принятых слов)
SPI_RXCTL Receive Control Register (регистр управления приемом)
SPI_SLVSEL Slave Select Register (регистр выборки подчиненного устройства)
SPI_STAT Status Register (регистр состояния)
SPI_TFIFO Transmit FIFO Data Register (регистр FIFO данных передачи)
SPI_TWC Transmitted Word Count Register (регистр счетчика передаваемых слов)
SPI_TWCR Transmitted Word Count Reload Register (регистр перезагрузки счетчика переданных слов)
SPI_TXCTL Transmit Control Register (регистр управления передачей)

Таблица 29-2. Список прерываний SPI ADSP-BF70x.

Interrupt ID Имя Описание Чувств. Канал DMA
36 SPI0_ERR SPI0 Error (ошибка SPI0) уровень  
37 SPI0_STAT SPI0 Status (состояние SPI0) уровень  
38 SPI0_TXDMA SPI0 TX DMA Channel (канал передачи DMA SPI0) уровень 4
39 SPI0_RXDMA SPI0 RX DMA Channel (канал приема DMA SPI0) уровень 5
40 SPI1_ERR SPI1 Error (ошибка SPI1) уровень  
41 SPI1_STAT SPI1 Status (состояние SPI1) уровень  
42 SPI1_TXDMA SPI1 TX DMA Channel (канал передачи DMA SPI1) уровень 6
43 SPI1_RXDMA SPI1 RX DMA Channel (канал приема DMA SPI1) уровень 7
44 SPI2_ERR SPI2 Error (ошибка SPI2) уровень  
45 SPI2_STAT SPI2 Status (состояние SPI2) уровень  
46 SPI2_TXDMA SPI1 TX DMA Channel (канал передачи DMA SPI1) уровень 8
47 SPI2_RXDMA SPI1 RX DMA Channel (канал приема DMA SPI1) уровень 9

Таблица 29-3. Список триггеров ADSP-BF70x SPI master-устройств.

Trigger ID Имя Описание Чувств.
18 SPI0_TXDMA Канал DMA передачи SPI0 перепад
19 SPI0_RXDMA Канал DMA приема SPI0 перепад
20 SPI1_TXDMA Канал DMA передачи SPI1 перепад
21 SPI1_RXDMA Канал DMA приема SPI1 перепад
22 SPI2_TXDMA Канал DMA передачи SPI2 перепад
23 SPI2_RXDMA Канал DMA приема SPI2 перепад

Таблица 29-4. Список триггеров ADSP-BF70x SPI slave-устройств.

Trigger ID Имя Описание Чувств.
28 SPI0_TXDMA Канал DMA передачи SPI0 импульс
29 SPI0_RXDMA Канал DMA приема SPI0 импульс
30 SPI1_TXDMA Канал DMA передачи SPI1 импульс
31 SPI1_RXDMA Канал DMA приема SPI1 импульс
32 SPI2_TXDMA Канал DMA передачи SPI2 импульс
33 SPI2_RXDMA Канал DMA приема SPI2 импульс

Таблица 29-5. Список каналов DMA интерфейса SPI процессора ADSP-BF70x.

DMA ID Имя Описание
DMA4 SPI0_TXDMA Канал DMA передачи SPI0
DMA5 SPI0_RXDMA Канал DMA приема SPI0
DMA6 SPI1_TXDMA Канал DMA передачи SPI1
DMA7 SPI1_RXDMA Канал DMA приема SPI1
DMA8 SPI2_TXDMA Канал DMA передачи SPI2
DMA9 SPI2_RXDMA Канал DMA приема SPI2

[Блок-схема SPI]

Блок-схема контроллера SPI показывает отдельные блоки модуля SPI. Модуль включает в себя 3 основные части:

• Ядро SPI, содержащее регистры данных FIFO приема и передачи, и связанные с ними регистры сдвига.
• Блоки управления, содержащие синхронизатор и логику для управления потоком данных через конвейеры.
• Блок регистров.

ADSP BF70x SPI Controller Block Diagram Quad Mode fig29 1

Рис. 29-1. Блок-схема контроллера SPI, Quad Mode (счетверенный режим).

Протокол передачи. Модуль SPI реализует 2 канала, независимых друг от друга (почти) - канал приема и канал передачи. Выделенные регистры SPI_RXCTL и SPI_TXCTL раздельно управляют этими каналами. За исключением режимов dual и quad, SPI может разрешить одновременное использование этих обоих каналов для дуплексного обмена данными.

Протокол SPI поддерживает 4 разных комбинации работы последовательных тактов, определяющие их фазу и полярность по отношению к данным. Эти 4 комбинации выбираются битами SPI_CTL.CPOL and SPI_CTL.CPHA (подобные опции имеются практически любой микроконтроллер, имеющий на борту аппаратный интерфейс SPI).

Рисунки 29-2, 29-3 с описанием протокола переноса данных демонстрируют 2 базовых формата, определяемые битом CPHA (бит фазы тактов). Показаны 2 диаграммы сигналов для SPI_CLK, одна для SPI_CTL.CPOL=0, и другая для SPI_CTL.CPOL=1. Диаграммы могут быть интерпретированы как диаграммы master или slave, поскольку сигналы SPI_CLK, SPI_MISO и SPI_MOSI напрямую соединяют master и slave. Сигнал SPI_MISO является выходом для slave (по нему slave передает данные), и сигнал SPI_MOSI является выходом master (по нему master передает данные). Master генерирует сигнал SPI_CLK. Сигнал ~SPI_SS является выборкой подчиненного устройства, который управляется главным устройством (для slave это вход, для master это выход). Диаграммы представляют передачу 8-битного фрейма (SPI_CTL.SIZE=0), когда старший бит (MSB) передается первым (SPI_CTL.LSBF=0). Разрешена любая комбинация битов SPI_CTL.SIZE и SPI_CTL.LSBF. Например, 16-битная передача младшим битом (LSB) вперед является другой допустимой конфигурацией.

Полярность тактов и фаза тактов должны быть идентично настроены на стороне master-устройства и на стороне slave-устройства, вовлеченных в линк соединения. Формат передачи от master может быть изменен между передачами, чтобы удовлетворять требованиям разных slave-устройств.

Модуль SPI использует бит SPI_CTL.ASSEL чтобы определить, как управляется сигнал SPI_SEL[n] - аппаратно или программно. Когда SPI_CTL.ASSEL=1, сигнал выборки slave должен быть установлен в полярность, как это задано полем SPI_CTL.SELST между каждой последовательной передачей. Реальное поведение SPI_SEL[n] также зависит от параметров, программируемых в регистр SPI_DLY. Логика аппаратуры SPI автоматически управляет этим функционалом. Когда SPI_CTL.ASSEL=0, SPI_SEL[n] может либо оставаться активным между следующими друг за другом передачами, либо могут быть не активными. Программное обеспечение должно управлять этой активностью путем манипуляции содержимым регистра SPI_SLVSEL.

Пара рисунков с описанием протокола SPI показывает случай, когда SPI_CTL.ASSEL = 1, и сигнал SPI_SEL[n] неактивен между фреймами. Если ASSEL = 0, то линияthe SPI_SEL[n] может оставаться активной между фреймами; однако управляется только первый бит, когда происходит активный перепад SPI_CLK.

ADSP BF70x SPI Transfer Protocol CPHA0 fig29 2

Рис. 29-2. Протокол передачи SPI для CPHA=0.

ADSP BF70x SPI Transfer Protocol CPHA1 fig29 3

Рис. 29-3. Протокол передачи SPI для CPHA=1.

Тактирование. Сигнал SPI_CLK это управляемые такты, которые активны только во время передач данных, когда происходит перемещение слова данных. В обычном режиме (normal mode) количество активных перепадов равно количеству бит, которые передаются или принимаются. В режиме двойного ввода/вывода (dual-I/O mode) половина количества тактов формируется во время передачи или приема, и в счетверенном режиме (quad-SPI mode) одна четвертая. Частота тактов может такой же, как и частота SCLK0, и поддерживаются оба делителя SCLK0 - четный и нечетный.

Для устройств master SPI использует значение регистра SPI_CLK для определения частоты тактов, в то время как это значение игнорируется для slave-устройств.

Когда контроллер работает как master, сигнал SPI_CLK является выходом. Соответственно, когда контроллер SPI обслуживает slave-устройство, SPI_CLK является входным сигналом. Slave-устройства игнорируют такт SPI, когда их вход выборки (slave select) переведен в неактивное состояние. SPI использует сигнал SPI_CLK для выдвигания наружу и вдвигания внутрь данных, появляющихся на сигналах SPI_MISO и SPI_MOSI. Данные всегда выдвигаются по одному из перепадов тактов (так называемый активный перепад), и анализируются на противоположном перепаде тактов (так называемый перепад выборки, sampling edge). Полярность тактов и фаза тактов относительно данных программируется через регистр SPI_CTL, и это определяет формат передаваемого фрейма.

Управление задержками между фреймами. Диаграмма SPI программируется задержками Lead и Lag (независимые от SPI_CTL.CPHA установки бит SPI_DLY.LEADX and SPI_DLY.LAGX). На рисунке показаны диаграммы SPI с этими интервалами. SPI использует биты SPI_DLY.LAGX для управлением интервалом между активацией сигнала slave select (~SPI_SS) и первым перепадом SPI_CLK. Также SPI использует бит SPI_DLY.LEADX для управления интервалом между последним перепадом SPI_CLK и деактивацией сигнала ~SPI_SS.

Интервалы lead и lag могут быть расширены на длительность 1 SPI_CLK для упрощения реализации с учетом ограничений по времени со стороны slave-устройства.

ADSP BF70x SPI Timing Lead and Lag Programming fig29 4

Рис. 29-4. Программируемые интервалы Lead и Lag (независимые от установки SPI_CTL.CPHA).

Рис. 29-5 показывает интервалы при программировании SPI_DLY.STOP (независимо от настройки SPI_CTL.CPHA). Модуль SPI использует этот интервал для вставки нескольких задержек периода SPI_CLK между передачами. Сигнал ~SPI_SS деактивируется на длительность, указанную битовым полем SPI_DLY.STOP, при этом подразумевается, что бит SPI_CTL.SELST конфигурируется для деактивации выборки между передачами.

Если SPI_DLY.STOP bit=0, то master работает непрерывно (continuous mode). Этот режим приводит к немедленному старту передачи второго слова после того, как передано последнее слово после завершающего бита первого слова. Во время работы этого режима сигнал slave select активен постоянно.

ADSP BF70x SPI Timing SPI DLY STOP Programming fig29 5

Рис. 29-5. Интервалы SPI с программированием SPI_DLY.STOP (независимые от установки SPI_CTL.CPHA).

Когда SPI_DLY.STOP bit=0, и начальные условия передачи не выполняются, интерфейс переходит на паузу перед следующей передачей. Во время этой паузы SPI использует бит SPI_CTL.SELST, чтобы определить состояние вывода slave select. SPI использует биты SPI_DLY.LEADX и SPI_DLY.LAGX, чтобы определить интервал между перепадами SPI_CLK и сигналом выборки slave select.

Управление потоком (Flow Control). В режиме master устройство slave должно управлять выводом SPI_RDY. Этот вывод у master работает как вход. Slave-устройство деактивировать сигнал SPI_RDY, чтобы остановить master-устройство для инициации любой новой передачи. Если SPI_RDY деактивирован посередине передачи, то текущая передача продолжается, и следующая передача не начинается, пока slave не активирует сигнал SPI_RDY. Всякий раз, когда slave деактивирует SPI_RDY и приостанавливает master-устройство, контроллер SPI master переходит в состояние ожидания, и устанавливается бит SPI_STAT.FCS. Когда slave активирует SPI_RDY, контроллер SPI master возобновляет функционирование, и бит SPI_STAT.FCS очищается.

В режиме slave вывод SPI_RDY работает как выходной сигнал. Управление потоком может быть сконфигурировано либо по каналу TX, либо RX. SPI использует бит SPI_CTL.FCCH для управления этой конфигурацией. Если управление потоком сконфигурировано для канала TX, то как только статус SPI_TFIFO приближается к событию опустошения (empty condition), сигнал SPI_RDY деактивируется. Если управление потоком конфигурируется по каналу RX, то как только статус SPI_RFIFO приближается к событию заполнения (full condition), сигнал SPI_RDY деактивируется. SPI использует биты SPI_CTL.FCWM для управления состоянием FIFO с участием сигнала деактивации SPI_RDY. Управление потоком в режиме slave полностью основано на состоянии FIFO, и не зависит от счетчиков слов. Рисунок управления потоком master-устройства SPI Flow иллюстрирует эти интервалы времени.

ADSP BF70x SPI Flow Control Timing Master Mode fig29 6

Рис. 29-6. Управление потоком SPI в режиме master.

Работа выборки подчиненного устройства (Slave Select). Если SPI работает в slave mode сигнал ~SPI_SS действует как вход выборки подчиненного устройства (slave select). Когда SPI разрешен как master, ~SPI_SS может обслуживать функцию входа детектирования ошибки в условиях функционирования multi-master. Бит SPI_CTL.PSSE разрешает эту функцию. Когда SPI_CTL.PSSE=1, вход ~SPI_SS работает как вход ошибки режима master. Иначе ~SPI_SS игнорируется.

Сигнал ~SPI_SS имеет активный уровень лог. 0. Master активирует этот сигнал во время передачи. Сигнал выборки может быть снят или оставаться активным между передачами. Когда ~SPI_SS деактивирован, SPI_CLK и входы игнорируются, выходы находятся в третьем состоянии.

Биты выборки (SPI_SLVSEL.SSE1 .. SPI_SLVSEL.SSEL7) используются в условиях с несколькими подчиненными устройствами. Например, если имеется 8 устройств SPI в системе, включая master, то процессор master может поддерживать транзакции режима SPI со всеми семью устройствами. Эти конфигурации требуют только одного процессора master.

Для примера предположим, что процессор SPI работает в режиме master. Биты SPI_SLVSEL.SSE1 .. SPI_SLVSEL.SSEL7 процессора могут быть соединены с выводами выборки slave select каждого slave-устройства. В этой конфигурации, биты slave select могут использоваться тремя способами. В вариантах 1 и 2, процессор является master-устройством, и 7 микроконтроллеров или периферийных устройств с SPI-интерфейсами являются slave-устройствами. Процессор может сделать одно из следующего:

1. Передача для всех 7 подчиненных устройств SPI одновременно в режиме broadcast. Здесь активированы все биты slave select.
2. Прием и передача с взаимодействием только с одним slave-устройством в любой момент времени.
3. Если все slave-устройства также являются процессорами, то запрашивающий может в любой момент времени принимать данные только от одного процессора (эта функциональность разрешается очисткой бита SPI_CTL.EMISO в шести других slave-процессорах). Запрашивающий может широковещательно рассылать данные на все устройства одновременно. Функция EMISO может быть доступна в некоторых других микроконтроллерах. Таким образом, появляется возможность применять функцию EMISO с любым другим устройством SPI, которое имеет такую функциональность.

ADSP BF70x SPI Single Master Multiple Slave fig29 7

Рис. 29-7. Конфигурация один master, несколько slave.

Начало и завершение переноса данных SPI без DMA. Старт и финиш non-DMA SPI зависит от следующих установок:

1. Как сконфигурировано устройство - как master или как slave.
2. Состояние бита SPI_CTL.ASSEL, который выбирает между аппаратным и программным управлением SPI_SLVSEL.

Когда SPI_CTL.CPHA=0, разрешается переводить в активное состояние выходы slave select. Однако сигнал SPI_CLK остается неактивным для первой половины цикла SPI_CLK. Для slave-устройства с SPI_CTL.CPHA=0 передача запускается как только ~SPI_SS переходит в лог. 0.

Когда SPI_CTL.CPHA=1, передача стартует с первым положительным перепадом SPI_CLK для обоих устройств - slave и master. Для master-устройства передача завершается завершается после того, как он отправит последние данные и одновременно примет последний бит данных. Передача для slave-устройства заканчивается после последнего перепада выборки (sampling edge) сигнала SPI_CLK. Если SPI_CTL.ASSEL=0, аппаратура сохраняет функцию переключения ~SPI_SS между фреймами. Если SPI_CTL.ASSEL=1, программа управляет сигналом ~SPI_SS, то можно удерживать этот сигнал активным между фреймами.

Бит SPI_STAT.RFE определяет, когда буфер приема может быть прочитан, показывая, что SPI_RFIFO не пуст. Бит SPI_STAT.TFF определяет, когда буфер передачи можно записать, показывая, что SPI_TFIFO не заполнен. Окончание передачи одного слова происходит, когда очищается бит SPI_STAT.RFE. Статус показывает, что новое слово может быть принято и записано в FIFO приема. Бит SPI_STAT.RFE остается очищенным, пока в FIFO приема имеются допустимые данные.

Чтобы сохранить программную совместимость с другими устройствами SPI, бит SPI_STAT.SPIF также доступен для опроса. Этот бит может слегка отличаться поведением от других доступных коммерческих устройств.

В режиме master с очищенным битом SPI_CTL.ASSEL программа вручную устанавливает требуемый сигнал slave select перед запуском транзакции. После передачи всех данных программное обеспечение обычно деактивирует сигнал slave select.

Когда разрешены счетчики принимаемых или передаваемых слов в регистрах SPI_TXCTL или SPI_RXCTL, SPI генерирует прерывание финиша по окончанию передачи. Это подает сигнал об окончании всех передач, связанный с этой транзакцией.

Работа передачи без DMA. Работа передачи в не-DMA режиме разрешается через бит SPI_TXCTL.TEN. Это может быть разрешено независимо от операции приема, и канал передачи может стать инициирующим каналом на основе установки бита SPI_TXCTL.TTI.

Недогрузка передачи (underrun) в этом режиме невозможна, поскольку нет инициации новой передачи, пока буфер передачи FIFO не пуст (в случае SPI_TXCTL.TTI=1). Переполнение (overflow) приема определяется, когда данные из нового фрейма заменяют предыдущие данные в заполненном FIFO приема. Это событие может произойти, если SPI_TXCTL.TTI=1, и разрешен канал приема в режиме не инициирования.

Прерывание SPI сработает, как только канал передачи разрешен и буфер FIFO передачи не полон. SPI использует установку бита SPI_TXCTL.TDR для управления частотой прерывания.

Работа приема без DMA. Прием в режиме без DMA разрешается через бит SPI_RXCTL.REN. Это может быть разрешено независимо от работы приема, и канал приема становится инициирующим на базе установки бита SPI_RXCTL.RTI.

Переполнение приема в этом режиме невозможно, поскольку новая передача не начнется, пока буфер FIFO приема заполнен (в случае SPI_RXCTL.RTI=1). Недогрузка передачи (transmit underrun) может произойти (бит SPI_TXCTL.TDU), когда нет допустимых данных в регистре SPI_TFIFO, когда инициирована передача. Такое событие может произойти, если SPI_RXCTL.RTI=1, и разрешен канал передачи с не инициированным источником данных.

Прерывание приема SPI сработает, как только разрешен канал приема и данные ожидают чтения. SPI использует установку бита SPI_RXCTL.RDR для управления частотой прерывания.

В режиме dual I/O выводы SPI_MISO и SPI_MOSI конфигурируются для работы в одном направлении, с удвоенной полосой. SPI использует бит SPI_CTL.SOSI для того, чтобы определить порядок следования бит на выводах. Когда бит SPI_CTL.SOSI установлен, процессор посылает первый бит на выводе SPI_MOSI, и второй бит на выводе SPI_MISO. Если бит SPI_CTL.SOSI очищен, порядок следования бит становится обратным. Поскольку dual I/O mode использует оба вывода сразу для передачи или приема данных, то разрешен только один канал (либо только прием, либо только передача), Управление потоком через вывод SPI_RDY поддерживается. На генерацию прерываний режим dual I/O не влияет, однако промежуток времени между следующими друг за другом прерываниями уменьшается, поскольку время передачи фрейма уменьшается в 2 раза.

ADSP BF70x Dual IO Mode Transfer CPHA0 SOSI1 8 bit LSBF0 fig29 8

Рис. 29-8. Протокол передачи Dual I/O Mode для CPHA=0, SOSI=1, фрейм 8 бит, LSBF=0.

ADSP BF70x Dual IO Mode Transfer CPHA1 SOSI0 8 bit LSBF0 fig29 9

Рис. 29-9.Протокол передачи Dual I/O Mode для CPHA=1, SOSI=0, фрейм 8 бит, LSBF=0.

В режиме SPI выводы SPI_MISO и SPI_MOSI вместе с дополнительными выводами SPI_D2 и SPI_D3 сконфигурированы для работы в одном направлении. SPI использует бит SPI_CTL.SOSI для того, чтобы определить порядок появления бит на выводах. Когда бит SPI_CTL.SOSI установлен, то процессор передает:

• Первый бит появляется на выводе SPI_MOSI.
• Второй бит появляется на выводе SPI_MISO.
• Третий бит появляется на выводе SPI_D2.
• Четвертый бит появляется на выводе SPI_D3.

Когда бит SPI_CTL.SOSI очищен, порядок меняется на обратный. Поскольку quad SPI использует все 4 вывода для передачи или приема данных, только один канал может быть разрешен - либо передача, либо прием. Поддерживается управление потоком выводом SPI_RDY. На генерацию прерывания режим quad SPI не влияет.

Переход к режиму quad SPI должен быть осуществлен, когда SPI находится в режиме "молчания".

ADSP BF70x Quad Mode Timing CPHA0 SOSI1 16 bit LSBF0 fig29 10

Рис. 29-10. Диаграммы времени Quad Mode для CPHA=0, SOSI=1, 16-битная передача, LSBF=0.

Примечание: SPI не поддерживает quad SPI 8-битную передачу в режиме continuous устройства slave, с соотношением тактовых частот SCLK:SPI_CLK меньше 1:2. Минимум 2 цикла 2 SCLK требуется между передачами в 8-битном quad SPI slave mode, с соотношением SCLK:SPI_CLK меньше 1:2.

Когда используется сдвоенный (dual) или счетверенный (quad) режим I/O для обмена с устройствами flash, биты SPI_CTL.CPHA и SPI_CTL.CPOL=1. Это программирование избегает конфликта на шине во время операций чтения, потому что устройство flash начинает передавать биты немедленно после пустых циклов в заголовке чтения.

Быстрый режим (fast mode) подобен обычному режиму (normal mode) работы при передаче. Когда идет прием, данные анализируются по следующему перепаду передачи, позволяя полный цикл диаграммы времени в направлении приема. Этот режим допустим только для устройства master. Когда SPI работает в fast mode, устройство slave выдает данные для одного полного такта.

ADSP BF70x SPI Transfer Protocol Fast Mode SPI CTL CPHA0 fig29 11

Рис. 29-11. Протокол SPI в Fast Mode для SPI_CTL.CPHA=0.

ADSP BF70x SPI Transfer Protocol Fast Mode SPI CTL CPHA1 fig29 12

Рис. 29-12. Протокол SPI в Fast Mode для SPI_CTL.CPHA=1.

В этом режиме осуществляются прямые, отображенные на память доступы чтения из устройства памяти SPI, что разрешается установкой бита SPI_CTL.MMSE. Этот режим позволяет прямое выполнение инструкций из памяти SPI без необходимости низкоуровневого программного драйвера, так как аппаратура берет на себя всю нагрузку по этой задаче (т. е. передача заголовка чтения, обработка переключения выводов и прием размеров данных). SPI представляет конфигурируемые опции в регистре заголовка привязки к памяти (memory-mapped read header register, SPI_MMRDH), чтобы обеспечить совместимость с широким диапазоном устройств памяти SPI.

В режиме без отображения на память (non-memory-mapped mode) программа отвечает за предоставление команды и требуемых пустых слов для ответа чтения (read response), в то время как все это обрабатывается аппаратно, когда SPI работает в memory-mapped mode. Память устройства SPI доступна напрямую через чтение процессором заданного адресного пространства. Доступы на чтение могут быть к коду или к данным в режиме ядра или с использованием DMA по памяти (memory DMA, MDMA). Этот доступ позволяет запускать код напрямую из устройств памяти SPI (реальные операции eXecute-In-Place, т. е. выполнение прямо по месту), и содержимое этой памяти SPI может быть кэшировано для повышения быстродействия. Не требуется обращение ни к регистрам буфера данных SPI, ни опрос битов состояния SPI; однако аппаратура не поддерживает ни операции периферийного доступа DMA, ни операции записи в область памяти SPI.

Таблица типов операций 29-6 предоставляет сравнение разрешенных операций в режимах non-memory-mapped и memory-mapped, поддерживаемых контроллером SPI.

Таблица 29-6. Типы операций.

Операция SPI Non-Memory-Mapped Mode Memory-Mapped Mode
Core data write: запись данных ядром процессора. ДА нет
Core data read: чтение данных ядром процессора. ДА ДА
Code fetch: Execute-In-Place (XIP). Выполнение кода напрямую из памяти SPI. нет ДА
Доступы на чтение и запись с использованием SPI Peripheral DMA. ДА нет
Доступы на чтение и запись другими каналами периферии DMA. нет нет
MDMA read: чтение DMA по памяти. нет ДА
MDMA write: запись DMA по памяти. нет нет

[Описание работы Memory-Mapped SPI]

Режим привязки к адресному пространству памяти процессора (Memory-mapped mode) разрешается установкой бита SPI_CTL.MMSE. Когда это разрешено, SPI (если готов) принимает запросы чтения через выделенный встроенный в кристалл slave-интерфейс. Подсистема памяти master-устройства управляет этим выделенным интерфейсом через фабрику SCB.

В типовом сценарии подсистема памяти master-устройства читает запросы для фабрики, и фабрика перенаправляет эти запросы в slave-порт периферийного устройства SPI. Устройство master описывает доступ чтения с использованием некоторого количества параметров, таких как начальный адрес, размер передачи и типа пакета (burst type). SPI отвечает на этот запрос чтения, когда он готов к новой передаче. Он загружает код операции (opcode), указанное количество байт адреса и опционально байт режима в FIFO передачи. Машина состояний SPI начнет работу, когда разрешены оба канала, и передачи и приема SPI:

• установлен бит инициации передачи (SPI_TXCTL.TTI=1), и
• очищен бит инициации приема (SPI_RXCTL.RTI=0).

Последовательность чтения памяти SPI начинается с активации выборки SPI_SEL1. Если машина состояния памяти SPI находится в состоянии сброса, она ждет команды. Тогда аппаратура SPI посылает специальную 8-битную команду чтения (которая может быть опционально пропущена), за которой идет адрес чтения памяти SPI. После этого вставляется так называемый пустой период (dummy period) в котором опционально отправляется байт режима (mode byte), и выводы удерживаются в третьем состоянии на время тактирования пустого периода.

ЗАМЕЧАНИЕ: этот заголовок чтения передается через выводы стандартного протокола SPI (SPI_CLK, SPI_MOSI, SPI_MISO, SPI_SEL1) или через выводы расширенного протокола SPI (SPI_CLK, SPI_MOSI, SPI_MISO, SPI_D2, SPI_D3, SPI_SEL1), на основе настроек бит SPI_MMRDH.CMDPINS, SPI_MMRDH.ADRPINS и SPI_CTL.MIOM. Устройства памяти SPI обычно поддерживают обмен в режиме MSB-first (старший бит идет первым). В dual mode SPI обычно использует SPI_MISO как IO1, и SPI_MOSI как IO0. В quad mode SPI обычно использует SPI_D3 как IO3, SPI_D2 как IO2, SPI_MISO как IO1 и SPI_MOSI как IO0.

Когда все ножки I/O данных находятся в третьем состоянии, SPI продолжает тактировать устройство памяти SPI, которое выводи биты данных по адресованному месту, пока не будут приняты все байты. Аппаратура SPI читает данные так, как сконфигурировано настройкой бита SPI_CTL.MIOM. При приеме последнего байта SPI обычно деактивирует вывод SPI_SEL1, чтобы подготовить следующий запрошенный заголовок чтения.

Код приложения должен гарантировать, что отправленный opcode консистентен программированию множественного ввода/вывода, и что параметры, указанные в memory-mapped регистре заголовка чтения консистентны интервалам времени доступа чтения flash.

На рис. 29-13 показана диаграмма операций с регистром SPI Memory-Mapped, как поля в регистре SPI_MMRDH определяют заголовок чтения при инициации передач в режиме memory-mapped.

ADSP BF70x SPI Memory Mapped Register Operations Flow fig29 13

Рис. 29-13. Поток операций регистров режима SPI Memory-Mapped.

[Архитектурные концепции технологии Memory-Mapped]

В режиме memory-mapped SPI принимает запросы чтения через выделенный для этой цели встроенный в кристалл slave-интерфейс. SPI (если он готов) принимает эти запросы и начинает процесс сборки заголовка чтения, основываясь на атрибутах, описанных в регистре SPI_MMRDH и запросе по внутренней шине. После того, как завершится передача заголовка чтения, начинается период переключения направления интерфейса, и разрешается работа приемника. SPI продолжает тактировать устройство памяти SPI, пока не будут приняты от него все байты.

Аппаратура SPI memory-mapped подходит к различным устройствам памяти с разными параметрами интервалов времени. Возможности включают дополнительные биты режима, настраиваемый интервал пустого периода, управление третьим состоянием, как это сконфигурировано в регистре SPI_MMRDH.

На рис. 29-14 показан протокол Memory-Mapped для контроллера SPI, находящегося в этом режиме.

ADSP BF70x SPI Memory Mapped Protocol fig29 14

Рис. 29-14. Протокол Memory-Mapped интерфейса SPI.

Как показано на рисунке, поле команды COMMAND (SPI_MMRDH.OPCODE) передается при выставлении сигнала выборки SPI_SEL[n]. Память SPI интерпретирует это 8-битное значение как команду чтения. Разрешается любой 8-битный код операции (opcode), который по интервалам времени совместим с SPI процессора и рассчитан на предоставленную аппаратуру memory-mapped, чаще всего он будет:

• Standard Read, стандартное чтение (0x03)
• Fast Read, быстрое чтение (0x0B)
• Fast Read Dual Output, быстрое чтение с двойным выходом (0x3B)
• Fast Read Dual I/O, быстрое чтение с двойным вводом/выводом (0x6B)
• Fast Read Quad Output, быстрое чтение со счетверенным выходом (0xBB)
• Fast Read Quad I/O, быстрое чтение со счетверенным вводом/выводом (0xEB)
• Word Read Quad I/O, чтение слова со счетверенным вводом/выводом (0xE7)
• Octal Word Read Quad I/O, восьмеричное чтение слова со счетверенным вводом/выводом (0xE3)

ЗАМЕЧАНИЕ: аппаратура SPI не проверяет содержимое поля SPI_MMRDH.OPCODE перед передачей.

DMYSIZE (количество пустых байт). Когда идет работа на высокой тактовой частоте в режимах multi-IO, большинство устройств flash требуют некоторое количество пустых тактов после битов адреса. Эти пустые такты (dummy clock cycles) дают внутренним схемам устройства дополнительное время для установки начального адреса. Эти биты задают количество байт, отделяющих передачу адреса и возвращаемые данные чтения.

Требуемое количество dummy cycles меняется для разных производителей, используемой команды чтения и времени доступа SPI. Аппаратура SPI позволяет программировать dummy cycles в байтах с помощью поля SPI_MMRDH.DMYSIZE, значение которого является функцией количества выводов, используемых для передачи адреса (SPI_MMRDH.ADRPINS), как показано в таблице 29-7.

Таблица 29-7. Выводы, используемые для передачи адреса (ADRPINS).

  Пустые тактовые циклы
SPI_MMRDH.DMYSIZE (SPI_MMRDH.ADRPINS=0, SPI_CTL.MIOM=x) Dummy-байты, проходящие через 1 вывод (SPI_MMRDH.ADRPINS=1, SPI_CTL.MIOM=1) Dummy-байты, проходящие через 2 вывода (SPI_MMRDH.ADRPINS=1, MIOM=2) Dummy-байты, проходящие через 4 вывода
000 0 0 0
001 8 4 2
010 16 8 4
011 24 12 6
100 32 16 8
101 40 20 10
110 48 24 12
111 56 28 14

Этот период пустого тактирования позволяет передать биты режима, перейти выводам в третье состояние, и переключиться выводам к подготовке к приему данных.

[Memory-Mapped доступ чтения]

Аппаратура SPI поддерживает наиболее часто используемые операции чтения.

• 2 стандартных чтения SPI (чтение и быстрое чтение), которые используют однонаправленные выводы SPI_MOSI и SPI_MISO в дополнение к выводам SPI_SEL[n] и SPI_CLK.
• 4 расширенных чтения SPI с несколькими сигналами ввода/вывода (extended SPI multiple I/O reads): dual output, quad output, dual I/O и quad I/O.

Таблица операций чтения SPI 29-8 и рисунки 29-15 .. 29.19 показывают типы операций чтения. Программируйте каждую операцию чтения способом, который совместим с описанием в даташите имеющейся SPI flash.

Таблица 29-8. Операции чтения SPI.

Операция Команда чтения (opcode) CMDPIN ADRPIN DMYSIZE Третье состояние Multiple I/O Mode Выводы данных
Read 0x03 1 1 0 нет нет 1
Fast Read 0x0B 1 1 не 0 ДА нет 1
Dual Output Read 0x3B 1 1 не 0 ДА ДА (IO0-1) 2
Quad Output Read 0x6B 1 1 не 0 да ДА (IO0-3) 4
Dual Output Read 0xBB 1, 2 2 не 0 ДА ДА (IO0-1) 2
Quad Output Read 0xEB 1, 4 4 не 0 да ДА (IO0-3) 4

Некоторые устройства памяти также поддерживают операции слова quad I/O read (0xE7) и octal quad I/O read (0xE3). Эти операции требуют меньше тактов dummy, чем обычные счетверенные операции ввода/вывода чтения (normal quad I/O read).

ADSP BF70x SPI Flash Fast Read Sequence fig29 15

Рис. 29-15. Последовательность SPI Flash Fast Read.

M = 1, 2, 3, 4 (байты адреса)
N = 4, 8, 16, 32 (байты данных чтения)
Z = 0, 8, 16, 24, ..., 56 (циклы для переключения направления шины)
* = 1 бит данных на 1 периоде тактов пересылается через MISO

ADSP BF70x SPI Flash Fast Read Dual Output Sequence fig29 16

Рис. 29-16. Последовательность SPI Flash Fast Read (Dual Output).

M = 1, 2, 3, 4 (байты адреса)
N = 4, 8, 16, 32 (байты данных чтения)
Z = 0, 4, 12, ..., 28 (циклы для переключения направления шины)
* = 2 бита данных на 1 периоде тактов пересылается через выходы [1:0]

ADSP BF70x SPI Flash Fast Read Dual IO Sequence fig29 17

Рис. 29-17. Последовательность SPI Flash Fast Read (Dual I/O).

M = 1, 2, 3, 4 (байты адреса)
N = 4, 8, 16, 32 (байты данных чтения)
Z = 0, 4, 12, ..., 28 (циклы для переключения направления шины)
* = 2 бита данных на 1 периоде тактов пересылается через выходы [1:0]

ADSP BF70x SPI Flash Quad Output Read Sequence fig29 18

Рис. 29-18. Последовательность SPI Flash Quad Output Read.

M = 1, 2, 3, 4 (байты адреса)
N = 4, 8, 16, 32 (байты данных чтения)
Z = 0, 2, 4, ..., 14 (циклы для переключения направления шины)
* = 4 бита данных на 1 периоде тактов пересылается через выходы [3:0]

ADSP BF70x SPI Flash Quad IO Read Sequence fig29 19

Рис. 29-19. Последовательность SPI Flash Quad I/O Read.

M = 1, 2, 3, 4 (байты адреса)
N = 4, 8, 16, 32 (байты данных чтения)
Z = 0, 2, 4, ..., 14 (циклы для переключения направления шины)
* = 4 бита данных на 1 периоде тактов пересылается через выходы [3:0]

Чтения SPI memory-mapped могут быть сделаны кэшированными во внутренней памяти ядра путем правильного конфигурирования региона как кэшируемой памяти без пропуска (without bypass, подробности см. в документации по конфигурированию кэша). На рисунках количество байт данных чтения (N) основано на следующем:

• Для выборки инструкции ядром (когда работает режим XIP); количество байт инструкции зависит от размера строки кэша.
• Для выборки данных ядром (data read), количество байт данных выборки зависит от размера строки кэша.

Хотя минимальный размер переноса чтения данных memory-mapped составляет 4 байта, приложение может выбрать 1 байт или 2 байта данных (например, оно может выбрать unsigned char или short для доступа кода C). В этом случае для ядра предоставляются только требуемые байты, и другие байты кэшируются.

Встроенная в кристалл подсистема памяти master предоставляет начальный адрес для пакета (burst) и аппаратура SPI выдает этот адрес как часть заголовка чтения (read header). Предоставленный адрес выровнен по N байтам. Например, для чтения 30-го байта из памяти SPI типичный адрес предоставляется:

• 28 (0x0000_001C) для 32-битной строки кэша
• 24 (0x0000_0018) для 64-битной строки кэша
• 16 (0x0000_0010) для 128-битной строки кэша
• 0 (0x0000_0000) для 256-битной строки кэша

Данные чтения возвращаются в подсистему памяти в порядке, предоставленном памятью SPI. Здесь может быть учитываемая задержка для ожидаемых данных, предоставляемых для master.

• Для чтений MDMA количество читаемых байт данных (N) всегда равно 4 байтам. Чтение MDMA не зависит от установки кэша. Для чтений MDMA предел поля DMA_CFG.MSIZE 1, 2 или 4 байта. Адрес, предоставленный подсистемой памяти master для аппаратуры SPI, всегда выровнен на 4 байта.

[Функции высокого быстродействия чтения Memory-Mapped]

В дополнение к автоматизации доступов чтения памяти SPI, аппаратура memory-mapped также предоставляет некоторые функции для улучшения выборок из памяти SPI и повышения быстродействия системы. Эти функции рассматриваются в последующих секциях.

Execute-In-Place (XIP, только для SPI2). Технология Execute-In-Place, чаще известная как XIP, позволяет выполнить программный код прямо из устройства SPI flash вместо того, чтобы загрузить код и выполнить его из RAM. XIP, также известный как режим Command Skip, является общим понятием, и может быть применен также для выборки данных.

Есть различие между режимом XIP и стандартным режимом. В режиме XIP после выборки устройства памяти SPI (CS#=LOW), это устройство памяти не декодирует первый входной байт как код команды. Вместо этого оно ожидает, что read header непосредственно начнется с байтов адреса. В стандартном режиме память декодирует первый входной байт как код команды.

Режим XIP драматически снижает время произвольного доступа для приложений, которые требуют быстрого выполнения кода без затенения содержимого памяти в RAM. Аппаратура SPI memory-mapped предоставляет бит управления SPI_MMRDH.CMDSKIP для пропуска команды из read header.

Некоторые устройства памяти SPI требуют конфигурирования своего регистра управления для разрешения режима работы XIP, используя не memory-mapped режим процессора SPI. Обычно во время периода пустых циклов (dummy cycle period) биты режима используются для подтверждения операции XIP и поле SPI_MMRDH.MODE должно быть установлено соответствующим образом. Может понадобиться dummy memory mapped доступ перед установкой бита SPI_MMRDH.CMDSKIP, чтобы установить устройство памяти SPI в режим Command Skip.

Для получения дополнительной информации о том, как конфигурировать устройство памяти SPI в режим XIP, обратитесь к даташиту этого устройства.

[Биты статуса ошибки режима Memory-Mapped]

Аппаратура SPI memory-mapped предоставляет биты в регистре SPI_STAT для сообщения об ошибках. Эти биты предоставлены только для оповещения, и их состояние не влияет на операции SPI. Эти биты регистра состояния так называемые "липкие" (sticky), их очищает операция W1C (write-1-to-clear, записывается 1 для очистки).

• Memory-Mapped Write Error (SPI_STAT.MMWE). Этот бит устанавливается (=1), если сделана попытка записать в адресное пространство, зарезервированное для памяти memory-mapped SPI. Аппаратура SPI memory-mapped на поддерживает автоматизированный доступ записи в область памяти SPI.

• Memory-Mapped Read Error (SPI_STAT.MMRE). Этот бит устанавливается (=1), если сделана попытка чтения адресного пространства, зарезервированного для памяти memory-mapped SPI, когда отображение памяти запрещено (SPI_CTL.MMSE=0).

• Memory-Mapped Access Error (SPI_STAT.MMAE). Этот бит устанавливается (=1), если была сделана попытка доступа к либо TX, либо RX FIFO, когда разрешен доступ memory-mapped к памяти SPI. В этом случае блокируются попытки взаимодействия с устройством SPI через стандартные методы, и фабрика приема ответит ошибкой. Стандартные методы включают любые методы прямого доступа к буферам FIFO TX b RX FIFO, независимо откуда этот доступ произошел - от DMA или от MMR процессора.

• Memory-Mapped Write Error Mask (SPI_CTL.MMWEM). Этот бит указывает, был ли фабрике возвращен ответ ошибки на попытку записи в адресное пространство, зарезервированное для чтений memory-mapped памяти SPI. Независимо от того, был ли маскирован ответ ошибки записи с помощью этого бита, все равно установится sticky-бит оповещения ошибки записи memory-mapped (SPI_STAT.MMWE).

ЗАМЕЧАНИЕ: в отличие от других битов регистра SPI_STAT эти биты ошибки режима memory-mapped не имеют связанных бит в регистрах маски прерываний SPI (SPI_IMSK) и события прерывания SPI (SPI_ILAT).

Регистр верхней границы (memory-mapped top register, SPI_MMTOP) используется, чтобы задать верхний предел адреса памяти SPI. Memory-mapped доступ к памяти SPI по адресу, равному или большему указанного, считается недопустимым. Такой доступ блокируется и генерируется ответ ошибки шины.

Этот регистр полезен для блокировки доступа к недопустимым адресам памяти SPI. Некоторые производители памяти SPI не четко задают (без гарантии) превышение значения бит адреса, чтобы такой адрес игнорировался, так что есть опасность перескока доступа в начало памяти при превышении значения адреса.

[Руководство по программированию Memory-Mapped]

Установка бита SPI_CTL.MMSE разрешает режим SPI memory-mapped. Когда этот режим разрешен, интерфейс SPI переключается для соответствия с требованиями памяти SPI, независимо от установок определенных бит управления. В следующих таблицах показаны типичные настройки для конфигурирования SPI в режиме memory-mapped:

Таблица 29-9. Регистр SPI Control (регистр управления SPI_CTL).

Биты Типичные значения для установки Описание Комментарии
SPI_CTL.MSTR 1 Master mode enable (разрешение режима главного устройства)  
SPI_CTL.PSSE 0 Protected slave select enable (защищенное разрешение выборки подчиненного устройства)  
SPI_CTL.ODM 0 Open-drain mode enable (разрешение выходов с открытым стоком)  
SPI_CTL.CPHA, SPI_CTL.CPOL 00 или 11 Режим обмена SPI (формат фрейма) Зависит от микросхемы FLASH, обычно SPI flash поддерживает mode-0 (CPHA=CPOL=0) и mode-3 (CPHA=CPOL=1).
SPI_CTL.ASSEL 1 Аппаратное управление выборкой подчиненного устройства  
SPI_CTL.SELST 1 Поведение выборки между передачами  
SPI_CTL.EMISO 1 Разрешение вывода MISO  
SPI_CTL.SIZE 2 32-битный размер передачи  
SPI_CTL.LSBF 0 Режим, когда старший бит (MSB) идет первым Зависит от микросхемы, но обычно микросхема SPI ведет обмен, когда старший бит идет первым.
SPI_CTL.FCEN, SPI_CTL.FCCH, SPI_CTL.FCPL, SPI_CTL.FCWM 0 Биты, относящиеся к аппаратному управлению потоком (flow control)  
SPI_CTL.FMODE 1 FAST mode enable (разрешение быстрого режима) Обычно устанавливается в 1 для тайминга полного цикла, 0 только работает на низкой скорости.
SPI_CTL.SOSI 0 SPI_MOSI работает как вывод IO0.  

Таблица 29-10. Регистр SPI Receive Control (регистр управления приемом).

Биты Типичные значения для установки Описание
SPI_RXCTL.REN 1 Receive channel enable (разрешение канала приема)
SPI_RXCTL.RTI 0 Receive transfer initiation disable (запрет инициации передачи на канале приема)
SPI_RXCTL.RWCEN 0 Receive word counter disable (запрет счетчика слов приема)
SPI_RXCTL.RDR 0 Receive data request disable (запрет запроса данных приема)
SPI_RXCTL.RDO 0 Отбрасывать входные данные, если буфер RFIFO заполнен
SPI_RXCTL.RRWM 0 Receive FIFO regular watermark (обычная граница заполнения буфера FIFO приема)
SPI_RXCTL.RUWM 0 Receive FIFO urgent watermark disable (запрет срочной границы заполнения буфера FIFO приема)

Таблица 29-11. Регистр SPI Transmit Control (регистр управления передачей).

Биты Типичные значения для установки Описание
SPI_TXCTL.TEN 1 Transmit channel enable (разрешение канала передачи)
SPI_TXCTL.TTI 1 Transmit transfer initiation disable (запрет инициации на канале передачи)
SPI_TXCTL.TWCEN 0 Transmit word counter disable (запрет счетчика слов передачи)
SPI_TXCTL.TDR 0 Transmit data request disable (запрет запроса данных передачи)
SPI_TXCTL.TDU 0 Отправка последнего слова, когда TFIFO пуст
SPI_TXCTL.TRWM 0 Transmit FIFO regular watermark (обычная граница опустошения буфера FIFO передачи)
SPI_TXCTL.TUWM 0 Transmit FIFO urgent watermark disable (запрет срочной границы опустошения буфера FIFO передачи)

Таблица 29-12. Регистр SPI DLY Control (регистр управления задержками).

Биты Типичные значения для установки Описание Комментарии*
SPI_DLY.LAGX 1 Extended LAG timing (интервал времени расширенного LAG)  
SPI_DLY.LEADX 1 Extended LEAD timing (интервал времени расширенного LEAD)  
SPI_DLY.STOP 3 Бит STOP между передачами Может быть установлено в 1 для пониженных частот SPI.

Примечание *: см. даташит микросхемы SPI Flash для параметров интервалов времени выборки CS (например SSEL).

Биты multiple I/O mode (SPI_CTL.MIOM) частично игнорируются:

• Команда (opcode) передается либо с использованием одного, либо нескольких выводов, как это указано битами SPI_CTL.MIOM, в зависимости от установок бит SPI_MMRDH.CMDPINS.
• Затем передается адрес с использованием либо только одного, либо нескольких выводов, как это указано битами SPI_CTL.MIOM, в зависимости от настроек бит SPI_MMRDH.ADRPINS.
• Данные всегда читаются несколькими выводами, как это указано битами SPI_CTL.MIOM.

ЗАМЕЧАНИЕ: установите бит разрешения модуля SPI (бит SPI_CTL.EN) последним, после конфигурирования всех регистров.

Используйте следующие советы по программированию в режиме memory-mapped:

• Аппаратура SPI memory-mapped не проверяет статус flash перед инициацией доступа. Она подразумевает, что память всегда готова ответить на доступ чтения. Перед разрешением режима memory-mapped (например, перед установкой бита SPI_CTL.MMSE) убедитесь, что SPI flash готова к доступу чтения. Когда используется режим не memory-mapped, может быть проанализирован статус завершения записи (write-complete) перед разрешением памяти SPI в режиме memory-mapped (см. информационный бит, сигнализирующий о процессе записи в регистре состояния памяти SPI flash). Также сразу после первого включения питания устройства памяти SPI могут быть недоступны не некоторое время, которое указывает производитель устройства памяти SPI.
• Когда SPI разрешается в режиме memory-mapped, попытки обычного доступа к устройству SPI блокируются. Традиционные методы доступа включают любые прямые доступы к буферам FIFO передачи или приема, независимо от того, как они были инициированы - DMA или доступом процессора к MMR.
• Чтобы задействовать некоторые функции, предоставляемые устройствами памяти SPI, программы могут сначала сконфигурировать устройство памяти SPI установкой управляющего слова или отправкой некоторых команд. Так как аппаратура SPI memory-mapped не позволяет выполнять любые типы операций записи SPI, конфигурируйте устройство памяти SPI в обычном, не memory-mapped режиме перед тем, как разрешить режим memory-mapped.
• Аппаратура memory-mapped не интерпретирует opcode. Она не проверяет правильность интервалов времени, установленных в регистре SPI_MMRDH, на соответствие определенному opcode. Программы должны установить поля регистра SPI_MMRDH в соответствии с выбранным типом чтения.
• Когда ядро процессора запрашивает данные или инструкцию из памяти SPI, передача memory-mapped зависит от настроек кэша. Регистр конфигурации кэша в устройстве памяти SPI должен быть правильно сконфигурирован перед разрешением режима memory-mapped.
• Чтения MDMA для устройства SPI memory-mapped не поддерживают зацикливание адреса. Для чтений MDMA задайте предел поля DMA_CFG.MSIZE в 1, 2 или 4 байта.
• Не всегда имеется инструментальная поддержка, чтобы изменить на лету настройки аппаратуры SPI memory-mapped или настройки кэша.

Изменение этих настроек может оптимизировать быстродействие кода, который обращается к памяти SPI в режиме memory-mapped. Подразумевается, что память SPI, периферийное устройство SPI, и кэш запрограммированы в один специальный набор управляющих настроек для приложения в целом. Могут быть выполнены профилирование или анализ быстродействия реального приложения, чтобы определить настройки, которые работают лучше всего.

[Пример программирования для конфигурирования SPI Memory Mapped Mode (память Winbond W25Q32)]

Этот пример показывает, как настроить XIP для режима Quad I/O памяти Winbond W25Q32 SPI flash (предполагается, что устройство памяти подключено снаружи к выводам SPI0).

////////////////////////////////////////////////////////////////////////
// Установка режима XIP (по принципу Volatile)
////////////////////////////////////////////////////////////////////////
/* Сконфигурируйте устройство памяти SPI Flash для режима XIP и Quad mode
 * конфигурированием бита энергонезависимого бита QE регистра состояния flash.
 * Разрешите модуль SPI в режиме memory-mapped, как показано в листинге ниже.
 * Убедитесь, что биты режима (Mode bits) равны 0x00.
 * Чтобы разрешить режим пропуска команды (command skip, XIP) установите биты
 * MODE регистра заголовка чтения (SPI Memory mapped Read Header register)
 * и выполните пустой доступ к памяти SPI flash. */
*pREG_SPI2_MMRDH |= ((0x20 << BITP_SPI_MMRDH_MODE) & BITM_SPI_MMRDH_MODE );
unsigned int* pSPI_MEM;
pSPI_MEM = (unsigned int*) 0x40000000;
int temp = *pSPI_MEM;
/* После пустого доступа установите бит пропуска команды (Command Skip)
 * в регистре заголовка чтения (SPI Memory Mapped Read Header register) */
*pREG_SPI0_MMRDH |= BITM_SPI_MMRDH_CMDSKIP;
/* После этого все доступы к чтению SPI flash будут в режиме XIP. */
 
////////////////////////////////////////////////////////////////////////
// Инициализация SPI
////////////////////////////////////////////////////////////////////////
/* Сконфигурируйте системную тактовую частоту. Инициализируйте логику
 * мультиплексирования выводов процессора (Pin Mux), чтобы разрешить
 * работу выводов SPI */
Init_SPI_PinMux();
/* Сконфигурируйте настройки скорости SPI и настройки тактирования SPI.
 * Регистр тактирования SPI: SPI_CLK = SCLK / (BAUD + 1) */
*pREG_SPI0_CLK = ( (0x01 << BITP_SPI_CLK_BAUD) & BITM_SPI_CLK_BAUD );
/* Регистр задержки SPI: STOP = 3; LEAD = 1; LAG = 1 */
*pREG_SPI0_DLY = (((3 << BITP_SPI_DLY_STOP) & BITM_SPI_DLY_STOP) |
                 ((1 << BITP_SPI_DLY_LEADX ) & BITM_SPI_DLY_LEADX)|
                 ((1 << BITP_SPI_DLY_LAGX ) & BITM_SPI_DLY_LAGX ));
/* Разрешите режим Memory Mapped интерфейса SPI со следующими настройками:
 * Master mode, размер передачи 32 бита, аппаратная выборка Slave,
 * старший бит идет первый, Quad Multi-IO mode, разрешение FAST.
 * Настройки CPHA-CPOL зависят от устройства памяти SPI FLASH. */
*pREG_SPI0_CTL = (ENUM_SPI_CTL_MM_EN |
                  ENUM_SPI_CTL_MASTER |
                  ENUM_SPI_CTL_SIZE32 |
                  ENUM_SPI_CTL_HW_SSEL|
                  ENUM_SPI_CTL_ASSRT_SSEL |
                  ENUM_SPI_CTL_MSB_FIRST |
                  ENUM_SPI_CTL_FAST_EN |
                  ENUM_SPI_CTL_MIO_QUAD |
                  ((CPHA << BITP_SPI_CTL_CPHA) & BITM_SPI_CTL_CPHA)|
                  ((CPOL << BITP_SPI_CTL_CPOL) & BITM_SPI_CTL_CPOL));
/* Разрешите блок передачи SPI с установкой TTI=1; другие биты должны быть
 * сохранены в значениях по умолчанию. */
*pREG_SPI0_TXCTL = (BITM_SPI_TXCTL_TTI | BITM_SPI_TXCTL_TEN);
/* Разрешите блок приема SPI с установкой RTI=0; другие биты должны быть
 * сохранены в значениях по умолчанию. */
*pREG_SPI0_RXCTL = (BITM_SPI_RXCTL_REN );
/* Сконфигурируйте заголовок чтения (Memory Mapped Read Header) согласно
 * выбранному режиму чтения. */
*pREG_SPI0_MMRDH = (((0xE7<< BITP_SPI_MMRDH_OPCODE)& BITM_SPI_MMRDH_OPCODE)|
                    ((3 << BITP_SPI_MMRDH_ADRSIZE) & BITM_SPI_MMRDH_ADRSIZE)|
                    ((1 << BITP_SPI_MMRDH_ADRPINS) & BITM_SPI_MMRDH_ADRPINS)|
                    ((2 << BITP_SPI_MMRDH_DMYSIZE) & BITM_SPI_MMRDH_DMYSIZE)|
                    ((0 << BITP_SPI_MMRDH_MODE ) & BITM_SPI_MMRDH_MODE)|
                    ((1 << BITP_SPI_MMRDH_TRIDMY ) & BITM_SPI_MMRDH_TRIDMY) |
                    ((0 << BITP_SPI_MMRDH_CMDSKIP) & BITM_SPI_MMRDH_CMDSKIP)|
                    ((0 << BITP_SPI_MMRDH_CMDPINS) & BITM_SPI_MMRDH_CMDPINS));
/* Настройка верхнего адреса устройства памяти SPI Flash: */
*pREG_SPI0_MMTOP  = 0x40000000 + (FLASH_BLOCK_SIZE * FLASH_BLOCK_COUNT);
/* Настройка регистра управления Slave Select: */
*pREG_SPI0_SLVSEL = ENUM_SPI_SLVSEL_SSEL1_HI | ENUM_SPI_SLVSEL_SSEL1_EN;
/* Разрешение SPI: */
*pREG_SPI0_CTL |= BITM_SPI_CTL_EN;

[Сигналы прерывания SPI]

Контроллер SPI поддерживает 3 типа сигналов прерывания, которые соответствуют событиям данных, состояния и ошибки.

Прерывания данных (Data Interrupts). Периферийное устройство SPI поддерживает 2 канала прерываний данных – прием и передача. Эти сигналы прерываний мультиплексированы в сигналы запроса DMA. Поскольку периферийные интерфейсы с раздельными интерфейсами чтения и записи с использованием DMA, то прерывания чтения и записи данных независимы. Когда каналы DMA не используются, прерывания прямо направляются в системный контроллер событий (system event controller). Прерывания занимают те же самые места векторов, что и соответствующие каналы DMA.

Каждое из прерываний данных может управляться индивидуально. Программируйте битовые поля SPI_RXCTL.RDR и SPI_TXCTL.TDR соответственно для приема и передачи. Когда прием разрешен, то прерывание RX срабатывает всякий раз, когда данные доступны для чтения в ветке данных приема (это событие возникает в соответствии с установкой бита SPI_RXCTL.RDR). Когда передача разрешена, прерывание TX срабатывает всякий раз, когда записывается ветка данных передачи (это прерывание возникает в соответствии с установкой бита SPI_TXCTL.TDR). Прерывание данных DMA совместимо с вторичной генерацией DMA, чтобы реализовать срочные запросы данных и прерываний финиша передачи кроме обычных прерываний запроса данных. Прерывания передачи работают независимо от значения счетчика слов в регистре SPI_TWC.

Прерывания состояния (Status Interrupts). Контроллер SPI поддерживает несколько прерываний статуса, чтобы показать разные события приемника и передатчика. Все прерывания статуса можно замаскировать (отменить). Прерывания статуса сигнализируются напрямую через одну линию запроса прерывания статуса (SPI status IRQ line). Эта линия не может быть комбинирована с линией SPI error IRQ для некоторых процессоров. Таблица прерываний статуса SPI 29-13 описывает прерывания состояния, которые доступны для контроллера SPI.

Таблица 29-13. Прерывания состояния SPI.

Бит SPI_STAT Описание
SPI_STAT.RUWM Прерывание приема FIFO срочное достижение предела (urgent watermark). Срабатывает, когда уровень RFIFO нарушит метку предела (watermark), установленную полем SPI_RXCTL.RUWM. Очищается, когда уровень RFIFO достигает установки метки watermark в поле SPI_RXCTL.RRWM. Если канал RX сконфигурирован в режиме DMA, SPI_RXCTL.RUWM мультиплексируется с запросом данных.
SPI_STAT.TUWM Прерывание передачи FIFO срочного достижения предела (urgent watermark). Срабатывает, когда уровень TFIFO нарушит метку предела (watermark), установленную с использованием бит SPI_TXCTL.TUWM. Очищается, когда уровень TFIFO достигает установки поля SPI_TXCTL.TRWM. Если канал TX сконфигурирован в режиме DMA, то SPI_STAT.TUWM мультиплексируется с запросом данных.
SPI_STAT.TS Прерывание запуска передачи. Срабатывает, когда детектирован старт пакетной передачи путем загрузки регистра SPI_TWC содержимым регистра SPI_TWCR.
SPI_STAT.RS Прерывание запуска приема. Срабатывает, когда детектирован старт пакетного приема путем загрузки SPI_RWC содержимым регистра SPI_RWCR.
SPI_STAT.TF Прерывание завершения передачи. Срабатывает, когда завершается пакетная передача (декременты SPI_TWC достигают 0).
SPI_STAT.RF Прерывание завершения приема. Срабатывает, когда завершается пакетный прием (декременты SPI_RWC достигают 0).

Прерывания событий ошибки (Error Conditions). Контроллер SPI поддерживает прерывания на нескольких различных событиях ошибки. Все прерывания можно замаскировать (запретить). Индивидуальные индикации прерывания комбинируются в одном сигнале SPI error IRQ, который может быть мультиплексирован не некоторых процессорах с агрегированным сигналом состояния SPI (SPI status IRQ signal). Таблица прерываний ошибок SPI 29-14 детализирует возможные индикации ошибки.

Таблица 29-14. SPI Error Interrupts.

Бит SPI_STAT Описание
SPI_STAT.MF Отказ режима (Mode Fault). Срабатывает, когда другое устройство также пытается стать master в системе multi-master, и переводит вход ~SPI_SS в лог. 0. Эта ошибка появляется в режиме работы master.
SPI_STAT.TUR Ошибка передачи (transmission error). Срабатывает, когда происходит событие недогрузки данными канала передачи (underflow). Это событие происходит, когда запускается новая передача, но при этом пуст SPI_TFIFO. Эта ошибка не происходит в режиме инициации со стороны master, поскольку не пустота SPI_TFIFO является одним из условий инициирования передачи.
SPI_STAT.ROR Ошибка приема (reception error). Срабатывает, когда в канале приема происходит событие переполнения (overflow). Это событие происходит, когда принимается новое слово данных, но SPI_RFIFO заполнен (данные не были оттуда прочитаны). Это условие ошибки не возникает в режиме инициации приема master, поскольку пустота SPI_RFIFO является одним из условий инициации приема.
SPI_STAT.TC Ошибка коллизии передачи (Transmit Collision error). Срабатывает, когда загрузка данных в регистр сдвига передачи происходит близко с первым перепадом передачи SPI_CLK. В режиме slave контроллер SPI не знает, когда запустится следующая передача. Загрузка данных в регистр сдвига передачи может произойти почти сразу после перепада передачи. Это событие происходит, когда время установки не встречается с первым передаваемым битом. Передаваемые данные повреждаются. В режиме SPI_CTL.CPHA=1 первый перепад SPI_CLK берется как первый перепад передачи. Если SPI_CTL.CPHA=0, то последний перепад SPI_CLK последней передачи (SPI_CTL.SELST =1) или снятие slave select (SPI_CTL.SELST =0) взяты как первый перепад передачи. Эта ошибка происходит только в режиме slave. В режиме master загрузка данных происходит перед первым перепадом передачи SPI_CLK.

События ошибки и возникновения прерываний зависят от разрешенных каналов (передача или прием). Если канал запрещен, то все ошибки, связанные с этим, игнорируются. Когда оба канала разрешены, разрешены ошибки и прерывания от обоих каналов.

[Концепции программирования SPI]

Следующие секции предоставляют основные руководства по программированию и соответствующие процедуры.

Замечания по программированию. Допускается программировать регистры SPI_RXCTL и SPI_TXCTL после программирования регистра SPI_CTL. Однако программируйте регистр режима инициации и регистры счетчиков, если разрешено, после не инициализированного регистра режима. Например, если передача в режиме инициации, и режим приема в режиме не инициации, то программируйте регистры SPI_RXCTL и SPI_RWC перед регистрами SPI_TXCTL и SPI_TWC. Если разрешены оба режима инициации и передачи, и приема, то разрешайте регистр SPI_CTL после программирования обоих регистров SPI_RXCTL и SPI_TXCTL.

Эти указания по программированию предотвратят от запуска переноса данных SPI до полного завершения программирования SPI.

Также разрешены другие способы программирования, пока условия инициации предотвращают запуск коммуникации до завершения программирования регистров SPI.

Предпринимайте меры, чтобы избежать повреждения данных при изменении конфигурации модуля SPI. Не меняйте конфигурацию во время переноса данных. Дополнительно меняйте полярность тактов только когда не выбрано ни одно из slave-устройств. Однако из этого правила есть исключение. Когда линк коммуникации SPI состоит из одного master и одного slave, SPI_CTL.ASSEL=0. Вход выборки slave select устройства slave постоянно притянут к лог. 0. В этом случае подчиненное устройство выбрано всегда. Избегайте повреждения данных разрешением подчиненного устройства только после того, как сконфигурированы оба устройства, master и slave.

Модуль поддерживает размеры слов фрейма 8, 16 и 32 бита. Чтобы гарантировать корректную работу, сконфигурируйте оба устройства, master и slave, на одинаковый размер слова.

Master без DMA. В этой секции описывается работа SPI в качестве master, без использования DMA.

1. Запишите регистр SPI_SLVSEL, установив один или большее количество бит SPI select enable. Эта операция гарантирует, что нужные устройства будут правильным образом деактивированы (не выбраны) в процессе конфигурирования master-устройства.

2. Биты SPI_RXCTL.RTI и SPI_TXCTL.TTI определяют режим инициации SPI. Режим инициации определяет главный канал передачи, и также условие завершения передачи.

3. Запишите регистры SPI_CLK, SPI_CTL, SPI_RXCTL и SPI_TXCTL. Эта операция разрешает устройство для работы в качестве master, и конфигурирует систему SPI. Она задает режимы передачи и каналы, подходящую длину слова, формат передачи, скорость и другую управляющую информацию.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: если SPI_RXCTL.RTI разрешен, и SPI_TXCTL.TTI не разрешен, запишите в регистр SPI_RXCTL после записи в регистры SPI_CTL, SPI_TXCTL и SPI_TFIFO, чтобы предотвратить недогрузку передачи (transmit underrun) для первой передачи.

4. Если SPI_CTL.ASSEL=0, активируйте нужные slave-устройства путем очистки одного или большего количества бит флагов SPI_SLVSEL. Иначе аппаратура SPI выполнит активацию slave-устройства.

5. Затем контроллер SPI генерирует программируемые импульсы тактов на ножке SPI_CLK, и одновременно сдвигает данные наружу через SPI_MOSI, вдвигая при этом одновременно данные с ножки SPI_MISO. Перед сдвигом регистр сдвига загружается содержимым регистра SPI_TFIFO. По окончании передачи содержимое регистра сдвига будет загружено в регистр SPI_RFIFO.

6. Всякий раз, когда удовлетворяется условие инициации, SPI продолжит отправлять и принимать слова. Если буфер передачи остается пустым, или буфер приема остается полным, то устройство работает в соответствии с состояниями битов SPI_TXCTL.TDU и SPI_RXCTL.RDO.

7. Можно запрограммировать второй канал дополнительно к инициирующему каналу. Эта функция разрешит использовать доступные ресурсы канала для приема или передачи одновременно с инициирующим каналом.

Slave без DMA. Когда устройство разрешено как slave в режиме без использования DMA, переход сигнала ~SPI_SS в активное состояние (лог. 0) вызывает срабатывание начала передачи. Или первый активный перепад SPI_CLK вызывает срабатывание передачи, в зависимости от состояния бита SPI_CTL.CPHA. Интерфейс работает следующим образом.

1. Ядро записывает регистры SPI_CTL, SPI_RXCTL и SPI_TXCTL. Эта операция задает режим последовательного линка в такую же настройку, как сделана у SPI master.

2. Чтобы подготовить передачу данных, ядро записывает данные для передачи в SPI_TFIFO.

3. Как только был детектирован спад ~SPI_SS, устройство slave начнет передавать данные на активных перепадах SPI_CLK, и делать выборку данных на неактивных перепадах SPI_CLK.

4. Прием или передача будет продолжаться до тех пор, пока ~SPI_SS не будет освобожден (переведен в лог. 1) или пока slave принимает правильное количество тактовых импульсов.

5. Устройство slave продолжает принимать или передавать с каждым новым переходом в лог. 0 на ~SPI_SS или активным перепадом SPI_CLK. Если буфер передачи остается пуст, или буфер приема остается заполненным, то устройство работает в соответствии с состояниями бит SPI_TXCTL.TDU и SPI_RXCTL.RDO.

Режим DMA Master. Интерфейс SPI поддерживает канал DMA записи и канал DMA чтения. Он может использовать эти функции индивидуально или жестко регламентировано в режиме дуплекса (SPI_TXCTL.TTI = SPI_RXCTL.RTI = 1).

1. Запишите соответствующие регистры DMA, чтобы разрешить канал SPI DMA и сконфигурировать необходимые рабочие единицы данных, направление доступа, счетчика слов, и т. д.

2. Запишите регистр SPI_SLVSEL, установив один или большее количество флагов выбора slave-устройств SPI.

3. Запишите регистры SPI_CLK и SPI_CTL, разрешив устройство как master, и сконфигурируйте систему SPI указанием подходящей длины слова, формата передачи, скорости, полярности и фазы тактов.

4. Запишите SPI_RXCTL для конфигурирования режима приема SPI master, или запишите SPI_TXCTL для конфигурирования режима передачи SPI master.

5. В завершение запишите бит SPI_RXCTL.REN, чтобы разрешить канал приема, или запишите бит SPI_TXCTL.TEN для разрешения канала передачи.

6. Если бит SPI_RXCTL.RTI разрешен, то прием инициируется разрешением бита SPI_CTL.EN. Если разрешен счетчик слов приема (SPI_RXCTL.RWCEN), то регистр SPI_RWC должен быть не равен 0 для инициации переноса данных приема.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: если разрешаются оба канала - и прием и передача, но не разрешается SPI_TXCTL.TTI, то запишите в регистр SPI_RXCTL после записи регистров SPI_CTL и SPI_TXCTL. Таким способом можно защититься от недогрузки передачи для первой передачи. Последующие передачи инициируются как чтения принятых слова данных из регистра сдвига приема и записи его в приемный буфер FIFO SPI. Тогда SPI запрашивает запись из DMA в память. Согласно предоставлению DMA, узел DMA читает слово из SPI FIFO приема, и записывает его в память. Новые запросы будут продолжаться инициироваться, пока FIFO приема не перестанет заполняться, когда SPI_RWC не перешел в 0 при SPI_RXCTL.RWCEN=1.

7. Если разрешен бит SPI_TXCTL.TTI, то контроллер SPI запрашивает чтения DMA из памяти, пока еще имеются данные в канале передачи. При предоставлении DMA узел DMA читает слово из памяти и записывает его в FIFO передачи. Пока передаваемые данные доступны в FIFO, и регистр SPI_TWC не обнулился при SPI_TXCTL.TWCEN=1, система SPI будет продолжать инициировать передачи, пока это не будет запрещено.

8. Если разрешены оба бита SPI_TXCTL.TTI и SPI_RXCTL.RTI, то контроллер SPI запрашивает чтение DMA из памяти. Однако здесь должно быть место для поступления большего количества данных в канале передачи, и количество записываемых в SPI слов должно быть меньше SPI_TWC, если SPI_TXCTL.TWCEN=1. При предоставлении DMA узел DMA читает слово из памяти и записывает его в FIFO передачи.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: поскольку SPI записывает данные из FIFO передачи в регистр сдвига передачи, это инициирует передачу на линке SPI. Принятые данные перемещаются SPI регистра сдвига приема в регистр FIFO приема. Контроллер SPI запрашивает запись из DMA в память. При предоставлении DMA узел DMA читает слово из FIFO приема и записывает его в память. Передача продолжает инициироваться, пока оба канала - и прием и передача - могут пополняться новыми данными.

9. Если канал приема заполняется из-за недоступности предоставления DMA, канал передачи приостанавливается, пока его данные не закончатся. Если канал передачи заполнится, то SPI остановит запросы записей DMA. Если значение SPI_RWC истекло, то следующие запросы записи остановят DMA. Однако уже записанные данные в FIFO передачи будут отправлены, и запросы чтения к DMA продолжаться, пока принимаемые данные вычитываются из FIFO приема.

10. Затем SPI генерирует запрограммированное количество импульсов на SPI_CLK и одновременно выдвигает данные наружу через SPI_MOSI при вдвигании данных внутрь из SPI_MISO. Для перемещения данных приема значение в регистре сдвига загружается в регистр SPI_RFIFO по окончании этого переноса. Для передач данных значение из регистра SPI_TFIFO загружается в регистр сдвига при старте передачи.

Режим DMA Slave. Этот режим работает, когда SPI разрешен как устройство slave, и система DMA сконфигурирована для передачи или приема данных. Переход сигнала ~SPI_SS в состояние активного лог. 0 вызовет срабатывание переноса данных. Или первый активный перепад SPI_CLK вызовет старт переноса данных, в зависимости от состояния бита SPI_CTL.CPHA. Следующие шаги иллюстрируют последовательности SPI приема или передачи DMA в режиме SPI slave (в ответ на команду устройства master). SPI поддерживает канал DMA приема и канал DMA передачи.

1. Запишите соответствующие регистры DMA, чтобы разрешить канал SPI DMA, и сконфигурируйте необходимые единицы данных, направление доступа, счетчик слов и т. д.

2. Запишите регистры SPI_CTL, SPI_RXCTL и SPI_TXCTL, чтобы определить режим последовательного линка, чтобы он совпадал с режимом, сконфигурированным в SPI master.

3. Если разрешен канал приема (выставлен SPI_RXCTL.REN), то происходят следующие действия:

a. Как только вход slave select станет активным (лог. 0), устройство slave начнет принимать и передавать данные по активным перепадам SPI_CLK (которые генерирует master).
b. Значение в регистре сдвига загружается в регистр SPI_RFIFO по окончании фрейма приема.
c. Как только в SPI_RFIFO появились достоверные данные, это запрашивает запись из DMA в память.
d. При предоставлении DMA узел DMA читает слово из FIFO приема и записывает его в память.
e. Пока поступают данные в FIFO приема, устройство SPI slave продолжает запрашивать DMA записывать эти данные в память. Система DMA продолжит читать слово из FIFO и записывать его в память, пока не обнулится счетчик SPI_RWC. SPI slave продолжит принимать слова на активных перепадах SPI_CLK, пока активен вход выборки ~SPI_SS (лог. 0).
f. Если собранные данные в канале приема превысят установленный уровень, и система DMA не сможет поддержать принимаемый поток данных с нужной скоростью, устройство slave может снять сигнал SPI_RDY. Это дает сигнал приостановить передачу для устройства master. Канал приема устанавливается в соответствии с полем SPI_CTL.FCWM. Этот сигнал снимается, как только DMA опустошает FIFO приема. Альтернативно SPI может использовать бит SPI_RXCTL.RDO, чтобы решить, когда входящие данные были отброшены или перезаписаны в буфере FIFO приема (когда не активен SPI_CTL.FCEN).

4. Если разрешен канал передачи (выставлен SPI_TXCTL.TEN), то происходят следующие действия:

a. SPI запрашивает чтение DMA из памяти.
b. При предоставлении DMA узел DMA читает слово из памяти и записывает его в FIFO передачи.
c. Затем SPI читает данные DMA из FIFO передачи и записывает их в регистр сдвига передачи, ожидая запуска нового переноса данных.
d. Как только вход slave select станет активным, устройство slave начнет принимать и передавать данные по активным перепадам SPI_CLK.
e. Пока есть место в FIFO передачи, устройство SPI slave продолжает запрашивать чтения DMA из памяти. Система DMA продолжит читать слово из памяти и записывать его в FIFO передачи, пока значение в регистре счетчика SPI_TWC не перейдет в 0. Устройство SPI slave продолжит передавать слова по активным перепадам SPI_CLK, пока вход ~SPI_SS находится в активном состоянии (лог. 0).
f. Если количество оставшихся данных в канале передачи перейдет установленный уровень, и DMA не сможет поддержать поток передачи с нужной скоростью, устройство slave снимает сигнал SPI_RDY. Это дает сигнал устройству master приостановить передачу. Уровень канала передачи устанавливается в соответствии с полем SPI_CTL.FCWM. Сигнал снимается, пока DMA не наполнит FIFO передачи. Альтернативно бит SPI_TXCTL.TDU определят состояние данных передачи (когда снят SPI_CTL.FCEN).

5. Если разрешены оба канала - и прием, и передача, то следующие действия произойдут после действий для каждого канала. Передачи продолжатся, пока в оба канала - и приема, и передачи, могут поступать новые данные.

a. Если заполнится канал приема из-за недоступности предоставления DMA, то интерфейс SPI приостанавливает устройство master с помощью вывода SPI_RDY. Этот сигнал снимается, пока DMA не опустошит FIFO приема. Альтернативно SPI использует бит SPI_RXCTL.RDO, чтобы решить, должны ли поступающие данные быть отброшены или перезаписаны в FIFO приема (когда снят SPI_CTL.FCEN).
b. Если канал передачи заполнен, SPI остановит запросы записи DMA, пока канал не очистится.
c. Если произойдет проблема недогрузки в канале передачи, то устройство slave приостановит устройство master снятием сигнала SPI_RDY, когда DMA заполняет FIFO передачи. Альтернативно SPI использует бит SPI_TXCTL.TDU чтобы определить состояние данных передачи (когда снят SPI_CTL.FCEN).

[SPI0]

Сигнал Назначение Порт
SPI0_CLK
SPI0 Clock PB_00
PC_04
SPI0_D2 SPI0 Data 2 PB_03
PC_08
SPI0_D3 SPI0 Data 3 PB_07
PC_09
SPI0_MISO SPI0 Master In, Slave Out PB_01
PC_06
SPI0_MOSI SPI0 Master Out, Slave In PB_02
PC_07
SPI0_RDY SPI0 Ready PA_06
SPI0_SEL1 SPI0 Slave Select Output 1 PA_05
SPI0_SEL2 SPI0 Slave Select Output 2 PA_06
SPI0_SEL3 SPI0 Slave Select Output 3 PC_11
SPI0_SEL4 SPI0 Slave Select Output 4 PB_04
SPI0_SEL5 SPI0 Slave Select Output 5 PB_05
SPI0_SEL6 SPI0 Slave Select Output 6 PB_06
SPI0_SS SPI0 Slave Select Input PA_05

[SPI1]

Сигнал Назначение Порт
SPI1_CLK SPI1 Clock PA_00
SPI1_MISO SPI1 Master In, Slave Out PA_01
SPI1_MOSI SPI1 Master Out, Slave In PA_02
SPI1_RDY SPI1 Ready PA_03
SPI1_SEL1 SPI1 Slave Select Output 1 PA_04
SPI1_SEL2 SPI1 Slave Select Output 2 PA_03
SPI1_SEL3 SPI1 Slave Select Output 3 PC_10
SPI1_SEL4 SPI1 Slave Select Output 4 PA_14
SPI1_SS SPI1 Slave Select Input PA_04

[SPI2]

Сигнал Назначение Порт
SPI2_CLK SPI2 Clock PB_10
SPI2_D2 SPI2 Data 2 PB_13
SPI2_D3 SPI2 Data 3 PB_14
SPI2_MISO SPI2 Master In, Slave Out PB_11
SPI2_MOSI SPI2 Master Out, Slave In PB_12
SPI2_RDY SPI2 Ready PA_04
SPI2_SEL1 SPI2 Slave Select Output 1 PB_15
SPI2_SEL2 SPI2 Slave Select Output 2 PB_08
SPI2_SEL3 SPI2 Slave Select Output 3 PB_09
SPI2_SS SPI2 Slave Select Input PB_15

[Описание регистров SPI]

Общий список регистров SPI ADSP-BF70x см. в таблице 29-1. Аббревиатура R/W возле имени поля или бита означает доступ на чтение и запись, R означает доступ на чтение, W1C означает доступ типа "запись 1 для очистки", R/NW означает, что бит можно прочитать, но нельзя записать, W1S означает, что для установки бита маски нужно записать в этот бит 1. Серым цветом на рисунке показаны не используемые (зарезервированные) биты регистров, цифрами 0 и 1 показано начальное состояние каждого бита после сброса (или включения питания) процессора.

Регистр SPI_CLK выбирает скорость работы (baud rate) для перемещений данных SPI. Параметр в этом регистре задает частоту переключений тактового сигнала (SPI clock), привязываясь к тактовой частоте системной шины процессора (SCLK0).

ADSP BF70x SPI CLK fig29 20

Рис. 29-20. Регистр SPI_CLK.

Поле бит BAUD устанавливает скорость SPI в соответствии со следующей формулой:

BAUD = (SCLK0 / SPI Clock) - 1

Регистр SPI_CTL разрешает работу SPI и конфигурирует настройки для рабочих режимов, коммуникационных протоколов и операций с буферами.

ADSP BF70x SPI CTL fig29 21

Рис. 29-21. Регистр SPI_CTL.

Бит
(доступ)
Имя Описание
31 (R/W) MMSE Memory-Mapped SPI Enable. Когда этот бит установлен, обмен с устройством памяти SPI автоматизируется таким образом, что эта внешняя память SPI становится доступной через прямое чтение адресного пространства процессора (memory-mapped read access). Обратите внимание, что когда такой доступ разрешен, попытки обмена с устройством SPI традиционным образом будут блокироваться, и будут генерироваться ошибки фабрики приема. Традиционные методы включают любой прямой доступ к буферам FIFO TX и RX, не зависимо от того, кем этот доступ был инициирован - DMA или MMR-доступом процессора.
0 Запрещен автоматизированный прозрачный доступ с привязкой к адресному пространству устройства памяти SPI.
1 Разрешен автоматизированный прозрачный доступ с привязкой к адресному пространству устройства памяти SPI.
30 (R/W) MMWEM Memory Mapped Write Error Mask. Этот бит указывает, будет ли возвращен ответ ошибки фабрике при попытке записи в адресное пространство, зарезервированное для memory-mapped чтения памяти SPI.
0 Будет возвращена ошибка на попытки записи memory-mapped памяти SPI.
1 Ответ ошибки попытки доступа записи к memory-mapped памяти SPI маскируется (он не будет возвращен).
22 (R/W) SOSI Start on MOSI. Работа бита SOSI допустима только когда разрешен SPI_CTL.MIOM либо для DIOM (Dual I/O Mode) или QIOM (Quad I/O Mode), и этот бит выбирает начальный вывод и распределение битов разрядов в этих режимах.
В DIOM по умолчанию (SPI_CTL.SOSI=0) посылает первый бит через SPI_MISO, и второй бит через SPI_MOSI. В QIOM по умолчанию SPI посылает первый бит через SPI_D3, второй через SPI_D2, третий через SPI_MISO, и четвертый через SPI_MOSI. Этот порядок следования бит может быть изменен на обратный путем установки бита SOSI. Когда этот бит установлен, SPI отправляет первый бит через вывод SPI_MOSI. Какой будет первый бит (MSB или LSB), определяется установкой бита SPI_CTL.LSBF.
0 Начало бит на MISO (в режиме DIOM), или начало на SPI_D3 (QIOM).
1 Начало на MOSI.
21:20 (R/W) MIOM Multiple I/O Mode. Бит MIOM разрешает работу SPI в dual I/O mode (DIOM) или quad I/O mode (QIOM). Эти биты можно менять только когда SPI запрещен (SPI_CTL.EN =0).
0 Нет многовыводного ввода/вывода.
1 Работает DIOM.
2 Работает QIOM.
3 Зарезервировано.
18 (R/W) FMODE Fast-Mode Enable. Бит FMODE разрешает быстрый режим для перемещений приема данных SPI. Работа передачи в быстром режиме не ускоряется и работает так же, как и в обычном режиме.
0 Запрещено.
1 Разрешено.
17:16 (R/W) FCWM Flow Control Watermark (метка предела заполнения буфера FIFO для управления потоком данных). Биты FCWM выбирают уровень границы заполнения FIFO канала передачи границы передачи (буфер SPI_TFIFO) или канала приема (буфер SPI_RFIFO), превышение которого вызывает срабатывание системы управления потоком (flow control). Эти биты применимы только когда SPI является подчиненным устройством (slave, SPI_CTL.MSTR=0), и разрешен flow control (SPI_CTL.FCEN=1). Когда удовлетворяется условие watermark, устройство SPI slave снимает сигнал готовности SPI_RDY.
0 TFIFO опустошен или RFIFO заполнен.
1 TFIFO опустошен на 75% или больше, или RFIFO заполнен на 75% или больше.
2 TFIFO опустошен на 50% или больше, или RFIFO заполнен на 50% или больше.
3 Зарезервировано.
15 (R/W) FCPL Flow Control Polarity. Этот бит определяет полярность сигнала готовности SPI_RDY, когда разрешено управление потоком (flow control). Когда сигнал SPI_RDY активен, то SPI slave показывает, что готов продолжать обмен данными.
0 Лог. 0 на SPI_RDY показывает готовность к обмену.
1 Лог. 1 на SPI_RDY показывает готовность к обмену.
14 (R/W) FCCH Flow Control Channel Selection. Бит FCCH выбирает, на каком канале работает управление потоком - на канале передачи (буфер SPI_TFIFO) или на канале приема (буфер SPI_RFIFO). Этот бит работает только когда SPI работает как slave-устройство, и когда разрешено управление потоком (flow control).
0 Flow control работает на буфере RX.
1 Flow control работает на буфере TX.
13 (R/W) FCEN Flow Control Enable. Бит FCEN разрешает работу системы управления потоком данных SPI. Это позволяет медленному устройству slave приостанавливать интерфейс быстрых устройств master. Бит FCEN управляет работой вывода SPI_RDY. Обратите внимание, что на работу управления потоком влияют биты SPI_CTL.FCCH, SPI_CTL.FCPL и SPI_CTL.FCWM.
0 Запрещено.
1 Разрешено.
12 (R/W) LSBF Least Significant Bit First. Бит LSBF выбирает, в каком порядке будут передаваться биты данных - когда младший бит (LSB) идет первым (формат little endian), или когда старший бит (MSB) идет первым (big endian). Бит LSBF можно поменять только если SPI запрещен.
0 Первым отправляется/принимается MSB (big endian).
1 Первым отправляется/принимается LSB (little endian).
10:9 (R/W) SIZE Word Transfer Size. Биты SIZE определяют размер единицы данных (слова, или фрейма). Чтобы гарантировать правильное функционирование, и master и slave должны быть сконфигурированы на одинаковый размер слова. Биты SIZE можно поменять только если SPI запрещен (SPI_CTL.EN=0).
0 Размер слова 8 бит (1 байт).
1 Размер слова 16 бит (2 байта).
2 Размер слова 32 бита (4 байта).
3 Зарезервировано.
8 (R/W) EMISO Enable MISO. Бит EMISO разрешает режим master-in-slave-out (MISO). Этот режим применим только когда SPI работает как slave.
0 Запрещено.
1 Разрешено.
7 (R/W) SELST Slave Select Polarity Between Transfers. Бит SELST выбирает состояние (полярность) вывода ~SPI_SEL[n] между передачами SPI, когда SPI работает как master, и разрешено аппаратное управление выборкой slave select (SPI_CTL.ASSEL=1). В режиме slave этот бит влияет на детектирование коллизий передачи (SPI_STAT.TC) и ошибки недогрузки (SPI_STAT.TUR).
0 Снять сигнал slave select (лог. 1).
1 Установить сигнал slave select (лог. 0).
6 (R/W) ASSEL Slave Select Pin Control. Бит ASSEL выбирает, будет ли аппаратура SPI устанавливать вывод ~SPI_SEL[n] (игнорируя биты SPI_SLVSEL.SSEL1 .. SPI_SLVSEL.SSEL7), или же программное управление задает состояние бит выходов выборки подчиненных устройств ~SPI_SEL[n]. Эта функция работает только когда SPI работает как master.
Когда разрешено аппаратное управление, выводы ~SPI_SEL[n] устанавливаются во время передач, и полярность этих выводов между передачами определяется битом SPI_CTL.SELST.
Когда разрешено программное управление, вывод SPI_SEL[n] выводит значение, установленное через программное управление битами slave select, и поэтому эти выводы могут оставаться в любом состоянии (даже активном) между передачами.
0 Программное управление slave select.
1 Аппаратное управление slave select.
5 (R/W) CPOL Clock Polarity. Бит CPOL выбирает, какой активный уровень используется для тактов SPI (SPI_CLK), лог. 0 или лог. 1. Бит CPOL вместе с битом SPI_CTL.CPHA выбирает формат фрейма, т. е. фазу и полярность сигнала тактов относительно данных. Эти биты можно менять только когда SPI запрещен.
0 У сигнала SPI_CLK активный уровень лог. 1.
1 У сигнала SPI_CLK активный уровень лог. 0.
4 (R/W) CPHA Clock Phase. Бит CPHA выбирает, как должны начать переключаться такты SPI (SPI_CLK) от начала первого бита данных или от середины первого бита данных. Бит CPHA в комбинации с битом SPI_CTL.CPOL задают фазу и полярность сигнала вывода тактов SPI_CLK. Эти биты можно менять только когда SPI запрещен.
0 SPI_CLK начинает переключаться от середины первого бита.
1 SPI_CLK начинает переключаться от начала первого бита.
3 (R/W) ODM Open Drain Mode. Бит ODM конфигурирует выводы выхода данных (SPI_MOSI и SPI_MISO) для работы с открытым коллектором. Этот режим предотвращает конфликт, сквозные токи и возможное повреждение драйверов выводов, когда осуществляется работа в окружении multi-master или multi-slave SPI. Когда ODM разрешен, и SPI работает как master, то выход SPI_MOSI переходит в отключенное состояние, когда на MOSI поступает лог. 1. Вывод SPI_MOSI не переходит в третье состояние при выводе лог. 0. Когда ODM разрешен, и SPI работает как slave, то вывод SPI_MISO переходит в третье (отключенное) состояние, когда на него выводится лог. 1. Обратите внимание, что требуется верхний нагрузочный резистор (pull-up) и для SPI_MOSI, и для SPI_MISO, когда разрешен бит ODM.
0 Запрещено.
1 Разрешено.
2 (R/W) PSSE Protected Slave Select Enable. Бит PSSE разрешает выводу ~SPI_SS предоставлять вход детектирования ошибки в окружении multi-master, когда SPI работает как master. Если какое-то другое устройство в системе выставляет вывод ~SPI_SS, клшжа SPI разрешен как master (и PSSE разрешен), это условие приводит к появлению ошибки режима (mode fault error).
0 Запрещено.
1 Разрешено.
1 (R/W) MSTR Master/Slave. Бит MSTR переключает SPI между режимом master и режимом slave. Этот бит можно поменять только когда SPI запрещен.
0 Slave.
1 Master.
0 (R/W) EN Enable. Бит EN разрешает работу SPI.
0 Запрет модуля SPI.
1 Разрешение.

Регистр SPI_DLY выбирает задержку переноса данных и интервалы lead/lag между сигналами slave select и перепадом тактов SPI.

ADSP BF70x SPI DLY fig29 22

Рис. 29-22. Регистр SPI_DLY.

Бит
(доступ)
Имя Описание
9 (R/W) LAGX Extended SPI Clock Lag Control. Бит LAGX разрешает вставку одного такта SPI_CLK задержки (расширенный lag) в интервал между активацией slave select (~SPI_SEL[n]) и первым перепадом тактов SPI.
0 Запрещено.
1 Разрешено.
8 (R/W) LEADX Extended SPI Clock Lead Control. Бит LEADX разрешает вставку одного такта SPI_CLK задержки (расширенный lead) в интервал времени между деактивацией slave select (~SPI_SEL[n]) и последним перепадом тактов SPI.
0 Запрещено.
1 Разрешено.
7:0 (R/W) STOP Transfer Delay Time in Multiples of SPI Clock Period. Биты STOP выбирают задержку (количество stop-битов, умноженное на длительность тактов SPI) по окончании каждого переноса данных SPI. Задержка по умолчанию это минимальное значение, требуемое для удовлетворения совместимости с протоколом SPI (длительность 1 бита). Биты STOP могут быть запрограммированы на еще меньшее значение задержки, в результате получится непрерывное функционирование (continuous operation, например если количество stop-битов =0).

Регистр SPI_ILAT защелкивает (latch) флаги прерывания, ставя в очередь обработку прерываний. Когда условие прерывания показано битом в регистре SPI_STAT, и соответствующее прерывание разрешено (демаскировано) в регистре SPI_IMSK, то SPI защелкивает бит прерывания в регистре SPI_ILAT.

ADSP BF70x SPI ILAT fig29 23

Рис. 29-23. Регистр SPI_ILAT.

Бит
(доступ)
Имя Описание
11 (R/NW) TF Transmit Finish Interrupt Latch. Флаг защелки события завершения передачи.
0 Прерывания не было.
1 Зафиксировано событие прерывания.
10 (R/NW) RF Receive Finish Interrupt Latch. Флаг защелки события завершения приема.
0 Прерывания не было.
1 Зафиксировано событие прерывания.
9 (R/NW) TS Transmit Start Interrupt Latch. Флаг защелки события запуска передачи.
0 Прерывания не было.
1 Зафиксировано событие прерывания.
8 (R/NW) RS Receive Start Interrupt Latch. Флаг защелки события запуска приема.
0 Прерывания не было.
1 Зафиксировано событие прерывания.
7 (R/NW) MF Mode Fault Interrupt Latch. Флаг защелки события ошибки режима.
0 Прерывания не было.
1 Зафиксировано событие прерывания.
6 (R/NW) TC Transmit Collision Interrupt Latch. Флаг защелки события коллизии передачи.
0 Прерывания не было.
1 Зафиксировано событие прерывания.
5 (R/NW) TUR Transmit Underrun Interrupt Latch. Флаг защелки события недогрузки передачи.
0 Прерывания не было.
1 Зафиксировано событие прерывания.
4 (R/NW) ROR Receive Overrun Interrupt Latch. Флаг защелки события переполнения приема.
0 Прерывания не было.
1 Зафиксировано событие прерывания.
2 (R/NW) TUWM Transmit Urgent Watermark Interrupt Latch. Флаг защелки события превышения границы опустошения буфера передачи.
0 Прерывания не было.
1 Зафиксировано событие прерывания.
1 (R/NW) RUWM Receive Urgent Watermark Interrupt Latch. Флаг защелки события превышения границы заполнения буфера передачи.
0 Прерывания не было.
1 Зафиксировано событие прерывания.

Регистр SPI_ILAT_CLR разрешает очистку отдельных бит маски регистра SPI_ILAT без влияния на состояние других бит в этом регистре. Для очистки нужного бита SPI_ILAT используйте операцию write-1-to-clear (W1C, запись единички для очистки) над регистром SPI_ILAT_CLR.

ADSP BF70x SPI ILAT CLR fig29 24

Рис. 29-24. Регистр SPI_ILAT_CLR.

Бит
(доступ)
Имя Описание
11 (R/W1C) TF Clear Transmit Finish. Очищает соответствующий бит маски в регистре SPI_ILAT.
0 Не дает эффекта.
1 Очищает бит маски.
10 (R/W1C) RF Clear Receive Finish. Очищает соответствующий бит маски в регистре SPI_ILAT.
0 Не дает эффекта.
1 Очищает бит маски.
9 (R/W1C) TS Clear Transmit Start. Очищает соответствующий бит маски в регистре SPI_ILAT.
0 Не дает эффекта.
1 Очищает бит маски.
8 (R/W1C) RS Clear Receive Start. Очищает соответствующий бит маски в регистре SPI_ILAT.
0 Не дает эффекта.
1 Очищает бит маски.
7 (R/W1C) MF Clear Mode Fault. Очищает соответствующий бит маски в регистре SPI_ILAT.
0 Не дает эффекта.
1 Очищает бит маски.
6 (R/W1C) TC Clear Transmit Collision. Очищает соответствующий бит маски в регистре SPI_ILAT.
0 Не дает эффекта.
1 Очищает бит маски.
5 (R/W1C) TUR Clear Transmit Underrun. Очищает соответствующий бит маски в регистре SPI_ILAT.
0 Не дает эффекта.
1 Очищает бит маски.
4 (R/W1C) ROR Clear Receive Overrun. Очищает соответствующий бит маски в регистре SPI_ILAT.
0 Не дает эффекта.
1 Очищает бит маски.
2 (R/W1C) TUWM Clear Transmit Urgent Watermark. Очищает соответствующий бит маски в регистре SPI_ILAT.
0 Не дает эффекта.
1 Очищает бит маски.
1 (R/W1C) RUWM Clear Receive Urgent Watermark. Очищает соответствующий бит маски в регистре SPI_ILAT.
0 Не дает эффекта.
1 Очищает бит маски.

Регистр SPI_IMSK демаскирует (разрешает) или маскирует (запрещает) отдельные прерывания SPI. Когда условие прерывания показывается битом в регистре SPI_STAT, и соответствующее прерывание демаскировано в регистре SPI_IMSK, то SPI защелкивает бит соответствующий прерывания в регистре SPI_ILAT, ставя в очередь обработчик прерывания.

По умолчанию (после сброса/включения питания) все прерывания замаскированы (запрещены), потому что во всех битах регистра SPI_IMSK записаны нули.

ADSP BF70x SPI IMSK fig29 25

Рис. 29-25. Регистр SPI_IMSK.

Бит
(доступ)
Имя Описание
11 (R/NW) TF Transmit Finish. Разрешает или запрещает прерывание завершения передачи.
0 Запрещает (маскирует) прерывание.
1 Разрешает (демаскирует) прерывание.
10 (R/NW) RF Receive Finish. Разрешает или запрещает прерывание завершения приема.
0 Запрещает (маскирует) прерывание.
1 Разрешает (демаскирует) прерывание.
9 (R/NW) TS Transmit Start. Разрешает или запрещает прерывание запуска передачи.
0 Запрещает (маскирует) прерывание.
1 Разрешает (демаскирует) прерывание.
8 (R/NW) RS Receive Start. Разрешает или запрещает прерывание запуска приема.
0 Запрещает (маскирует) прерывание.
1 Разрешает (демаскирует) прерывание.
7 (R/NW) MF Mode Fault. Разрешает или запрещает прерывание ошибки режима.
0 Запрещает (маскирует) прерывание.
1 Разрешает (демаскирует) прерывание.
6 (R/NW) TC Transmit Collision. Разрешает или запрещает прерывание коллизии передачи.
0 Запрещает (маскирует) прерывание.
1 Разрешает (демаскирует) прерывание.
5 (R/NW) TUR Transmit Underrun. Разрешает или запрещает прерывание недогрузки передачи.
0 Запрещает (маскирует) прерывание.
1 Разрешает (демаскирует) прерывание.
4 (R/NW) ROR Receive Overrun. Разрешает или запрещает прерывание переполнения приема.
0 Запрещает (маскирует) прерывание.
1 Разрешает (демаскирует) прерывание.
2 (R/NW) TUWM Transmit Urgent Watermark. Разрешает или запрещает прерывание превышения границы опустошения буфера передачи.
0 Запрещает (маскирует) прерывание.
1 Разрешает (демаскирует) прерывание.
1 (R/NW) RUWM Receive Urgent Watermark. Разрешает или запрещает прерывание превышения границы заполнения буфера передачи.
0 Запрещает (маскирует) прерывание.
1 Разрешает (демаскирует) прерывание.

Регистр SPI_IMSK_CLR разрешает очистку отдельных бит маски в регистре SPI_IMSK без влияния на другие биты регистра. Используйте операцию write-1-to-clear (W1C, запись единицы в бит для его очистки) над регистром SPI_IMSK_CLR, чтобы очистить соответствующий бит регистра SPI_IMSK.

ADSP BF70x SPI IMSK CLR fig29 26

Рис. 29-26. Регистр SPI_IMSK_CLR.

Бит
(доступ)
Имя Описание
11 (R/W1C) TF Clear Transmit Finish. Очищает бит маски события завершения передачи.
0 Не оказывает эффекта.
1 Очищает бит маски.
10 (R/W1C) RF Clear Receive Finish. Очищает бит маски события завершения приема.
0 Не оказывает эффекта.
1 Очищает бит маски.
9 (R/W1C) TS Clear Transmit Start. Очищает бит маски события запуска передачи.
0 Не оказывает эффекта.
1 Очищает бит маски.
8 (R/W1C) RS Clear Receive Start. Очищает бит маски события запуска приема.
0 Не оказывает эффекта.
1 Очищает бит маски.
7 (R/W1C) MF Clear Mode Fault. Очищает бит маски события ошибки режима.
0 Не оказывает эффекта.
1 Очищает бит маски.
6 (R/W1C) TC Clear Transmit Collision. Очищает бит маски события коллизии передачи.
0 Не оказывает эффекта.
1 Очищает бит маски.
5 (R/W1C) TUR Clear Transmit Underrun. Очищает бит маски события недогрузки передачи.
0 Не оказывает эффекта.
1 Очищает бит маски.
4 (R/W1C) ROR Clear Receive Overrun. Очищает бит маски события переполнения приема.
0 Не оказывает эффекта.
1 Очищает бит маски.
2 (R/W1C) TUWM Clear Transmit Urgent Watermark. Очищает бит маски события превышения границы опустошения буфера передачи.
0 Не оказывает эффекта.
1 Очищает бит маски.
1 (R/W1C) RUWM Clear Receive Urgent Watermark. Очищает бит маски события превышения границы заполнения буфера передачи.
0 Не оказывает эффекта.
1 Очищает бит маски.

Регистр SPI_IMSK_SET разрешает установку отдельных бит маски в регистре SPI_IMSK без влияния на остальные биты. Используйте операцию write-1-to-set (W1S) над регистром SPI_IMSK_SET, чтобы установить соответствующий бит в регистре SPI_IMSK.

ADSP BF70x SPI IMSK SET fig29 27

Рис. 29-27. Регистр SPI_IMSK_SET.

Бит
(доступ)
Имя Описание
11 (R/W1S) TF Set Transmit Finish. Разрешает прерывание события завершения передачи.
0 Не оказывает эффекта.
1 Устанавливает бит маски.
10 (R/W1S) RF Set Receive Finish. Разрешает прерывание события завершения приема.
0 Не оказывает эффекта.
1 Устанавливает бит маски.
9 (R/W1S) TS Set Transmit Start.Разрешает прерывание события запуска передачи.
0 Не оказывает эффекта.
1 Устанавливает бит маски.
8 (R/W1S) RS Set Receive Start. Разрешает прерывание события запуска приема.
0 Не оказывает эффекта.
1 Устанавливает бит маски.
7 (R/W1S) MF Set Mode Fault. Разрешает прерывание события ошибки режима.
0 Не оказывает эффекта.
1 Устанавливает бит маски.
6 (R/W1S) TC Set Transmit Collision. Разрешает прерывание события коллизии передачи.
0 Не оказывает эффекта.
1 Устанавливает бит маски.
5 (R/W1S) TUR Set Transmit Underrun. Разрешает прерывание события недогрузки передачи.
0 Не оказывает эффекта.
1 Устанавливает бит маски.
4 (R/W1S) ROR Set Receive Overrun. Разрешает прерывание события переполнения приема.
0 Не оказывает эффекта.
1 Устанавливает бит маски.
2 (R/W1S) TUWM Set Transmit Urgent Watermark. Разрешает прерывание события превышения границы опустошения буфера передачи.
0 Не оказывает эффекта.
1 Устанавливает бит маски.
1 (R/W1S) RUWM Set Receive Urgent Watermark. Разрешает прерывание события превышения границы заполнения буфера передачи.
0 Не оказывает эффекта.
1 Устанавливает бит маски.

Регистр SPI_MMRDH разрешает использовать режим memory-mapped. Этот режим позволяет прямой, привязанный к адресному пространству процессора, доступ к устройству памяти SPI, и это главным образом используется для выполнения инструкций ассемблера из памяти SPI FLASH без использования низкоуровневого программного драйвера. Все дополнительные задачи  по обеспечению этого доступа, такие как передача заголовка чтения, переключение направления выводов SPI и прием данных нужного размера, берет на себя аппаратура SPI.

Режим доступа memory-mapped разрешается установкой SPI_CTL.MMSE. Функции регистра SPI_MMRDH включают настройку режима пропуска команды SPI-устройства памяти (command skip mode), байт переменной длины адресации и независимая многовыводная поддержка передачи команды, адреса и приема данных. Дополнительно opcod команды и байты режима полностью программируются.

ADSP BF70x SPI MMRDH fig29 28

Рис. 29-28. Регистр SPI_MMRDH.

Бит
(доступ)
Имя Описание
29 (R/W) CMDPINS Pins Used for Command. Бит SPI_MMRDH.CMDPINS задает количество бит, используемых для передачи команды. Этот бит должен быть установлен в соответствии со спецификациями, установленными командой чтения (read opcode). Аппаратура не интерпретирует SPI_MMRDH.OPCODE, но вместо этого полагается на этот бит для указания соответствующего поведения. Когда этот бит очищен, отменяется действие битов SPI_CTL.MIOM. Когда установлен, то используется настройка бит SPI_CTL.MIOM.
0 Используется только 1 вывод: MOSI (действие бит SPI_CTL.MIOM отменяется).
1 Используются выводы, указанные битами SPI_CTL.MIOM.
28 (R/W) CMDSKIP Command Skip Enable. Бит SPI_MMRDH.CMDSKIP разрешает режим пропуска команды (command skip mode), когда адрес посылается первым и поле OPCODE не передается (SPI_MMRDH.CMDSKIP=1). Этот режим полезен для поддержки XIP (Execute-In-Place, выполнение программы прямо из микросхемы памяти SPI), когда посылается только адрес, и подразумевается та же команда чтения. Устройство SPI flash должно быть настроено начальной командой чтения перед тем, как будет установлен бит SPI_MMRDH.CMDSKIP.
0 Поле OPCODE посылается первым, за ним идет адрес.
1 Поле OPCODE не посылается; первым посылается адрес.
25:24 (R/W) TRIDMY Tristate Dummy Timing. Биты SPI_MMRDH.TRIDMY определяют, как будет работать (и будет ли использоваться вообще) так называемый период пустого тактирования, в котором выводы SPI находятся в третьем состоянии на длительность, определяемую битами SPI_MMRDH.DMYSIZE. Выходные выводы, переходящие в третье состояние включают все выводы, которые использовались для передачи адреса.
0 Выходы переходят в третье состояние немедленно.
1 Выходы переходят в третье состояние после 4 бит передачи пустого периода/режима (dummy/mode).
2 Выходы переходят в третье состояние после 8 бит передачи пустого периода/режима (dummy/mode).
3 Выходы не переходят в третье состояние (удерживается предыдущее состояние выходов).
23:16 (R/W) MODE Mode Field. Эти биты указывают лидирующий байт для передаче в интервал времени, заданный полем бит SPI_MMRDH.DMYSIZE. Этот первый байт или его часть интерпретируется как биты режима, когда определенные коды операций (opcode) используются вместе с определенными устройствами памяти SPI. Биты MODE отправляются с использованием того же количества выводов, которое используется для передачи адреса. После отправки выходные выводы будут удерживаться в своем конечном результирующем состоянии до наступления периодов пустого байта (dummy byte periods), если не задан переход выходов в третье состояние битами SPI_MMRDH.TRIDMY.
14:12 (R/W) DMYSIZE Bytes of Dummy/Mode. Поле бит SPI_MMRDH.DMYSIZE задает количество "пустых" байт, отделяющих передачу адреса и возврат читаемых данных. Подразумевается, что пустые байты передаются через то же количество выводов, используемое для передачи адреса. Значение этого поля задает количество байт (от 0 до 7).
11 (R/W) ADRPINS Pins Used for Address. Бит SPI_MMRDH.ADRPINS задает количество выводов, используемое для передачи адреса. Этот бит должен быть установлен в соответствии с установкой read opcode. Аппаратура не интерпретирует SPI_MMRDH.OPCODE, но вместо этого использует этот бит для определения поведения.
0 Используется только один вывод: MOSI (отменяется действие битов SPI_CTL.MIOM).
1 Используются выводы, заданные битами SPI_CTL.MIOM.
10:8 (R/W) ADRSIZE Bytes of Read Address. Поле бит SPI_MMRDH.ADRSIZE задает количество байт, используемое для адреса чтения. Адрес чтения передается немедленно за передачей opcode. В отличие от битов opcode биты адреса могут быть переданы с использованием либо одного, либо нескольких выводов. Количество выводов выбирается с использованием бита SPI_MMRDH.ADRPINS. Адрес отправляется в подключенное устройство памяти SPI является эхом адреса чтения, принятого по slave-порту периферии SPI. Младшие байты адреса отправляются отправляются, когда весь адрес весь адрес не отправлен.
0 1 байт.
1 1 байт.
2 2 байта.
3 3 байта.
4 4 байта.
7:0 (R/W) OPCODE Read Opcode. Поле бит SPI_MMRDH.OPCODE задает начальные биты, передаваемые в ответ на заброс чтения памяти SPI. Хотя может быть отправлен любой opcode, значения 0x03, 0x0B, 0x3B, 0x6B, 0xBB и 0xEB будут использовать больше всего. SPI_MMRDH.OPCODE отправляется интерфейсом SPI без интерпретации; состояние этих бит не имеет эффекта вне того, что изначально было передано через интерфейс SPI.

Регистр SPI_MMTOP указывает верхний адрес, который предоставляется подключенным устройством памяти SPI.

ADSP BF70x SPI MMTOP fig29 29

Рис. 29-29. Регистр SPI_MMTOP.

Биты 31:0 TOPADR (R/W) задают верхний адрес памяти SPI. Попытки доступа к памяти SPI не блокируются, если не превышен этот указанный адрес. В противном случае генерируется ошибка как часть ответа чтения.

Регистр SPI_RFIFO служит интерфейсом доступа к регистру сдвига приема, через него он подключается к шине данных процессора. На верхнем уровне буфер виден в программе как 32-битный регистр SPI_RFIFO, но размер буфера FIFO приема (количество ячеек в буфере FIFO) в действительности гибко зависит от размера слова. Если длина слова составляет 8 бит, то глубина FIFO равна 8 слов, если размер слова 16 бит, то глубина FIFO равна 4, или если размер слова 32 бита, то глубина FIFO равна 2.

Как master, так и slave может остановить или приостановить прием на основе состояния заполненности FIFO. Когда FIFO заполнен, SPI master останавливает инициацию новых передач SPI, если разрешен бит SPI_RXCTL.RTI. Устройство slave может приостановить интерфейс SPI, когда содержимое FIFO пересекает выбранную границу (watermark). Если прием данных продолжается после того, как SPI_RFIFO заполнен, данные в приемном FIFO становятся недостоверными. SPI показывает это событие ошибкой переполнения приема(receive overrun, бит SPI_STAT.ROR). Это событие возможно, когда SPI_RXCTL.RTI=0 и SPI_RXCTL.REN=1 для master, или для slave, который не задействует управление потоком (flow control).

Обратите внимание, что FIFO приема сбрасывается (очищается), когда SPI запрещается после того, как он был разрешен.

ADSP BF70x SPI RFIFO fig29 30

Рис. 29-30. Регистр SPI_RFIFO.

Биты 31:0 DATA (R/NW) Receive FIFO Data. Поле бит SPI_RFIFO.DATA содержит принятые данные буфера FIFO.

Регистр SPI_RWC содержит счетчик количества оставшихся слов для приема. Чтобы начать декремент счетчика слов в SPI_RWC, разрешите этот счетчик (SPI_RXCTL.RWCEN=1). SPI использует счетчик слов для управления длительностью передач и сигнализации о завершении передачи пакета данных (burst) с помощью прерывания финиша приема (SPI_ILAT.RF). В режиме DMA, SPI использует регистр SPI_RWC для гарантии, что количество принятых фреймов через перемещение данных DMA равно количество слов, запрограммированному в канал контроллера DMA. Значения, запрограммированные в регистры SPI_RWC, должны соответствовать счетчику слов конфигурации DMA. Регистр SPI_RWC содержит количество фреймов, которое нужно принять. SPI_RWC должен меняться только тогда, когда этот счетчик запрещен.

ADSP BF70x SPI RWC fig29 31

Рис. 29-31. Регистр SPI_RWC.

15:0 VALUE (R/W) Received Word Count. Биты SPI_RWC.VALUE содержат счетчик слов приема.

Регистр SPI_RWCR хранит количество слов счетчика, которое SPI загрузит в регистр SPI_RWC, когда счетчик приема достигает нуля. Чтобы предотвратить перезагрузку счетчика, используйте 0 для значения перезагрузки. Регистр SPI_RWCR должен меняться только когда работа счетчика запрещена.

ADSP BF70x SPI RWCR fig29 32

Рис. 29-32. Регистр SPI_RWCR.

15:0 VALUE (R/W) Received Word Count Reload. Биты SPI_RWCR.VALUE содержат значение для перезагрузки счетчика слов приема.

Регистр SPI_RXCTL разрешает канал приема SPI инициирует перемещения данных приема и конфигурирует настройки границы (watermark) буфера SPI_RFIFO.

ADSP BF70x SPI RXCTL fig29 33

Рис. 29-33. Регистр SPI_RXCTL.

Бит
(доступ)
Имя Описание
18:16 (R/W) RUWM Receive FIFO Urgent Watermark. Биты RUWM выбирают границу (watermark) заполнения буфера FIFO приема (SPI_RFIFO) для срочных (urgent) запросов шины данных. SPI также использует эту watermark для генерации прерывания SPI_ILAT.RUWM. Когда разрешена urgent SPI_RFIFO watermark битами RUWM, эти биты используются как условия снятия для любых захваченных прерываний SPI_ILAT.RUWM.
0 Запрещено.
1 На 25% заполненный RFIFO.
2 На 50% заполненный RFIFO.
3 На 75% заполненный RFIFO.
4 Заполненный RFIFO.
5..7 Зарезервировано.
13:12 (R/W) RRWM Receive FIFO Regular Watermark. Биты RRWM bits выбирают уровень заполненности FIFO приема (SPI_RFIFO) для обычных запросов шины данных. Когда разрешена urgent SPI_RFIFO watermark битами SPI_RXCTL.RUWM, выбор SPI_RXCTL.RRWM используется как условие снятия для любых захваченных прерываний SPI_ILAT.RUWM.
0 Пустой RFIFO.
1 RFIFO заполнен меньше чем на 25%.
2 RFIFO заполнен меньше чем на 50%.
3 RFIFO заполнен меньше чем на 75%.
6:4 (R/W) RDR Receive Data Request. Биты RDR выбирают условие границы заполненности FIFO приема (SPI_RFIFO), которое напрямую генерирует запрос данных приема SPI.
0 Запрещено.
1 Не пустой RFIFO.
2 На 25% заполненный RFIFO.
3 На 50% заполненный RFIFO.
4 На 75% заполненный RFIFO.
5 Заполненный RFIFO.
6, 7 Зарезервировано.
3 (R/W) RWCEN Receive Word Counter Enable. Бит RWCEN разрешает декрементирование регистра счетчика SPI_RWC, когда этот счетчик не равен 0, и разрешен бит SPI_RXCTL.RTI. Разрешение SPI_RXCTL.RWCEN предотвращает возникновение ошибок переполнения приема. Бит SPI_RXCTL.RWCEN допустим только когда SPI работает как master.
0 Запрещено.
1 Разрешено.
2 (R/W) RTI Receive Transfer Initiate. Бит SPI_RXCTL.RTI разрешает инициацию переносов данных приема, если FIFO приема (SPI_RFIFO) не заполнен. Этот бит также разрешает инициацию, если SPI_RWC не равен 0, когда разрешен SPI_RXCTL.RWCEN. Разрешение RTI предотвращает возникновение переполнения приема. Бит RTI допустим только когда SPI работает как master.
0 Запрещено.
1 Разрешено.
0 (R/W) REN Receive Enable. Бит SPI_RXCTL.REN разрешает работу канала приема SPI.
0 Запрещено.
1 Разрешено.

Регистр SPI_SLVSEL разрешает выводы SPI_SEL[n] для работы на выход, и показывает состояние (лог. 1 или лог. 0) этих выводов, когда эта функция разрешена.

ADSP BF70x SPI SLVSEL fig29 34

Рис. 29-34. Регистр SPI_SLVSEL.

Бит
(доступ)
Имя Описание
15 (R/W) SSEL7 Slave Select 7 Output. Состояние бита SSEL7 показывает значение, которое выводится на соответствующем выводе ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.
14 (R/W) SSEL6 Slave Select 6 Output. Состояние бита SSEL6 показывает значение, которое выводится на соответствующем выводе ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.
13 (R/W) SSEL5 Slave Select 5 Output. Состояние бита SSEL5 показывает значение, которое выводится на соответствующем выводе ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.
12 (R/W) SSEL4 Slave Select 4 Output. Состояние бита SSEL4 показывает значение, которое выводится на соответствующем выводе ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.
11 (R/W) SSEL3 Slave Select 3 Output. Состояние бита SSEL3 показывает значение, которое выводится на соответствующем выводе ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.
10 (R/W) SSEL2 Slave Select 2 Output. Состояние бита SSEL2 показывает значение, которое выводится на соответствующем выводе ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.
9 (R/W) SSEL1 Slave Select 1 Output. Состояние бита SSEL1 показывает значение, которое выводится на соответствующем выводе ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.
7 (R/W) SSE7 Slave Select 7 Enable. Бит SPI_SLVSEL.SSE7 разрешает вывод ~SPI_SEL[n] для выхода. Если запрещено, SPI переводит в третье состояние соответствующий вывод ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.
6 (R/W) SSE6 Slave Select 6 Enable. Бит SPI_SLVSEL.SSE6 разрешает вывод ~SPI_SEL[n] для выхода. Если запрещено, SPI переводит в третье состояние соответствующий вывод ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.
5 (R/W) SSE5 Slave Select 5 Enable. Бит SPI_SLVSEL.SSE5 разрешает вывод ~SPI_SEL[n] для выхода. Если запрещено, SPI переводит в третье состояние соответствующий вывод ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.
4 (R/W) SSE4 Slave Select 4 Enable. Бит SPI_SLVSEL.SSE4 разрешает вывод ~SPI_SEL[n] для выхода. Если запрещено, SPI переводит в третье состояние соответствующий вывод ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.
3 (R/W) SSE3 Slave Select 3 Enable. Бит SPI_SLVSEL.SSE3 разрешает вывод ~SPI_SEL[n] для выхода. Если запрещено, SPI переводит в третье состояние соответствующий вывод ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.
2 (R/W) SSE2 Slave Select 2 Enable. Бит SPI_SLVSEL.SSE2 разрешает вывод ~SPI_SEL[n] для выхода. Если запрещено, SPI переводит в третье состояние соответствующий вывод ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.
1 (R/W) SSE1 Slave Select 1 Enable. Бит SPI_SLVSEL.SSE1 разрешает вывод ~SPI_SEL[n] для выхода. Если запрещено, SPI переводит в третье состояние соответствующий вывод ~SPI_SEL[n].
0 Лог. 0.
1 Лог. 1.

Регистр SPI_STAT показывает состояние SPI включая состояние FIFO, события ошибки и события прерываний. Когда условие прерывания в этом регистре демаскировано (разрешено) соответствующим битом в регистре SPI_IMSK, то прерывание защелкивается в соответствующий бит в регистре SPI_ILAT.

ADSP BF70x SPI STAT fig29 35

Рис. 29-35. Регистр SPI_STAT.

Бит
(доступ)
Имя Описание
31 (R/W1C) MMAE Memory Mapped Access Error. Бит MMAE=1, если была сделана попытка доступа либо к TX, либо к RX FIFO, когда был разрешен доступ memory-mapped к памяти SPI (см. описание бита SPI_CTL.MMSE). Бит MMAE=0, когда в него записывается 1. Бит MMAE предоставляется только для оповещения программного обеспечения. Его состояние не дает никакого дополнительного эффекта.
29 (R/W1C) MMRE Memory Mapped Read Error. Бит SPI_STAT.MMRE bit=1, если была сделана попытка прочитать адресное пространство, зарезервированное для памяти memory-mapped SPI, когда memory mapping запрещен (см. описание бита SPI_CTL.MMSE). Бит MMRE=0, когда в него записывается 1. Этот бит предоставляется только для оповещения программного обеспечения. Его состояние не дает никакого дополнительного эффекта.
28 (R/W1C) MMWE Memory Mapped Write Error. Бит MMWE=1, если была сделана попытка записи в адресное пространство, зарезервированное для memory-mapped памяти SPI. Бит MMWE=0, когда в него записывается 1. Этот бит предоставляется только для оповещения программного обеспечения. Его состояние не дает никакого дополнительного эффекта.
23 (R/NW) TFF SPI_TFIFO Full. Бит TFF показывает, заполнен SPI_TFIFO, или нет.
0 TX FIFO не заполнен.
1 TX FIFO заполнен.
22 (R/NW) RFE SPI_RFIFO Empty. Бит RFE показывает, пуст SPI_RFIFO, или не пуст.
0 RX FIFO не пуст.
1 RX FIFO пуст.
20 (R/NW) FCS Flow Control Stall Indication. Бит FCS показывает, что slave-устройство сняло сигнал готовности SPI_RDY, чтобы приостановить SPI master, когда slave не может обработать запрос SPI master. Этот бит допустим только когда SPI работает как master (SPI_CTL.MSTR=1), и разрешено управление потоком (SPI_CTL.FCEN=1).
0 No Stall, нет приостановки (на выводе SPI_RDY выставлен сигнал готовности).
1 Stall, приостановка (с вывода SPI_RDY снят сигнал готовности).
18:16 (R/NW) TFS SPI_TFIFO Status. Биты TFS показывают состояние SPI_TFIFO. SPI использует этот статус, когда вычисляет события нарушения границы заполненности FIFO передачи (transmit watermark).
0 TFIFO заполнен.
1 TFIFO опустошен на 25%.
2 TFIFO опустошен на 50%.
3 TFIFO опустошен на 75%.
4 Пустой TFIFO.
14:12 (R/NW) RFS SPI_RFIFO Status. Биты RFS показывают состояние SPI_RFIFO. SPI использует эти биты, когда вычисляет события нарушения границы заполненности FIFO приема (receive watermark).
0 Пустой RFIFO.
1 На 25% заполненный RFIFO.
2 На 50% заполненный RFIFO.
3 На 75% заполненный RFIFO.
4 Заполненный RFIFO.
11 (R/W1C) TF Transmit Finish Indication. Бит TF показывает, что SPI определил завершение пакета передачи (декременты счетчика SPI_TWC достигли 0). Это событие может произойти только когда разрешены SPI_TXCTL.TTI и SPI_TXCTL.TWCEN.
0 Нет статуса.
1 Детектировано завершение пакета передачи.
10 (R/W1C) RF Receive Finish Indication. Бит RF показывает, что SPI определил завершение пакетного переноса данных приема (декременты счетчика SPI_RWC достигли 0). Это условие может произойти только когда разрешены SPI_RXCTL.RTI и SPI_RXCTL.RWCEN.
0 Нет статуса.
1 Детектировано завершение пакета приема.
9 (R/W1C) TS Transmit Start. Бит TS показывает, что SPI определил начала передачи пакета (burst transfer). Передача пакета начинается с загрузки SPI_TWC из SPI_TWCR. Это событие может произойти только когда разрешены SPI_TXCTL.TTI и SPI_TXCTL.TWCEN.
0 Нет статуса.
1 Детектирован старт передачи пакета.
8 (R/W1C) RS Receive Start. Бит RS показывает, что SPI определил начала приема пакета (burst transfer). Прием пакета начинается с загрузки SPI_RWC из SPI_RWCR. Это событие может произойти только когда разрешены SPI_RXCTL.RTI и SPI_RXCTL.RWCEN.
0 Нет статуса.
1 Детектирован старт приема пакета.
7 (R/W1C) MF Mode Fault Indication. Бит MF, когда SPI работает как master, и разрешен SPI_CTL.PSSE, показывает, что несколько устройств master выставили входы slave select.
0 Нет статуса.
1 Произошла ошибка режима (Mode Fault).
6 (R/W1C) TC Transmit Collision Indication. Бит TC, когда SPI работает как slave, показывает, что загрузка данных в регистр сдвига произошла слишком близко к первому перепаду передающего такта SPI.
0 Нет статуса.
1 Произошла коллизия передачи.
5 (R/W1C) TUR Transmit Underrun Indication. Бит TUR, когда буфер FIFO передачи (SPI_TFIFO) пуст, показывает, что последнее слово в FIFO передачи было повторно отправлено в качестве передаваемых данных. Альтернативно этот бит может показать, что вместо этих данных отправились нули (зависит от настроенной реакции на недогрузку передачи, см. описание бита SPI_TXCTL.TDU).
0 Нет статуса.
1 Произошла недогрузка передачи.
4 (R/W1C) ROR Receive Overrun Indication. Бит ROR когда заполнен буфер FIFO приема (SPI_RFIFO), показывает, что слово в FIFO приема было перезаписано пришедшими принятыми данными. Альтернативно этот бит может показать, что принятые банные были отброшены (зависит от настроенной реакции на переполнение приема).
0 Нет статуса.
1 Произошло переполнение приема.
2 (R/NW) TUWM Transmit Urgent Watermark Breached. Бит TUWM показывает, что достигнута граница срочной недогруженности передачи (transmit urgent watermark, SPI_TXCTL.TUWM). Это условие очищается, когда FIFO передачи достаточно заполнен, чтобы достичь transmit regular watermark (SPI_TXCTL.TRWM).
0 Достигнута TX regular watermark.
1 Нарушена TX urgent watermark.
1 (R/NW) RUWM Receive Urgent Watermark Breached. Бит RUWM показывает, что нарушена граница срочной заполненности буфера FIFO приема (receive urgent watermark, SPI_RXCTL.RUWM). Это условие очищается, когда буфер FIFO приема опустошится достаточно, чтобы достичь receive regular watermark (SPI_RXCTL.RRWM).
0 Достигнута RX regular watermark.
1 Нарушена RX urgent watermark.
0 (R/NW) SPIF SPI Finished. Бит SPI_STAT.SPIF показывает, что передача одного слова была завершена.
0 Нет статуса.
1 Завершена передача одного слова.

Регистр SPI_TFIFO служит интерфейсом между регистром сдвига передачи и шиной данных процессора. На верхнем уровне буфер виден в программах как 32-битный регистр SPI_TFIFO, но размер буфера (глубина FIFO, количество ячеек размером в слово) FIFO передачи в действительности гибко зависит от размера слова. Размер буфера передачи FIFO равен 8 для длины слова 8 бит, или 4 для длины слова 16 бит, или 2 для размера слова 32 бита.

И master, slave может остановить или приостановить перемещения данных передачи на основе состояния FIFO. Когда FIFO передачи пуст, SPI master останавливает инициацию новых передач если разрешен SPI_TXCTL.TTI. Устройство slave может приостановить интерфейс SPI, когда содержимое FIFO пересекает выбранную границу (watermark). Если запросы передачи данных продолжают поступать после опустошения SPI_TFIFO, то данные, отправляемые из FIFO, становятся недостоверными, и SPI показывает это событие ошибкой недогрузки передачи transmit underrun (бит SPI_STAT.TUR). Это событие возможно когда SPI_TXCTL.TTI=0 и SPI_TXCTL.TEN=1 для master, или для slave, который не использует управление потоком (flow control).

Обратите внимание, что FIFO передачи сбрасывается (очищается), когда SPI запрещается после того, как было разрешен.

ADSP BF70x SPI TFIFO fig29 36

Рис. 29-36. Регистр SPI_TFIFO.

31:0 DATA (R/W) Transmit FIFO Data. Поле бит SPI_TFIFO.DATA содержит передаваемые данные FIFO.

Регистр SPI_TWC содержит счетчик количества оставшихся слов для передачи. Чтобы начать декремент счетчика слов в SPI_TWC, разрешите этот счетчик (SPI_TXCTL.TWCEN=1). SPI использует счетчик слов для управления длительностью передач и сигнализации о завершении передачи пакета данных (burst) с помощью прерывания финиша передачи (SPI_ILAT.TF). В режиме DMA, SPI использует регистр SPI_TWC для гарантии, что количество переданных фреймов через DMA равно количество слов, запрограммированному в канал контроллера DMA. Значения, запрограммированные в регистры SPI_TWC, должны соответствовать счетчику слов конфигурации DMA. Регистр SPI_TWC содержит количество фреймов, которое нужно передать. SPI_TWC должен меняться только тогда, когда этот счетчик запрещен.

ADSP BF70x SPI TWC fig29 37

Рис. 29-37. Регистр SPI_TWC.

15:0 VALUE (R/W) Transmitted Word Count. Биты SPI_TWC.VALUE содержат счетчик слов передачи.

Регистр SPI_TWCR хранит количество слов счетчика, которое SPI загрузит в регистр SPI_TWC, когда счетчик передачи достигает нуля. Чтобы предотвратить перезагрузку счетчика, используйте 0 для значения перезагрузки. Регистр SPI_TWCR должен меняться только когда работа счетчика запрещена.

ADSP BF70x SPI TWCR fig29 38

Рис. 29-38. Регистр SPI_TWCR.

15:0 VALUE (R/W) Transmitted Word Count Reload. Биты SPI_TWCR.VALUE содержат значение перезагрузки для счетчика слов передачи.

Регистр SPI_TXCTL разрешает канал передачи SPI, инициирует передачи и конфигурирует границу буфера (watermark) SPI_TFIFO.

ADSP BF70x SPI TXCTL fig29 39

Рис. 29-39. Регистр SPI_TXCTL.

Бит
(доступ)
Имя Описание
18:16 (R/W) TUWM FIFO Urgent Watermark. Биты TUWM выбирают уровень границы заполненности буфера FIFO передачи (SPI_TFIFO) для срочных запросов шины данных (urgent data bus requests). SPI также использует этот уровень для генерации прерывания SPI_ILAT.TUWM. Когда разрешена urgent SPI_TFIFO watermark с помощью TUWM, выбор SPI_TXCTL.TRWM используется для снятия условия любых захваченных SPI_ILAT.TUWM прерываний.
0 Запрещено.
1 TFIFO опустошен на 25%.
2 TFIFO опустошен на 50%.
3 TFIFO опустошен на 75%.
4 Пустой TFIFO.
13:12 (R/W) TRWM FIFO Regular Watermark. Биты TRWM выбирают уровень границы заполненности буфера FIFO передачи (SPI_TFIFO) для обычных запросов шины данных. Когда разрешено прерывание urgent SPI_TFIFO watermark с помощью SPI_TXCTL.TUWM, выбор TRWM используется как условие снятия любых захваченных SPI_ILAT.TUWM прерываний.
0 Заполненный TFIFO.
1 TFIFO пуст меньше чем на 25%.
2 TFIFO пуст меньше чем на 50%.
3 TFIFO пуст меньше чем на 75%.
8 (R/W) TDU Transmit Data Underrun. Бит TDU выбирает обработку для запросов передачи данных, когда буфер FIFO передачи (SPI_TFIFO) пуст. Если этот бит =1, и SPI_TFIFO пуст, то SPI передает нулевые данные. Если этот бит =0, и SPI_TFIFO пуст, то SPI передает в качестве данных последнее слово.
0 Будет отправлено последнее слово, когда SPI_TFIFO пуст.
1 Будут отправляться нули, когда SPI_TFIFO пуст.
6:4 (R/W) TDR Transmit Data Request. Бит TDR выбирает условия границы опустошения буфера FIFO передачи (SPI_TFIFO), которая указывает SPI генерировать прерывание статуса передачи.
    0 Запрещено.
    1 TFIFO не заполнен.
    2 TFIFO пуст на 25%.
    3 TFIFO пуст на 50%.
    4 TFIFO пуст на 75%.
    5 Пустой TFIFO.
3 (R/W) TWCEN Transmit Word Counter Enable. Бит TWCEN разрешает декремент регистра счетчика слов (SPI_TWC), когда он не равен 0, и когда разрешен SPI_TXCTL.TTI. Разрешение TWCEN предотвращает появление ошибок недогрузки передачи. Бит допустим только когда SPI работает как master.
0 Запрещено.
1 Разрешено.
2 (R/W) TTI Transmit Transfer Initiate. Бит TTI разрешает инициацию передач, если буфер FIFO передачи (SPI_TFIFO) не пуст. Этот бит также разрешает такую инициацию, если SPI_TWC не 0, когда разрешен SPI_TXCTL.TWCEN. Разрешение TTI предотвращает появление ошибок недогрузки передачи. Бит TTI допустим только когда SPI работает как master.
0 Запрещено.
1 Разрешено.
0 (R/W) TEN Transmit Enable. Бит TEN разрешает работу канала передачи SPI.
0 Запрещено.
1 Разрешено.

[Диаграммы SPI]

Таблица 54 и рис. 31 описывают операции порта SPI master. При генерации тактов внутри кристалла программируемая частота тактов SPI (fSPICLKPROG) в МГц устанавливается следующим выражением, где BAUD является полем регистра SPI_CLK, которое может быть установлено в диапазоне 0 .. 65535:

                fSCLK0
fSPICLKPROG = ----------
               (BAUD+1)
                             1
tSPICLKPROG = -----------
             fSPICLKPROG

Имейте в виду:

• В двойном режиме передачи данных (dual mode) сигнал SPI_MISO работает также как выход (и MOSI, и MISO работают в одном направлении).
• В счетверенном режиме передачи данных (quad mode) сигналы SPI_MISO, SPI_D2 и SPI_D3 также работают как выходы.
• В двойном режиме приема SPI_MOSI также работает как вход (и MOSI, и MISO работают в одном направлении).
• В счетверенном режиме приема сигналы SPI_MOSI, SPI_D2 и SPI_D3 также работают как входы.
• Для добавления дополнительных фреймов задержки см. документацию по регистру SPI_DLY в руководстве по аппаратуре (hardware reference manual [2]).

Таблица 54. Интервалы времени порта SPI в режиме Master.

Параметр
Описание
VDD_EXT 1.8V
VDD_EXT 3.3V
Ед.
MIN MAX MIN MAX
Требования к интервалам времени
tSSPIDM Входные данные достоверны до перепада SPI_CLK (время установки входных данных) 6.5   5.5   нс
tHSPIDM Интервал от перепада выборки SPI_CLK до недостоверных входных данных 1   1   нс
Характеристики переключения
tSDSCIM Интервал между ~SPI_SEL=0 до первого перепада SPI_CLK (0.5 x tSCLK0) – 2.5   (0.5 x tSCLK0) – 1.5   нс
tSPICHM
Интервал SPI_CLK=1 1 (0.5 x tSPICLKPROG) – 1.5   (0.5 x tSPICLKPROG) – 1.5   нс
tSPICLM Интервал SPI_CLK=0 1
tSPICLK Период SPI_CLK 1 tSPICLKPROG – 1.5   tSPICLKPROG – 1.5   нс
tHDSM Интервал от последнего перепада SPI_CLK до ~SPI_SEL=1 (0.5 x tSCLK0) – 2.5   (0.5 x tSCLK0) – 1.5   нс
tSPITDM Последовательная задержка между передачами2 (STOP x tSPICLK) – 1.5   (STOP x tSPICLK) – 1.5   нс
tDDSPIDM Интервал между перепадом SPI_CLK до достоверных выходных данных (задержка вывода данных)   2.5   2 нс
tHDSPIDM Интервал между перепадом SPI_CLK до недостоверных выходных данных (удержание выходных данных) -4.5   -3.5   нс

Примечания:

1. Для получения подробностей по минимальному периоду, который может быть запрограммирован для tSPICLKPROG, см. таблицу 18 раздела "Clock Related Operating Conditions" из даташита .
2. Значение STOP устанавливается битами SPI_DLY.STOP.

ADSP BF70x SPI Master fig31

Таблица 55 и рис. 32 описывают операции порта SPI slave. Имейте в виду:

• В двойном режиме передачи данных (dual mode) сигнал SPI_MISO работает также как выход (и MOSI, и MISO работают в одном направлении).
• В счетверенном режиме передачи данных (quad mode) сигналы SPI_MISO, SPI_D2 и SPI_D3 также работают как выходы.
• В двойном режиме приема SPI_MOSI также работает как вход (и MOSI, и MISO работают в одном направлении).
• В счетверенном режиме приема сигналы SPI_MOSI, SPI_D2 и SPI_D3 также работают как входы.
• В режиме SPI slave такты SPI предоставляются внешним устройством master, и называются fSPICLKEXT:

                1
tSPICLKEXT = ----------
            fSPICLKEXT

Таблица 55. Интервалы времени порта SPI в режиме Slave.

Параметр
Описание
VDD_EXT 1.8V
VDD_EXT 3.3V
Ед.
MIN MAX MIN MAX
Требования к интервалам времени
tSPICHS
Интервал SPI_CLK=1 1 (0.5 x tSPICLKEXT) – 1.5   (0.5 x tSPICLKEXT) – 1.5   нс
tSPICLS Интервал SPI_CLK=0 1
tSPICLK Период SPI_CLK 1 tSPICLKEXT – 1.5   tSPICLKEXT – 1.5   нс
tHDS Интервал от последнего перепада SPI_CLK до не активного состояния ~SPI_SS 5   5   нс
tSPITDS Последовательная задержка между передачами (не SPIHP) 1.5 x tSCLK0   1.5 x tSCLK0   нс
tSPITDS Последовательная задержка между передачами (SPIHP) 3 x tSCLK0   3 x tSCLK0   нс
tSDSCI Интервал от активации ~SPI_SEL до первого перепада SPI_CLK 11.5   11.5   нс
tSSPID Интервал достоверности входных данных до перепада SPI_CLK (установка входных данных) 1.5   1   нс
tHSPID Интервал между перепадом SPI_CLK до недостоверных входных данных 3.3   3   нс
Характеристики переключения
tDSOE Интервал между активацией ~SPI_SS до активации выхода 0 17.5 0 14.5 нс
tDSDHI Интервал между деактивацией ~SPI_SS до перехода выхода в состояние высокого сопротивления 0 13 0 11.5 нс
tDDSPID Интервал от перепада SPI_CLK до достоверных выходных данных (задержка появления выходных данных)   17.5   14.5 нс
tHDSPID Интервал от перепада SPI_CLK до недостоверных выходных данных (время удержания выходных данных) 2.5   2.5   нс

Примечание 1: эта спецификация показывает минимальную немедленную ширину или период, на который имеется допуск, учитывающий изменение скважности тактов или их дрожание на внешнем сигнале SPI_CLK. Для внешнего SPI_CLK идеальный максимум частоты можно увидеть в спецификации fSPICLKTEXT из таблицы 18 раздела "Clock Related Operating Conditions" даташита [1].

ADSP BF70x SPI Slave fig32

Другие диаграммы времени (сигнал SPI_RDY режимов Master и Slave, режим выхода с открытым стоком Master и Slave и т. д.) см. в даташите [1].

[Ссылки]

1. Blackfin+ Core Embedded Processor ADSP-BF700/701/702/703/704/705/706/707 site:analog.com.
2. ADSP-BF70x Blackfin+ Processor Hardware Reference site:analog.com.
3. Интерфейс SPI.