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 поддерживает следующие функции: • Полнодуплексный, синхронный последовательный интерфейс. [Функциональное описание 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.
Таблица 29-2. Список прерываний SPI ADSP-BF70x.
Таблица 29-3. Список триггеров ADSP-BF70x SPI master-устройств.
Таблица 29-4. Список триггеров ADSP-BF70x SPI slave-устройств.
Таблица 29-5. Список каналов DMA интерфейса SPI процессора ADSP-BF70x.
[Блок-схема SPI] Блок-схема контроллера SPI показывает отдельные блоки модуля SPI. Модуль включает в себя 3 основные части: • Ядро SPI, содержащее регистры данных FIFO приема и передачи, и связанные с ними регистры сдвига. Рис. 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. Рис. 29-2. Протокол передачи SPI для CPHA=0. Рис. 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-устройства. Рис. 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 активен постоянно. Рис. 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 иллюстрирует эти интервалы времени. Рис. 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. Рис. 29-7. Конфигурация один master, несколько slave. Начало и завершение переноса данных SPI без DMA. Старт и финиш non-DMA SPI зависит от следующих установок: 1. Как сконфигурировано устройство - как master или как slave. Когда 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 раза. Рис. 29-8. Протокол передачи Dual I/O Mode для CPHA=0, SOSI=1, фрейм 8 бит, LSBF=0. Рис. 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_CTL.SOSI очищен, порядок меняется на обратный. Поскольку quad SPI использует все 4 вывода для передачи или приема данных, только один канал может быть разрешен - либо передача, либо прием. Поддерживается управление потоком выводом SPI_RDY. На генерацию прерывания режим quad SPI не влияет. Переход к режиму quad SPI должен быть осуществлен, когда SPI находится в режиме "молчания". Рис. 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 выдает данные для одного полного такта. Рис. 29-11. Протокол SPI в Fast Mode для SPI_CTL.CPHA=0. Рис. 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. Типы операций.
[Описание работы 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 начинается с активации выборки 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. Рис. 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, находящегося в этом режиме. Рис. 29-14. Протокол Memory-Mapped интерфейса SPI. Как показано на рисунке, поле команды COMMAND (SPI_MMRDH.OPCODE) передается при выставлении сигнала выборки SPI_SEL[n]. Память SPI интерпретирует это 8-битное значение как команду чтения. Разрешается любой 8-битный код операции (opcode), который по интервалам времени совместим с SPI процессора и рассчитан на предоставленную аппаратуру memory-mapped, чаще всего он будет: • Standard Read, стандартное чтение (0x03) ЗАМЕЧАНИЕ: аппаратура 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).
Этот период пустого тактирования позволяет передать биты режима, перейти выводам в третье состояние, и переключиться выводам к подготовке к приему данных. [Memory-Mapped доступ чтения] Аппаратура SPI поддерживает наиболее часто используемые операции чтения. • 2 стандартных чтения SPI (чтение и быстрое чтение), которые используют однонаправленные выводы SPI_MOSI и SPI_MISO в дополнение к выводам SPI_SEL[n] и SPI_CLK. Таблица операций чтения SPI 29-8 и рисунки 29-15 .. 29.19 показывают типы операций чтения. Программируйте каждую операцию чтения способом, который совместим с описанием в даташите имеющейся SPI flash. Таблица 29-8. Операции чтения SPI.
Некоторые устройства памяти также поддерживают операции слова quad I/O read (0xE7) и octal quad I/O read (0xE3). Эти операции требуют меньше тактов dummy, чем обычные счетверенные операции ввода/вывода чтения (normal quad I/O read). Рис. 29-15. Последовательность SPI Flash Fast Read. M = 1, 2, 3, 4 (байты адреса) Рис. 29-16. Последовательность SPI Flash Fast Read (Dual Output). M = 1, 2, 3, 4 (байты адреса) Рис. 29-17. Последовательность SPI Flash Fast Read (Dual I/O). M = 1, 2, 3, 4 (байты адреса) Рис. 29-18. Последовательность SPI Flash Quad Output Read. M = 1, 2, 3, 4 (байты адреса) Рис. 29-19. Последовательность SPI Flash Quad I/O Read. M = 1, 2, 3, 4 (байты адреса) Чтения SPI memory-mapped могут быть сделаны кэшированными во внутренней памяти ядра путем правильного конфигурирования региона как кэшируемой памяти без пропуска (without bypass, подробности см. в документации по конфигурированию кэша). На рисунках количество байт данных чтения (N) основано на следующем: • Для выборки инструкции ядром (когда работает режим XIP); количество байт инструкции зависит от размера строки кэша. Хотя минимальный размер переноса чтения данных memory-mapped составляет 4 байта, приложение может выбрать 1 байт или 2 байта данных (например, оно может выбрать unsigned char или short для доступа кода C). В этом случае для ядра предоставляются только требуемые байты, и другие байты кэшируются. Встроенная в кристалл подсистема памяти master предоставляет начальный адрес для пакета (burst) и аппаратура SPI выдает этот адрес как часть заголовка чтения (read header). Предоставленный адрес выровнен по N байтам. Например, для чтения 30-го байта из памяти SPI типичный адрес предоставляется: • 28 (0x0000_001C) для 32-битной строки кэша Данные чтения возвращаются в подсистему памяти в порядке, предоставленном памятью 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).
Таблица 29-10. Регистр SPI Receive Control (регистр управления приемом).
Таблица 29-11. Регистр SPI Transmit Control (регистр управления передачей).
Таблица 29-12. Регистр SPI DLY Control (регистр управления задержками).
Примечание *: см. даташит микросхемы SPI Flash для параметров интервалов времени выборки CS (например SSEL). Биты multiple I/O mode (SPI_CTL.MIOM) частично игнорируются: • Команда (opcode) передается либо с использованием одного, либо нескольких выводов, как это указано битами SPI_CTL.MIOM, в зависимости от установок бит SPI_MMRDH.CMDPINS. ЗАМЕЧАНИЕ: установите бит разрешения модуля 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, периферийное устройство 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.
Прерывания событий ошибки (Error Conditions). Контроллер SPI поддерживает прерывания на нескольких различных событиях ошибки. Все прерывания можно замаскировать (запретить). Индивидуальные индикации прерывания комбинируются в одном сигнале SPI error IRQ, который может быть мультиплексирован не некоторых процессорах с агрегированным сигналом состояния SPI (SPI status IRQ signal). Таблица прерываний ошибок SPI 29-14 детализирует возможные индикации ошибки. Таблица 29-14. SPI Error Interrupts.
События ошибки и возникновения прерываний зависят от разрешенных каналов (передача или прием). Если канал запрещен, то все ошибки, связанные с этим, игнорируются. Когда оба канала разрешены, разрешены ошибки и прерывания от обоих каналов. [Концепции программирования 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). 4. Если разрешен канал передачи (выставлен SPI_TXCTL.TEN), то происходят следующие действия: a. SPI запрашивает чтение DMA из памяти. 5. Если разрешены оба канала - и прием, и передача, то следующие действия произойдут после действий для каждого канала. Передачи продолжатся, пока в оба канала - и приема, и передачи, могут поступать новые данные. a. Если заполнится канал приема из-за недоступности предоставления DMA, то интерфейс SPI приостанавливает устройство master с помощью вывода SPI_RDY. Этот сигнал снимается, пока DMA не опустошит FIFO приема. Альтернативно SPI использует бит SPI_RXCTL.RDO, чтобы решить, должны ли поступающие данные быть отброшены или перезаписаны в FIFO приема (когда снят SPI_CTL.FCEN). [SPI0]
[SPI1]
[SPI2]
[Описание регистров 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). Рис. 29-20. Регистр SPI_CLK. Поле бит BAUD устанавливает скорость SPI в соответствии со следующей формулой: BAUD = (SCLK0 / SPI Clock) - 1 Регистр SPI_CTL разрешает работу SPI и конфигурирует настройки для рабочих режимов, коммуникационных протоколов и операций с буферами. Рис. 29-21. Регистр SPI_CTL.
Регистр SPI_DLY выбирает задержку переноса данных и интервалы lead/lag между сигналами slave select и перепадом тактов SPI. Рис. 29-22. Регистр SPI_DLY.
Регистр SPI_ILAT защелкивает (latch) флаги прерывания, ставя в очередь обработку прерываний. Когда условие прерывания показано битом в регистре SPI_STAT, и соответствующее прерывание разрешено (демаскировано) в регистре SPI_IMSK, то SPI защелкивает бит прерывания в регистре SPI_ILAT. Рис. 29-23. Регистр SPI_ILAT.
Регистр SPI_ILAT_CLR разрешает очистку отдельных бит маски регистра SPI_ILAT без влияния на состояние других бит в этом регистре. Для очистки нужного бита SPI_ILAT используйте операцию write-1-to-clear (W1C, запись единички для очистки) над регистром SPI_ILAT_CLR. Рис. 29-24. Регистр SPI_ILAT_CLR.
Регистр SPI_IMSK демаскирует (разрешает) или маскирует (запрещает) отдельные прерывания SPI. Когда условие прерывания показывается битом в регистре SPI_STAT, и соответствующее прерывание демаскировано в регистре SPI_IMSK, то SPI защелкивает бит соответствующий прерывания в регистре SPI_ILAT, ставя в очередь обработчик прерывания. По умолчанию (после сброса/включения питания) все прерывания замаскированы (запрещены), потому что во всех битах регистра SPI_IMSK записаны нули. Рис. 29-25. Регистр SPI_IMSK.
Регистр SPI_IMSK_CLR разрешает очистку отдельных бит маски в регистре SPI_IMSK без влияния на другие биты регистра. Используйте операцию write-1-to-clear (W1C, запись единицы в бит для его очистки) над регистром SPI_IMSK_CLR, чтобы очистить соответствующий бит регистра SPI_IMSK. Рис. 29-26. Регистр SPI_IMSK_CLR.
Регистр SPI_IMSK_SET разрешает установку отдельных бит маски в регистре SPI_IMSK без влияния на остальные биты. Используйте операцию write-1-to-set (W1S) над регистром SPI_IMSK_SET, чтобы установить соответствующий бит в регистре SPI_IMSK. Рис. 29-27. Регистр SPI_IMSK_SET.
Регистр SPI_MMRDH разрешает использовать режим memory-mapped. Этот режим позволяет прямой, привязанный к адресному пространству процессора, доступ к устройству памяти SPI, и это главным образом используется для выполнения инструкций ассемблера из памяти SPI FLASH без использования низкоуровневого программного драйвера. Все дополнительные задачи по обеспечению этого доступа, такие как передача заголовка чтения, переключение направления выводов SPI и прием данных нужного размера, берет на себя аппаратура SPI. Режим доступа memory-mapped разрешается установкой SPI_CTL.MMSE. Функции регистра SPI_MMRDH включают настройку режима пропуска команды SPI-устройства памяти (command skip mode), байт переменной длины адресации и независимая многовыводная поддержка передачи команды, адреса и приема данных. Дополнительно opcod команды и байты режима полностью программируются. Рис. 29-28. Регистр SPI_MMRDH.
Регистр SPI_MMTOP указывает верхний адрес, который предоставляется подключенным устройством памяти SPI. Рис. 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 запрещается после того, как он был разрешен. Рис. 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 должен меняться только тогда, когда этот счетчик запрещен. Рис. 29-31. Регистр SPI_RWC. 15:0 VALUE (R/W) Received Word Count. Биты SPI_RWC.VALUE содержат счетчик слов приема. Регистр SPI_RWCR хранит количество слов счетчика, которое SPI загрузит в регистр SPI_RWC, когда счетчик приема достигает нуля. Чтобы предотвратить перезагрузку счетчика, используйте 0 для значения перезагрузки. Регистр SPI_RWCR должен меняться только когда работа счетчика запрещена. Рис. 29-32. Регистр SPI_RWCR. 15:0 VALUE (R/W) Received Word Count Reload. Биты SPI_RWCR.VALUE содержат значение для перезагрузки счетчика слов приема. Регистр SPI_RXCTL разрешает канал приема SPI инициирует перемещения данных приема и конфигурирует настройки границы (watermark) буфера SPI_RFIFO. Рис. 29-33. Регистр SPI_RXCTL.
Регистр SPI_SLVSEL разрешает выводы SPI_SEL[n] для работы на выход, и показывает состояние (лог. 1 или лог. 0) этих выводов, когда эта функция разрешена. Рис. 29-34. Регистр SPI_SLVSEL.
Регистр SPI_STAT показывает состояние SPI включая состояние FIFO, события ошибки и события прерываний. Когда условие прерывания в этом регистре демаскировано (разрешено) соответствующим битом в регистре SPI_IMSK, то прерывание защелкивается в соответствующий бит в регистре SPI_ILAT. Рис. 29-35. Регистр SPI_STAT.
Регистр 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 запрещается после того, как было разрешен. Рис. 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 должен меняться только тогда, когда этот счетчик запрещен. Рис. 29-37. Регистр SPI_TWC. 15:0 VALUE (R/W) Transmitted Word Count. Биты SPI_TWC.VALUE содержат счетчик слов передачи. Регистр SPI_TWCR хранит количество слов счетчика, которое SPI загрузит в регистр SPI_TWC, когда счетчик передачи достигает нуля. Чтобы предотвратить перезагрузку счетчика, используйте 0 для значения перезагрузки. Регистр SPI_TWCR должен меняться только когда работа счетчика запрещена. Рис. 29-38. Регистр SPI_TWCR. 15:0 VALUE (R/W) Transmitted Word Count Reload. Биты SPI_TWCR.VALUE содержат значение перезагрузки для счетчика слов передачи. Регистр SPI_TXCTL разрешает канал передачи SPI, инициирует передачи и конфигурирует границу буфера (watermark) SPI_TFIFO. Рис. 29-39. Регистр SPI_TXCTL.
[Диаграммы SPI] Таблица 54 и рис. 31 описывают операции порта SPI master. При генерации тактов внутри кристалла программируемая частота тактов SPI (fSPICLKPROG) в МГц устанавливается следующим выражением, где BAUD является полем регистра SPI_CLK, которое может быть установлено в диапазоне 0 .. 65535:
Имейте в виду: • В двойном режиме передачи данных (dual mode) сигнал SPI_MISO работает также как выход (и MOSI, и MISO работают в одном направлении). Таблица 54. Интервалы времени порта SPI в режиме Master.
Примечания: 1. Для получения подробностей по минимальному периоду, который может быть запрограммирован для tSPICLKPROG, см. таблицу 18 раздела "Clock Related Operating Conditions" из даташита . Таблица 55 и рис. 32 описывают операции порта SPI slave. Имейте в виду: • В двойном режиме передачи данных (dual mode) сигнал SPI_MISO работает также как выход (и MOSI, и MISO работают в одном направлении). 1 Таблица 55. Интервалы времени порта SPI в режиме Slave.
Примечание 1: эта спецификация показывает минимальную немедленную ширину или период, на который имеется допуск, учитывающий изменение скважности тактов или их дрожание на внешнем сигнале SPI_CLK. Для внешнего SPI_CLK идеальный максимум частоты можно увидеть в спецификации fSPICLKTEXT из таблицы 18 раздела "Clock Related Operating Conditions" даташита [1]. Другие диаграммы времени (сигнал SPI_RDY режимов Master и Slave, режим выхода с открытым стоком Master и Slave и т. д.) см. в даташите [1]. [Ссылки] 1. Blackfin+ Core Embedded Processor ADSP-BF700/701/702/703/704/705/706/707 site:analog.com. |