Программирование ARM STM32F407, интерфейс SPI Wed, October 30 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


STM32F407, интерфейс SPI Печать
Добавил(а) microsin   

Здесь приведен перевод секции 28 Serial peripheral interface (SPI) из даташита RM0090 компании ST, посвященный микроконтроллерам STM32F405xx/07xx, STM32F415xx/17xx, STM32F42xxx и STM32F43xxx (с акцентом на STM32F407xx). Непонятные термины и сокращения см. в Словарике [3].

[SPI: введение]

Интерфейс SPI предоставляет 2 главные функции - либо поддержка протокола SPI, либо протокола передачи звука I2S (по умолчанию выбран SPI). Можно программно переключать режим интерфейса с SPI на I2S.

Прим. переводчика: в этом переводе описание режима I2S опущено.

Последовательный периферийный интерфейс (serial peripheral interface, SPI) позволяет синхронно обмениваться данными с внешними устройствами в режимах полудуплекса и полного дуплекса. Интерфейс может быть сконфигурирован как мастер, и тогда он предоставляет сигнал тактирования данных (SCK) для внешнего подчиненного устройства. Интерфейс также может работать в конфигурации с несколькими мастерами (multimaster).

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

I2S также является синхронным последовательным интерфейсом для обмена данными. Он может адресовать 4 разных аудиостандарта, включая стандарт I2S Philips, стандарты с выравниванием по старшему и младшему битам (MSB, LSB justified), и стандарт PCM. I2S может работать как подчиненное устройство или как главное (slave или master device) в режиме полного дуплекса (задействовано 4 вывода) или в режиме полудуплекса (задействовано 3 вывода). Такты master могут быть предоставлены в интерфейсе для внешнего slave-компонента шины, когда I2S сконфигурирован как master обмена.

Предупреждение: поскольку некоторые выводы SPI1 и SPI3/I2S3 могут быть привязаны (mapped) на выводы, используемые интерфейсом JTAG (SPI1_NSS на JTDI, SPI3_NSS/I2S3_WS на JTDI и SPI3_SCK/I2S3_CK на JTDO), то у Вас есть следующие варианты:
– привязать (map) SPI/I2S на другие выводы.
– запретить интерфейс JTAG и использовать интерфейс SWD до конфигурирования выводов, перечисленных как выводы SPI I/O (когда отлаживаете приложение микроконтроллера),
– или запретить оба интерфейса и JTAG, и SWD (когда отладка не активна, и работает реальное приложение).

За дополнительной информацией по поводу конфигурирования выводов интерфейсов JTAG/SWD обратитесь к секции даташита 8.3.2: I/O pin multiplexer and mapping (даташит RM0090).

[SPI в микроконтроллере STM32F407ZGT6 и плата Olimex STM32-P407]

На макетной плате Olimex STM32-P407 установлен микроконтроллер STM32F407ZGT6, у которого имеется всего 3 порта SPI: SPI1, SPI2, SPI3.

STM32-P407-IMG 2659

На картинке показана цоколевка выводов корпуса LQFP144 микроконтроллера STM32F407ZGT6, которые могут быть задействованы для SPI1, SPI2, SPI3.

STM32F407-LQFP144-SPI-pinout

28. PC2/SPI2_MISO/OTG_HS_ULPI_DIR/ETH_MII_TXD2/ADC123_IN12
Подключен к USB_FS_VBUSON, поэтому использовать нельзя.

29. PC3/SPI2_MOSI/I2S2_SD/OTG_HS_ULPI_NXT/ETH_MII_TX_CLK/ADC123_IN13
Подключен к LCD-индикатору. Использовать можно, если запретить LCD.

40. PA4/SPI1_NSS/SPI3_NSS/USART2_CK/DCMI_HSYNC/OTG_HS_SOF/I2S3_WS/ADC12_IN4/DAC1_OUT
Подключен к камере, можно использовать, если камеру запретить.

41. PA5/SPI1_SCK/OTG_HS_ULPI_CK/TIM2_CH1_ETR/TIM8_CHIN/ADC12_IN5/DAC2_OUT
Подключен к камере, можно использовать, если камеру запретить.

42. PA6/SPI1_MISO/TIM8_BKIN/TIM13_CH1/DCMI_PIXCLK/TIM3_CH1/TIM1_BKIN/ADC12_IN6
Подключен к камере, можно использовать, если камеру запретить.

43. PA7/SPI1_MOSI/TIM8_CH1N/TIM14_CH1/TIM3_CH2/ETH_MII_RX_DV/TIM1_CH1N/RMII_CRS_DV/ADC12_IN7
Подключен к чипу Ethernet KS8721BLMM, можно использовать, если запретить Ethernet.

69. PB10/SPI2_SCK/I2S2_CK/I2C2_SCL/USART3_TX/OTG_HS_ULPI_D3/ETH_MII_RX_ER/OTG_HS_SCL/TIM2_CH3
Используется для USB_FS_FAULT, задействовать нельзя.

73. PB12/SPI2_NSS/I2S2_WS/I2C2_SMBA/USART3_CK/TIM1_BKIN/CAN2_RX/OTG_HS_ULPI_D5/ETH_RMII_TXD0/ETH_MII_TXD0/OTG_HS_ID
Используется для OTG_HS_ID (USB), задействовать нельзя.

74. PB13/SPI2_SCK/I2S2_CK/USART3_CTS/TIM1_CH1N/CAN2_TX/OTG_HS_ULPI_D6/ETH_RMII_TXD1/ETH_MII_TXD1/OTG_HS_VBUS
Используется для OTG_HS_VBUS (USB), задействовать нельзя.

75. PB14/SPI2_MISO/TIM1_CH2N/TIM12_CH1/OTG_HS_DM/USART3_RTS/TIM8_CH2N
Используется для OTG_HS_DM (USB), задействовать нельзя.

76. PB15/SPI2_MOSI/I2S2_SD/TIM1_CH3N/TIM8_CH3N/TIM12_CH2/OTG_HS_DP
Используется для OTG_HS_DP (USB), задействовать нельзя.

96. PC6/SPI2_MCK/TIM8_CH1/SDIO_D6/USART6_TX/DCMI_D0/TIM3_CH1
Используется для USART6 (RS232_1), задействовать нельзя.

97. PC7/SPI3_MCK/TIM8_CH2/SDIO_D7/USART6_RX/DCMI_D1/TIM3_CH2
Используется для аудиовывода в чип CS4344-CZZ.

110. PA15/JTDI/SPI3_NSS/I2S3_WS/TIM2_CH1_ETR/SPI1_NSS
Используется для аудиовывода в чип CS4344-CZZ.

111. PC10/SPI3_SCK/I2S3_CK/UART4_TX/SDIO_D2/DCMI_D8/USART3_TX
Выходит на разъем UEXT, можно использовать, но только в том случае, если не использовать карту SD.

112. PC11/UART4_RX/SPI3_MISO/SDIO_D3/DCMI_D4/USART3_RX
Выходит на разъем UEXT, можно использовать, но только в том случае, если не использовать карту SD.

113. PC12/UART5_TX/SDIO_CK/DCMI_D9/SPI3_MOSI/I2S3_SD/USART3_CK
Выходит на разъем UEXT, можно использовать, но только в том случае, если не использовать карту SD.

133. PB3/JTDO/TRACESWO/SPI3_SCK/I2S3_CK/TIM2_CH2/SPI1_SCK
Подключено к JTAG и к чипу аудиовывода CS4344-CZZ.

134. PB4/NJTRST/SPI3_MISO/TIM3_CH1/SPI1_MISO
Подключено к JTAG, к видеокамере.

135. PB5/I2C1_SMBA/CAN2_RX/OTG_HS_ULPI_D7/ETH_PPS_OUT/TIM3_CH2/SPI1_MOSI/SPI3_MOSI/DCMI_D10/I2S3_SD
Подключено к чипу аудиовывода CS4344-CZZ.

140. PB9/SPI2_NSS/I2S2_WS/TIM4_CH4/TIM11_CH1/OTG_FS_SDA/SDIO_D5/DCMI_D7/I2C1_SDA/CAN1_TX
Подключено к чипу CAN SN65HVD230.

Порты SPI могут работать в полудуплексе (поочередно переключаясь с приема на передачу) и на полном дуплексе. SPI1 может работать со скоростью до 42 мегабит/сек, SPI2 и SPI3 до 21 мегабит/сек. Аппаратное вычисление и генерация CRC может поддерживать базовые режимы работы с картами SD/MMC. SPI таке может обслуживаться контроллером DMA.

Из-за того, что ножки микроконтроллера STM32F407ZGT6 выполняют каждая множество функций, и на плате STM32-P407 установлена различная периферия, подключенная к выводам SPI, то использовать периферию SPI можно только если от чего-то отказаться.

SPI1. У этого интерфейса сигналы NSS, SCK, MISO, подключены к видеокамере, так что для использования SPI1 нужно видеокамеру выключить. Сигналы NSS, SCK, MOSI могут также выходить на чип аудиовывода CS4344-CZZ. Также сигнал MOSI подключен к чипу Ethernet KS8721BLMM, так что при использовании SPI1 работать с сетью не получится.

SPI1 подключен к ядру микроконтроллера через шину APB2.

SPI2. Сигнал MOSI может приходить на видеокамеру. Также многие сигналы совмещены с сигналами интерфейсов USB, так что в случае использования USB работать с SPI2 не получится.

SPI2 подключен к ядру микроконтроллера через шину APB1.

SPI3. Этот интерфейс подключен на разъем расширения UEXT Olimex, и его использовать удобнее всего, но только в том случае, если отказаться от слота карт microSD. Также сигналы NSS, SCK, MOSI могут приходить на чип аудиовывода CS4344-CZZ. MISO может быть подключен к видеокамере. Если подключать к SPI внешнее устройство через коннектор UEXT, то его выборку нужно генерировать программно, через порт GPIO PF8.

SPI3 подключен к ядру микроконтроллера через шину APB1.

[Основные возможности SPI]

• Полнодуплексная синхронная передача данных с задействованием 3 сигнальных линий.
• Симплексная синхронная передача данных с задействованием 2 сигнальных линий, с использованием или без использования двунаправленной линии передачи данных.
• Выбор формата фрейма 8 или 16 бит.
• Работа в режиме master или slave.
• Возможность режима multimaster.
• В режиме master есть 8 градаций прескалера для скорости передачи (fPCLK/2 max.)
• Частота режима slave (fPCLK/2 max).
• Ускоренный обмен данными как для master, так и для slave.
• Программное или аппаратное управление выводом NSS как для master, так и для slave: динамическое изменение работы master/slave.
• Полярность и фаза тактов программируется.
• Программируемый порядок следования бит (первый MSB или первый LSB).
• Раздельные флаги передачи и приема с возможностью прерывания по ним.
• Флаг статуса занятости шины SPI.
• Режим SPI TI.
• Аппаратная CRC для надежного обмена данными:
– Значение CRC может быть передано в последнем байте при передаче.
– Автоматическая проверка ошибки CRC для последнего принятого байта.
• Флаги Master mode fault, overrun и CRC error, с возможностью прерывания по ним.
• 1-байтовый буфер DMA передачи и приема: запросы Tx и Rx.


• Full duplex communication
• Half-duplex communication (only transmitter or receiver)
• Master or slave operations
• 8-bit programmable linear prescaler to reach accurate audio sample frequencies (from
8 kHz to 192 kHz)
• Data format may be 16-bit, 24-bit or 32-bit
• Packet frame is fixed to 16-bit (16-bit data frame) or 32-bit (16-bit, 24-bit, 32-bit data
frame) by audio channel
• Programmable clock polarity (steady state)
• Underrun flag in slave transmission mode, overrun flag in reception mode (master and
slave), and Frame Error flag in reception and transmission mode (slave only)
• 16-bit register for transmission and reception with one data register for both channel
sides
• Supported I2S protocols:
– I2S Phillps standard
– MSB-justified standard (left-justified)
– LSB-justified standard (right-justified)
– PCM standard (with short and long frame synchronization on 16-bit channel frame
or 16-bit data frame extended to 32-bit channel frame)
• Data direction is always MSB first
• DMA capability for transmission and reception (16-bit wide)
• Master clock may be output to drive an external audio component. Ratio is fixed at
256 ? FS (where FS is the audio sampling frequency)
• Both I2S (I2S2 and I2S3) have a dedicated PLL (PLLI2S) to generate an even more
accurate clock.
• I2S (I2S2 and I2S3) clock can be derived from an external clock mapped on the
I2S_CKIN pin.

[Основное функциональное описание SPI]

На рис. 246 показана блочная диаграмма SPI.

SPI-block-diagram-fig-246

Рис. 246. SPI block diagram.

Обычно SPI подключается к внешним устройствам 4 сигнальными линиями:

• MISO: Master In / Slave Out, сигнал передачи данных от slave к master. Этот вывод может использоваться для передачи данных в режиме slave и для приема данных в режиме master.
• MOSI: Master Out / Slave In data, сигнал передачи данных от master к slave. Этот вывод может использоваться для передачи данных в режиме master и для приема данных в режиме slave.
• SCK: Serial Clock, выход тактов для SPI master и вход для SPI slave.
• NSS: Slave select, сигнал выборки для устройства slave. Использование этого вывода не обязательно, он нужен для подачи сигнала выборки на устройство slave. Этот вывод работает как ‘chip select’, что позволяет SPI master обмениваться данными с несколькими устройствами slave, индивидуально обращаясь к каждому устройству, что позволяет избежать конфликта по шинам данных. Входы NSS могут управляться как стандартные порты GPIO, программно управляемые устройством master. Вывод NSS может быть использован как выход, если это разрешено (битом SSOE), и переходить в лог. 0, если SPI сконфигурирован как master. В этом случае все выводы NSS от устройств, подключенные к Master NSS, ожидают появления лог. 0 и становятся устройствами slave, когда они сконфигурированы в аппаратном режиме работы NSS. Когда сконфигурирован режим master, и при этом NSS сконфигурирован как вход (MSTR=1 и SSOE=0), и вывод NSS получил уровень лог. 0, то SPI входит в состояние ошибки (fault state): бит MSTR автоматически очищается и устройство становится сконфигурированным в режиме slave (см. секцию 28.3.10: Error flags даташита RM0090).

На рис. 247 показан пример соединения друг с другом одного устройства master с одним устройством slave.

SPI-single-master-single-slave-application-fig247

Рис. 247. Single master / single slave application.

Примечание (1): здесь вывод NSS сконфигурирован как вход.

Выводы MOSI соединены друг с другом, как и выводы MISO. При этом данные последовательно передаются между master и slave, первым идет самый старший бит (MSB).

Обмен всегда начинает master. Когда устройство master передает данные к устройству slave через вывод MOSI, устройство slave отвечает данными через вывод MISO. Это реализует полнодуплексный двухсторонний обмен данными, которые синхронизированы одним и тем же тактовым сигналом (этот сигнал предоставляет устройство master через вывод SCK).

[Управление выводом выборки slave (NSS)]

Аппаратное или программное управление выводом NSS может быть установлено битом SSM в регистре SPI_CR1.

• Программное управление NSS. когда SSM = 1. Выборка slave select управляется внутри микроконтроллера программно по значению бита SSI в регистре SPI_CR1. Внешний вывод NSS остается свободным, и может использоваться в приложении для других целей.
• Аппаратное управление NSS, когда SSM = 0. В этом состоянии возможны 2 варианта конфигурации в зависимости от того, как сконфигурирован выход NSS (бит SSOE в регистре SPI_CR2).
– выход NSS разрешен (SSM = 0, SSOE = 1). Эта конфигурация используется только когда устройство работает в режиме master. Сигнал NSS переходит в лог. 0, когда master начинает обмен и остается в лог. 0, пока SPI не будет запрещен.
– выход NSS запрещен (SSM = 0, SSOE = 0). Эта конфигурация разрешает возможность multimaster для устройств, работающих в режиме master. Для устройств, которые установлены как slave, вывод NSS работает как классический вход NSS: slave выбирается и становится активным, когда NSS переходит в лог. 0, и деактивируется, когда NSS переходит в лог. 1.

[Фаза и полярность SCK]

Можно запрограммировать 4 варианта работы, используя биты CPOL и CPHA в регистре SPI_CR1. Бит CPOL (clock polarity) управляет значением устойчивости (steady state) такта, когда данные не передаются. Этот бит влияет на оба режима - и master, и slave. Если бит CPOL сброшен, то SCK имеет лог. 0 в состоянии ожидания. Если CPOL установлен, то SCK имеет лог. 1 в состоянии ожидания.

Если бит CPHA (clock phase, фаза такта) установлен, второй перепад на выводе SCK (это будет спад уровня, если CPOL сброшен, и нарастание уровня, если CPOL установлен) является стробом захвата старшего бита (MSBit). Данные будут захватываться по событию второго перехода состояния тактов. Если бит CPHA сброшен, то первый перепад на выводе SCK (это будет спад уровня, если установлен бит CPOL, и нарастание уровня, если бит CPOL сброшен) будет стробом захвата старшего бита данных (MSBit). Данные будут захватываться по событию первого перепада тактов SCK.

Комбинация битов CPOL (clock polarity) и CPHA (clock phase) выбирают перепад сигнала тактов, по которому будет осуществляться захват данных.

На рис. 248 показано, как SPI передает данные в 4 вариантах настройки битов CPHA и CPOL. Диаграмма может быть интерпретирована как диаграмма времени master или slave, где выводы SCK, MISO, MOSI напрямую соединены между устройствами master и slave.

Примечание: перед тем, как поменять биты CPOL/CPHA, SPI должен быть запрещен сбросом бита SPE. Master и slave должны быть запрограммированы на одинаковые диаграммы управления сигналами. Состояние ожидания (idle state) SCK должно соответствовать выбранной полярности в регистре SPI_CR1 (переводом SCK в лог. 1 при CPOL=1 или переводом SCK в лог. 0 при CPOL=0). Формат фрейма данных (8 или 16 бит), выбираемый битом DFF в регистре SPI_CR1, определяет длину данных во время передачи/приема.

SPI-data-clock-timing-diagram-fig248

Рис. 248. Data clock timing diagram.

Примечание (1): эти диаграммы соответствуют сброшенному биту LSBFIRST в регистре SPI_CR1 (бит MSB идет первым в потоке данных).

Формат фрейма данных. Данные могут сдвигаться на выход либо MSB битом вперед, либо LSB битом вперед, в зависимости от бита LSBFIRST в регистре SPI_CR1. Длина каждого фрейма данных (8 или 16 бит) зависит от состояния бита DFF в регистре SPI_CR1. Выбранный формат фрейма влияет и на прием, и на передачу.

[Конфигурирование SPI в режиме slave]

В конфигурации slave тактовый сигнал будет приниматься через вывод SCK от устройства master. Значения, установленные в битах BR[2:0] регистра SPI_CR1 никак не будет влиять на скорость передачи данных.

Примечание: рекомендуется разрешить работу SPI до того, как master начнет передавать тактовый сигнал. Если этого не сделать, то может произойти нежелательная передача данных. Регистр данных slave должен быть готов до первого перепада тактового обмена, или до окончания происходящего обмена. Важно установить полярность обмена тактов в состояние steady (устойчивый уровень) до того, как и slave и master будут разрешены.

Для конфигурирования SPI в режиме slave следуйте следующей процедуре:

1. Установите бит DFF, чтобы определить 8 или 16 бит для формата фрейма данных.

2. Выберите значение бит CPOL и CPHA, чтобы определить один из 4 видов взаимодействия между передачей бит данных и тактовым сигналом (см. рис. 248). Чтобы передача данных была корректной, настройка бит CPOL и CPHA должна соответствовать друг другу на устройствах slave и master. Этот шаг выполнять не нужно, если выбран режим TI битом FRF в регистре SPI_CR2.

3. Порядок бит фрейма (MSB первый или LSB первый) зависит от значения бита LSBFIRST в регистре SPI_CR1) должен быть одинаковым для устройства slave и устройства master. Этот шаг выполнять не нужно, когда выбран режим TI.

4. В аппаратном режиме управления выборкой (см. описание вывода NSS) вывод NSS должен быть подключен к сигналу низкого уровня во время выполнения последовательности передачи фрейма. В программном режиме NSS установите бит SSM и очистите бит SSI в регистре SPI_CR1. Этот шаг не требуется, когда выбран режим TI.

5. Установите бит FRF в регистре SPI_CR2 для выбора режима протокола TI последовательного обмена данными.

6. Очистите бит MSTR и установите бит SPE (оба бита находятся в регистре SPI_CR1) чтобы активировать у микроконтроллера альтернативную функцию SPI на выводах.

В этой конфигурации вывод MOSI работает как вход данных, и вывод MISO работает как выход данных.

Передача. Байт данных параллельно загружается в буфер Tx во время цикла записи. Последовательность передачи данных начинается, когда устройство slave принимает сигнал тактов и MSB бит данных переходит на вывод MOSI. Остальные биты (7 в формате фрейма 8 бит и 15 бит в формате фрейма 16 бит) загружаются в регистр сдвига. Флаг TXE регистра SPI_SR устанавливается, когда данные загружены из буфера Tx в регистр сдвига, и генерируется прерывание, если установлен бит TXEIE в регистре SPI_CR2.

Прием. Для получателя данных передача данных завершится в следующей ситуации:
• Данные из регистра сдвига переданы в буфер Rx, и установлен флаг RXNE (он находится в регистре SPI_SR).
• Генерируется прерывание, если установлен бит RXNEIE в регистре SPI_CR2.

После последнего перепада тактов установиться бит RXNE, копия принятых данных из регистра сдвига переместится в буфер Rx. Когда читается регистр SPI_DR, периферия SPI возвратит это буферизированное значение.

Очистка бита RXNE выполняется при чтении регистра SPI_DR.

[Протокол TI для SPI в режиме slave]

В режиме slave интерфейс SPI совместим с протоколом TI. Бит FRF регистра SPI_CR2 может использоваться для того, чтобы сконфигурировать обмен slave SPI совместимым с протоколом SPI TI.

Полярность и фаза тактов принудительно устанавливаются так, чтобы они удовлетворяли требованиям протокола TI независимо от значений, которые установлены в регистре SPI_CR1. Управление NSS также специфично для протокола TI, что делает конфигурирование управления NSS через регистры SPI_CR1 и SPI_CR2 (биты SSM, SSI, SSOE) прозрачным для пользователя.

В режиме Slave (см. рис. 249: режим TI Slave одиночная передача, на рис. 250: режим TI Slave продолжающаяся передача) прескалер скорости SPI (baud rate prescaler) используется для управления моментом, когда вывод MISO переходит в третье состояние (отключено, HI-Z). Таким образом, может использоваться любая скорость передачи, позволяя определить этот момент с максимальной гибкостью. Однако скорость передачи главным образом зависит от частоты тактов внешнего master. Время, когда сигнал MISO переходит в отключенное состояние HI-Z, зависит от внутренних пересинхронизаций, и значение скорости устанавливается битами BR[2:0] регистра SPI_CR1. Их значение можно получить по формуле:

SPI-TI-mode-baud-rate-trelease-formula

Примечание: эта фича не работает для обменов с Motorola SPI (бит FRF установлен в 0).

Чтобы детектировать ошибки фрейма TI только в режиме передатчика Slave, путем прерывания по ошибке (ERRIE=1), SPI должен быть сконфигурирован в однонаправленный 2-проводный режим путем установки битов BIDIMODE и BIDIOE в 1 (эти биты находятся в регистре SPI_CR1). Когда BIDIMODE установлен в 0, бит OVR установится в 1, потому что регистр данных никогда не читается, и прерывание ошибки будет генерироваться всегда, в то время как если BIDIMODE установлен в 1, дата не приняты и OVR не будет установлен.

SPI-TI-mode-Slave-mode-single-transfer-fig249

Рис. 249. Режим TI Slave, одиночная передача.

SPI-TI-mode-Slave-mode-continuous-transfer-fig250

Рис. 250. Режим TI Slave, непрерывная передача.

[Конфигурирование SPI в режиме master]

В режиме master такты генерируются на ножке SCK, работающей как выход. Последовательность конфигурирования следующая:

1. Установите значение бит BR[2:0], чтобы определить скорость передачи (частота тактов SCK, см. описание регистра SPI_CR1).

2. Выберите значение битов CPOL и CPHA, чтобы задать один из 4 вариантов взаимодействия между передачей данных и поведением тактового сигнала (см. рис. 248). Этот шаг делать не нужно, когда выбран режим TI.

3. Установите бит DFF для определения 8 или 16 бит во фрейме данных.

4. Сконфигурируйте бит LSBFIRST в регистре SPI_CR1, чтобы задать порядок передачи бит во фрейме. Этот шаг не нужен, когда выбран режим TI.

5. Если в аппаратном режиме NSS должен работать в режиме входа, подайте сигнал высокого уровня на этот вывод для выполнения последовательности передачи фрейма. В режиме программного управления NSS, установите биты SSM и SSI в регистре SPI_CR1. Если нужно, чтобы вывод NSS работал как выход, должен быть установлен только бит SSOE. Этот шаг не нужен, когда выбран режим TI.

6. Установите бит FRF в регистре SPI_CR2, чтобы выбрать протокол TI для обмена данными.

7. Должны быть установлены биты MSTR и SPE (они остаются установленными, только если вывод NSS подключен к сигналу высокого уровня).

В этом режиме вывод MOSI работает как выход данных, и вывод MISO работает как вход данных.

Передача. Процесс передачи начнется, когда байт записывается в буфер Tx. Параллельно байт данных загружается в регистр сдвига (по внутренней шине) во время передачи первого бита, и затем сдвигается на выход последовательно через вывод MOSI (MSB битом вперед, или LSB битом вперед, в зависимости от состояния бита LSBFIRST в регистре SPI_CR1). Флаг TXE устанавливается после передачи данных из буфера Tx в регистр сдвига, и будет сгенерировано прерывание, если установлен бит TXEIE в регистре SPI_CR2.

Прием. Для приема, когда процесс передачи данных завершается:

• Данные из регистра сдвига передается в буфер RX, и устанавливается флаг RXNE.
• Будет сгенерировано прерывание, если установлен бит RXNEIE в регистре SPI_CR2.

На последнем перепаде тактов устанавливается бит RXNE, копия принятого байта данных из регистра сдвига перемещается в буфер Rx. Когда прочитан регистр SPI_DR, периферийное устройство SPI возвратит это забуферизированное значение данных.

Бит RXNE очищается, когда происходит чтение регистра SPI_DR.

Может быть осуществлена поддержка потока передачи, если следующий фрейм данных для передачи будет помещен в буфер Tx, когда передача была запущена. Имейте в виду, что флаг TXE должен быть в состоянии 1 перед любой попыткой записи в буфер Tx.

Примечание: когда master обменивается данными с устройствами SPI slave, которые нуждаются в отключении выборки между передачами, вывод NSS должен быть сконфигурирован как GPIO или должен использоваться другой вывод GPIO, чтобы программно управлять выборкой slave-устройства.

[Протокол TI для SPI в режиме master]

В режиме master интерфейс SPI совместим с протоколом TI. Бит FRF регистра SPI_CR2 может использоваться для того, чтобы сконфигурировать обмен master SPI совместимым с протоколом SPI TI.

Полярность и фаза тактов принудительно устанавливаются так, чтобы они удовлетворяли требованиям протокола TI независимо от значений, которые установлены в регистре SPI_CR1. Управление NSS также специфично для протокола TI, что делает конфигурирование управления NSS через регистры SPI_CR1 и SPI_CR2 (биты SSM, SSI, SSOE) прозрачным для пользователя.

На рис. 251 показаны диаграммы обмена режима TI master при одиночной передаче, и на рис. 252 для режима TI master при продолжающейся передаче.

SPI-TI-mode-master-mode-single-transfer-fig251

Рис. 251. TI mode - master mode, single transfer.

SPI-TI-mode-master-mode-continuous-transfer-fig252

Рис. 252. TI mode - master mode, continuous transfer.

[Конфигурирование SPI для обмена в полудуплексе]

SPI может работать в 2 режимах полудуплекса:

• 1 тактовый сигнал и 1 двунаправленная линия данных.
• 1 тактовый сигнал и 1 линия данных (только для приема или только для передачи).

1 тактовая линия и 1 двунаправленная линия данных (BIDIMODE=1). Этот режим разрешается путем установки бита BIDIMODE в регистре SPI_CR1. В этом режиме SCK используется для тактов и для данных используется MOSI в режиме master или MISO в режиме slave. Направление передачи (Input/Output) выбирается битом BIDIOE в регистре SPI_CR1. Когда этот бит установлен в 1, линия данных становится выходом, иначе она работает как вход.

1 тактовая линия и 1 однонаправленная линия данных (BIDIMODE=0). В этом режиме приложение микроконтроллера может использовать SPI либо только для режима передачи, либо только для режима приема.

• Режим только для передачи работает так же, как и полный дуплекс (BIDIMODE=0, RXONLY=0): данные передаются через ножку передачи (MOSI в режиме master или MISO в режиме slave). Ножка приема (MISO в режиме master или MOSI в режиме slave) может использоваться как обычный порт ввода вывода GPIO. В этом случае приложение микроконтроллера должно просто игнорировать буфер Rx (если регистр данных будет прочитан, он не будет содержать принятые данные).
• В режиме только для чтения приложение может запретить функцию выхода SPI установкой бита RXONLY в регистре SPI_CR2. В этом случае вывод передачи (MOSI в режиме master или MISO в режиме slave) освобождается, и может использоваться как GPIO для других целей.

Чтобы запустить обмен в режиме только приема, сконфигурируйте и разрешите SPI:

• В режиме master обмен запустится немедленно, и завершится, когда бит SPE очистится, и текущий прием остановится. В этом режиме здесь не нужно читать флаг BSY. Он всегда устанавливается, когда происходит обмен SPI.
• В режиме slave интерфейс SPI продолжает принимать, пока NSS притянут к лог. 0 (или бит SSI очищен в режиме программного управления NSS), и работают такты SCK.

[Процедуры передачи и приема данных]

Буферы Rx и Tx. Во время приема данные принимаются и сохраняются во внутренний буфер Rx. При передаче данных сначала сохраняются во внутренний буфер Tx перед тем, как они будут переданы.

Доступ на чтение регистра SPI_DR возвратит значение из буфера Rx, в то время как доступ на запись в регистр SPI_DR поместит записываемые данные в буфер Tx.

Стартовая последовательность в режиме master:

• Когда полный дуплекс (BIDIMODE=0 и RXONLY=0).
– Последовательность начинается, когда данные записаны в регистр SPI_DR (данные попали в буфер Tx).
– Параллельно данные загружаются в из буфера Tx в 8-битный регистр сдвига во время передачи 1-го бита и далее последовательно сдвигаются в вывод MOSI.
– В то же самое время принятые данные на выводе MISO последовательно вдвигаются в 8-битный регистр сдвига и параллельно загружаются в регистр SPI_DR (буфер Rx).
• Когда однонаправленная передача, только прием (BIDIMODE=0 и RXONLY=1).
– Последовательность начинается, как только SPE=1.
– Активируется только приемник, и принятые данные с вывода MISO вдвигаются в 8-битный регистр сдвига, и параллельно загружаются в регистр SPI_DR (буфер Rx).
• Двунаправленный режим, когда идет передача (BIDIMODE=1 и BIDIOE=1).
– Последовательность начинается, когда данные записываются в регистр SPI_DR (буфер Tx).
– Затем данные параллельно загружаются из буфера Tx в 8-битный регистр сдвига во время передачи первого бита, и затем последовательно сдвигаются в вывод MOSI.
– Никакие данные не принимаются.
• Двунаправленный режим, когда идет прием (BIDIMODE=1 и BIDIOE=0).
– Последовательность начинается, как только SPE=1 и BIDIOE=0.
– Принятые данные с вывода MOSI последовательно вдвигаются в 8-битный регистр сдвига, и затем параллельно загружаются в регистр SPI_DR (буфер Rx).
– Передатчик не активизируется, и данные не выдвигаются в вывод MOSI.

Стартовая последовательность в режиме slave:

• Когда полный дуплекс (BIDIMODE=0 и RXONLY=0).
– Последовательность начинается, когда slave получает сигнал тактов и первый бит попадает на вывод MOSI. Оставшиеся 7 бит загружаются в регистр сдвига.
– Одновременно данные параллельно загружаются из буфера Tx в 8-битный регистр сдвига во время передачи первого бита, и затем последовательно сдвигаются в вывод MISO. Программное обеспечение должно записать данные для отправки до того, как устройство SPI master начнет передачу.
• Когда однонаправленная передача, только прием (BIDIMODE=0 и RXONLY=1).
– Последовательность начинается, когда slave получает сигнал тактов и первый бит попадает на вывод MOSI. Оставшиеся 7 бит загружаются в регистр сдвига.
– Передатчик не активизируется, и данные не выдвигаются в вывод MISO.
• Двунаправленный режим, когда идет передача (BIDIMODE=1 и BIDIOE=1).
– Последовательность начинается, когда slave получает сигнал тактов и первый бит в буфере Tx передается на вывод MISO.
– Затем данные параллельно загружаются из буфера Tx в 8-битный регистр сдвига во время передачи первого бита, затем данные выдвигаются на вывод MISO. Программное обеспечение должно записать отправляемые данные до того момента, когда устройство SPI master начнет передачу.
– Никакие данные не принимаются.
• Двунаправленный режим, когда идет прием (BIDIMODE=1 и BIDIOE=0).
– Последовательность начинается, когда slave получает сигнал тактов и первый бит попадает на вывод MISO.
– Принимаемые данные с вывода MISO вдвигаются в 8-битный регистр сдвига и параллельно загружаются в регистр SPI_DR (буфер Rx).
– Передатчик не активизируется, и данные не выдвигаются на вывод MISO.

[Обработка передачи и приема данных]

Флаг TXE (расшифровывается как Tx buffer empty, буфер передачи пуст) устанавливается, когда данные переданы из буфера Tx в регистр сдвига. Это показывает, что внутренний буфер Tx готов к загрузке следующей порции данных. В этот момент может генерироваться прерывание, если установлен бит TXEIE в регистре SPI_CR2. Очистка бита выполняется при записи в регистр SPI_DR (при этом записанные данные попадают в буфер Tx).

Примечание: программное обеспечение должно удостовериться, что флаг TXE установлен перед тем, как сделать попытку записи в буфер Tx (в регистр SPI_DR). Иначе запись перезапишет ранее записанные в буфер Tx данные.

Флаг RXNE (расшифровывается Rx buffer not empty, буфер приема не пуст) устанавливается, по приходу последнего перепада тактов, когда данные копируются из регистра сдвига в буфер Rx. Это показывает, что есть принятые данные, и их можно прочитать через чтение регистра SPI_DR. В этот момент может быть сгенерировано прерывание, если установлен бит RXNEIE в регистре SPI_CR2. Бит RXNE очищается при чтении регистра SPI_DR (при этом будут прочитаны принятые данные из буфера Rx).

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

Далее приведено описание полнодуплексной операции передачи и приема в режиме master или slave (BIDIMODE=0 и RXONLY=0). Программное обеспечение должно следовать следующей процедуре для передачи и приема данных (см. рис. 253 и 254):

1. Разрешить SPI установкой бита SPE в значение 1.
2. Записать первую порцию данных для передачи в регистр SPI_DR (это очистит флаг TXE).
3. Ждать, пока не станет TXE=1, затем записать вторую порцию передаваемых данных. Затем ждать, пока не станет RXNE=1, и прочитать SPI_DR для получения первой принятой порции данных (это очистит бит RXNE). Повторить эту операцию для каждой передаваемой/принимаемой порции данных, пока не будет принята n–1 порция данных.
4. Ждать, пока не станет RXNE=1, и прочитать последние принятые данные.
5. Ждать, пока не станет TXE=1, и затем ждать, пока не станет BSY=0, перед тем как сделать запрет SPI.

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

SPI-TXE-RXNE-BSY-behavior-Master-full-duplex-mode-continuous-transfers-fig253

Рис. 253. Диаграмма поведения сигналов TXE/RXNE/BSY в режиме Master / полный дуплекс (BIDIMODE=0 и RXONLY=0), когда идет непрерывная передача.

SPI-TXE-RXNE-BSY-behavior-Slave-full-duplex-mode-continuous-transfers-fig254

Рис. 254. Диаграмма поведения сигналов TXE/RXNE/BSY в режиме Slave / полный дуплекс (BIDIMODE=0 и RXONLY=0), когда идет непрерывная передача.

[Процедура "только передача" (BIDIMODE=0 RXONLY=0)]

В этом режиме процедура может быть уменьшена, как описано ниже, и бит BSY может использоваться для ожидания завершения передачи (см. рис. 255 и 256).

1. Разрешите SPI установкой бита SPE в значение 1.
2. Записать первую порцию данных для передачи в регистр SPI_DR (это очистит флаг TXE).
3. Ждать, пока не станет TXE=1, затем записать вторую порцию передаваемых данных. Повторять этот шаг для каждой порции передаваемых данных.
4. После записи последней порции данных в регистр SPI_DR, ждать пока не станет TXE=1, затем ждать, пока не станет BSY=0, что покажет завершение передачи последней порции данных.

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

Примечание: во время прерывистых обменов данными есть задержка на 2 периода тактов APB между операцией записи в SPI_DR и установкой бита BSY. Следовательно, в режиме "только передача" важно ждать сначала, пока не установится TXE, и затем не очистится BSY, после того как будут записаны последние данные. После передачи двух порций данных в режиме "только передача" установится флаг OVR в регистре SPI_SR, поскольку принятые данные никогда не были прочитаны.

SPI-TXE-BSY-behavior-Master-transmit-only-mode-continuous-transfers-fig255

Рис. 255. Диаграмма поведения сигналов TXE/BSY в режиме Master / только передача (BIDIMODE=0 и RXONLY=0), когда идет непрерывная передача.

SPI-TXE-BSY-behavior-Slave-transmit-only-mode-continuous-transfers-fig256

Рис. 256. Диаграмма поведения сигналов TXE/BSY в режиме Slave / только передача (BIDIMODE=0 и RXONLY=0), когда идет непрерывная передача.

[Двунаправленная процедура передачи (BIDIMODE=1 и BIDIOE=1)]

В этом режиме процедура такая же, как и процедура "только передача", за исключением того, что оба бита, и BIDIMODE, и BIDIOE должны быть установлены в регистре SPI_CR2 перед тем, как разрешить SPI.

[Однонаправленная процедура "только прием" (BIDIMODE=0 и RXONLY=1)]

В этом режиме процедура может быть уменьшена, как описано ниже (см. рис. 257):

1. Установите бит RXONLY в регистре SPI_CR2.
1. Разрешите SPI установкой бита SPE в значение 1:
a) В режиме master это немедленно активизирует генерацию тактов SCK, и данные будут последовательно приниматься, пока не будет запрещен SPI (SPE=0).
b) В режиме slave данные будут приниматься, когда устройство SPI master переведет сигнал NSS в лог. 0, и начнет генерацию тактов SCK.
3. Ждите, пока не станет RXNE=1 и прочитайте регистр SPI_DR, чтобы получить принятые данные (это очистит бит RXNE). Повторите эту операцию для каждого принимаемого элемента данных.

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

Примечание: если требуется запретить SPI после последней передачи, то следуйте рекомендации, описанной в секции 28.3.8: Disabling the SPI.

SPI-RXNE-behavior-receive-only-mode-continuous-transfers-fig257

Рис. 257. Диаграмма поведения RXNE в режиме только чтение (BIDIMODE=0 и RXONLY=1), когда идет непрерывная передача.

[Процедура двунаправленного приема (BIDIMODE=1 и BIDIOE=0)]

В этом режиме процедура такая же, как и процедура "только прием", за исключением того, что бит BIDIMODE должен быть установлен и BIDIOE очищен в регистре SPI_CR2 перед тем, как разрешить SPI.

[Непрерывные и прерывистые передачи]

Когда данные передаются в режиме master, если программное обеспечение достаточно быстрое, чтобы детектировать каждый фронт TXE (или отрабатывается прерывание TXE), и немедленно записать регистр SPI_DR перед завершением текущей передачи, то обмен считается непрерывным. В этом случае нет перерыва в генерации тактов SPI между каждым элементом данных, и бит BSY никогда не очищается между каждой порцией данных.

И наоборот, если программное обеспечение недостаточно быстрое, то это может привести к прерывистому обмену. В этом случае, бит BSY очищается между каждой передачей данных (см. рис. 258).

В режиме Master "только прием" (RXONLY=1), обмен всегда непрерывный и флаг BSY всегда читается как 1.

В режиме slave, непрерывность обмена определяется устройством SPI master. В любом случае, даже если обмен непрерывный, флаг BSY переходит в 0 между каждой передачей на минимальное время длительностью в один такт SPI (см. рис. 256).

SPI-TXE-BSY-behavior-trabsmitting-discontinuous-transfers-fig258

Рис. 258. Диаграмма поведения TXE/BSY при передаче (BIDIMODE=0 и RXONLY=0), в случае прерывистых передач.

[Вычисление CRC]

CRC было применено для надежности обмена данными. Для передачи и приема данных реализованы отдельные калькуляторы CRC. CRC вычисляется согласно программируемому полиному, последовательно для каждого бита. CRC вычисляется на перепаде тактов выборки, заданном битами CPHA и CPOL в регистре SPI_CR1.

Примечание: этот SPI предлагает два вида стандарта вычисления CRC, которые напрямую зависят от формата фрейма, выбранного для передачи и/или приема: 8-битные данные (CRC8) и 16-битные данные (CRC16).

Вычисление CRC разрешается установкой бита CRCEN в регистре SPI_CR1. Это действие сбрасывает регистры CRC (SPI_RXCRCR и SPI_TXCRCR). В полном дуплексе или в режиме только передачи, когда передача управляется программно (CPU mode), необходимо записать бит CRCNEXT немедленно после последней передаваемой порции данных, записанной в SPI_DR. По окончании последней передачи данных будет передано значение SPI_TXCRCR.

В режиме только приема и когда передачи управляются программно (CPU mode), необходимо записать бит CRCNEXT после второй последней порции принятых данных. Будет принята CRC сразу после приема последней порции данных, и будет произведена проверка CRC.

По окончании передач данных и CRC будет установлен флаг CRCERR в регистре SPI_SR, если было повреждение данных в процессе передачи.

Если в в буфере TX имеются данные, значение CRC передается после передачи байта данных. Во время передачи CRC калькулятор CRC выключается, и значение регистра остается неизменным.

Обмен SPI с использованием CRC возможно с использованием следующей процедуры:

1. Запрограммируйте значения CPOL, CPHA, LSBFirst, BR, SSM, SSI и MSTR.
2. Запрограммируйте полином в регистре SPI_CRCPR.
3. Разрешите вычисление CRC установкой бита CRCEN в регистре SPI_CR1. Это также очистит регистры SPI_RXCRCR и SPI_TXCRCR.
4. Разрешите SPI установкой бита SPE в регистре SPI_CR1.
5. Запустите обмен и выдерживайте обмен, пока не будут переданы или приняты все байты, кроме последнего байта или последнего полуслова.
– В режиме полного дуплекса или режиме "только передача", когда передачи управляются программно, во время записи последнего байта или последнего полуслова в буфер Tx установите бит CRCNEXT в регистре SPI_CR1, чтобы показать, что CRC была передана после передачи последнего байта.
– В режиме "только прием" установите бит CRCNEXT сразу после приема второй порции данных перед последней, чтобы подготовить SPI к входу в фазу CRC по окончании приема последней порции данных. Вычисление CRC останавливается во время передачи данных CRC.
6. После передачи последнего байта или полуслова, SPI входит в передачу CRC и в фазу проверки. В режиме полного дуплекса или в режиме "только прием" принятая CRC сравнивается со значением SPI_RXCRCR. Если значения не совпадают, то устанавливается флаг CRCERR в регистре SPI_SR, и будет сгенерировано прерывание, когда бит ERRIE установлен в регистре SPI_CR2.

Примечание: когда SPI в режиме slave, будьте внимательны и разрешайте вычисление CRC только когда такты стабильны, т. е. когда такты находятся в состоянии steady (стабильное состояние). Если это не сделать, то может произойти неправильное вычисление CRC. Фактически CRC чувствительна к входным тактам SCK slave, как только установлен CRCEN, и это независимо от того, установлен бит SPE или нет.

На высоких частотах передачи данных, будьте осторожны, когда передается CRC. Так как количество используемых циклов CPU должно быть максимально возможным в фазе передачи CRC, то запрещено вызывать программные функции во время последовательности передачи CRC, чтобы избежать ошибок в приеме последних данных и CRC. Фактически бит CRCNEXT должен быть записан перед окончанием передачи/приема последней порции данных.

Для высоких частот передачи данных рекомендуется использовать режим DMA, чтобы избежать деградации скорости SPI, так как доступ через CPU ухудшает полосу пропускания SPI.

Когда устройства сконфигурированы как slave, и используется режим аппаратного NSS, вывод NSS нужно удерживать в состоянии лог. 0 между фазой данных и фазой CRC.

Когда SPI сконфигурирован в режиме slave с разрешенной функцией подсчета CRC, то вычисление CRC производится всякий раз, когда к выводу NSS прикладывается уровень лог. 1. Это может произойти к примеру в случае multislave-окружения, где master обмена адресует устройства slave по своему выбору.

Между отключением выборки slave (лог. 1 на выводе NSS) и выборкой нового slave (низкий уровень на NSS), значение CRC должно быть очищено как на стороне master, так и на стороне slave, чтобы заново синхронизировать master и slave для соответствующего вычисления CRC.

Чтобы очистить CRC, выполните следующую процедуру:

1. Запретите SPI (SPE = 0).
2. Очистите бит CRCEN.
3. Установите бит CRCEN.
4. Разрешите SPI (SPE = 1).

[Флаги статуса SPI]

Для приложения предоставлено 4 флага статуса, чтобы полностью отслеживать состояние шины SPI.

Tx buffer empty flag (TXE, флаг сигнализации о пустом буфере передачи). Когда этот флаг установлен, то это указывает на опустошение буфера Tx, так что следующая порция данных может быть записана в буфер Tx. Флаг TXE очищается, когда осуществляется запись в регистр SPI_DR.

Rx buffer not empty (RXNE, буфер приема содержит данные). Когда установлен, этот флаг говорит о том, что в буфере Rx находятся действительные принятые данные. Флаг очищается, когда читается регистр SPI_DR.

BUSY flag (BSY, флаг занятости). Этот флаг BSY устанавливается и очищается аппаратно (запись в этот флаг не дает никакого эффекта). Флаг BSY показывает состояние слоя обмена communication SPI. Когда BSY установлен, то шина SPI занята обменом данными. Есть только одно исключение в режиме master / двунаправленный прием (MSTR=1, BDM=1 и BDOE=0), когда флаг BSY удерживается в состоянии лог. 0 во время приема.

Флаг BSY полезен для детектирования окончания передачи, если программное обеспечение хочет запретить SPI и войти в режим останова (Halt mode), или отключить тактирование периферийных устройств. Это позволит избежать порчу данных последней передачи. Для такого случая очень важно соблюдение нижеописанной процедуры.

Флаг BSY также полезен для того, чтобы избежать коллизии записи в системе multimaster.

Флаг BSY устанавливается, когда стартует передача, за исключением режима master / двунаправленный прием (MSTR=1, BDM=1 и BDOE=0).

Флаг BSY очищается в следующих случаях:

• Когда передача завершена (за исключением режима master, если обмен продолжается).
• Когда SPI запрещен.
• Когда произошла ошибка режима master (MODF=1).

Когда обмен прерывистый, флаг BSY в лог. 0 между каждым обменом.

Когда обмен непрерывный:

• В режиме master, флаг BSY сохраняет состояние лог. 1 во время всех передач.
• В режиме slave, флаг BSY переходит в лог. 0 на время одного цикла тактов SPI между каждой передачей.

Примечание: не используйте флаг BSY для отслеживания каждой передачи данных и каждого приема. Лучше использовать вместо этого флаги TXE и RXNE.

[Запрет работы SPI]

Когда передача данных завершена, приложение может остановить обмен путем запрета периферии SPI. Это осуществляется путем очистки бита SPE.

Для некоторых конфигураций запрет SPI и вход в режим Halt в тот момент, когда происходит передача, может привести к повреждению текущей передачи, и/или флаг BSY может стать ненадежным.

Чтобы избежать подобных эффектов, рекомендуется соблюдать следующую процедуру для запрета SPI:

В режиме master или slave полный дуплекс (BIDIMODE=0, RXONLY=0)
1. Ждите, пока не станет RXNE=1 для приема последней порции данных.
2. Ждите, пока не станет TXE=1.
3. Затем ждите, пока не станет BSY=0.
4. Запретите SPI (SPE=0) и, если это нужно, войдите в режим Halt (или запретите тактирование периферии).

В режиме master или slave, только передача в одном направлении (BIDIMODE=0, RXONLY=0) или двунаправленный режим передачи (BIDIMODE=1, BIDIOE=1). После последней порции данных, записанной в регистр SPI_DR:
1. Ждите TXE=1.
2. Затем ждите BSY=0.
3. Запретите SPI (SPE=0) и, если это нужно, войдите в режим Halt (или запретите тактирование периферии).

В режиме master, только прием данных в одном направлении (MSTR=1, BIDIMODE=0, RXONLY=1) или двунаправленный режим приема (MSTR=1, BIDIMODE=1, BIDIOE=0). В этом случае нужно специальным образом убедиться, что SPI не начал новую передачу. Последовательность ниже допустима только для конфигурации SPI Motorola (бит FRF установлен в 0):
1. Ждите второго перед последним RXNE=1 (n–1).
2. Затем ждите 1 цикл тактов SPI (используя опрос в цикле) перед запретом SPI (SPE=0).
3. Затем ждите следующего RXNE=1 перед тем, как войти в режим Halt (или запретом тактирования периферии).

Когда SPI сконфигурирован в режиме TI (FRF установлен в 1), то нужно соблюдать следующую процедуру, чтобы избежать генерации нежелательного импульса на выводе NSS, когда SPI запрещен:
1. Ждите 1 секунду последнего появления RXNE = 1 (n-1).
2. Запретите SPI (SPE = 0) в следующем фрейме, используя программный цикл опроса:
– После как минимум 1 цикла тактов SPI,
– Перед началом передачи следующей LSB порции данных.

Примечание: в двунаправленном режиме master (MSTR=1, BDM=1, BDOE=0), флаг BSY удерживается в состоянии 0 во время передач.

В режиме slave, только прием (MSTR=0, BIDIMODE=0, RXONLY=1) или в двунаправленном режиме приема (MSTR=0, BIDIMODE=1, BIDOE=0):
1. Вы можете запретить SPI (записать SPE=0) в любой момент времени: текущая передача завершится перед тем, как SPI реально будет запрещен.
2. Затем, если Вы хотите войти в режим Halt, Вы должны ожидать BSY=0 перед тем, как войти в режим Halt (или перед запретом тактов периферии).

[Обмен через SPI с использованием DMA]

Для того, чтобы работать с максимальной скоростью, в SPI нужно поставлять данные для передачи, и также нужно читать буфер приема, чтобы избежать потери данных на приеме (overrun). Для того, чтобы упростить передачи, в SPI реализована возможность использования DMA, здесь применен простой протокол запроса/подтверждения.

Доступ через DMA запрашивается, когда разрешены соответствующие биты в регистре SPI_CR2 (TXDMAEN и RXDMAEN). Для буферов Tx и Rx могут быть выставлены отдельные запросы (см. рис. 259 и 260):

• При передаче запрос DMA выдается каждый раз, когда флаг TXE установлен в 1. Затем DMA записывает регистр SPI_DR (что очистит флаг TXE).
• На приеме запрос DMA выдается всякий раз, когда флаг RXNE установлен в 1. Затем DMA читает регистр SPI_DR (это очистит флаг RXNE).

Когда SPI используется только для передачи данных, можно разрешить только канал SPI Tx DMA. В этом случае флаг OVR установится, потому что принятые данные не будут прочитаны.

Когда SPI используется только для приема данных, можно разрешить только канал SPI Rx DMA.

В режиме передачи, когда DMA записал все данные для передачи (установился флаг TCIF в регистре DMA_ISR), может отслеживаться флаг BSY, чтобы удостовериться в том, что обмен через SPI завершился. Это требуется для того, чтобы предотвратить порчи передачи последней порции данных перед запретом SPI или входом в режим Stop. Программное обеспечение должно ожидать TXE=1 и затем ожидать BSY=0.

Примечание: во время прерывистого обмена есть задержка величиной в 2 такта APB между операцией записи в SPI_DR и установкой флага BSY. Как следствие обязательно ждите сначала TXE=1, и затем ждите BSY=0 после записи последней порции данных.

SPI-transmission-using-DMA-fig259

Рис. 259. Передача с использованием DMA.

SPI-reception-using-DMA-fig260

Рис. 260. Прием с использованием DMA.

DMA вместе с вычислением CRC. Когда разрешен обмен с вычислением CRC, и используется режим DMA, то передача и прием CRC по окончании обмена происходит автоматически, так что не нужно использовать бит CRCNEXT. После приема CRC нужно прочитать значение CRC в регистре SPI_DR, чтобы очистить флаг RXNE.

По окончании передачи данных и CRC, будет установлен флаг CRCERR в регистре SPI_SR, если произошло повреждение данных во время передачи.

[Флаги ошибок]

Master mode fault (MODF), флаг ошибки режима master. Событие этой ошибки происходит, когда у устройства master есть вывод NSS, подтянутый к уровню лог. 0 (NSS в аппаратном режиме), или когда бит SSI равен 0 (когда NSS в программном режиме), это автоматически установит бит MODF. Master mode fault влияет на периферийное устройство SPI следующим образом:

• Бит MODF устанавливается, и генерируется прерывание SPI, если установлен бит ERRIE.
• Очищается бит SPE. Это блокирует все выходные сигналы от устройства, и запрещает интерфейс SPI.
• Очищается бит MSTR, так что устройство принудительно переходит в режим slave.

Используйте следующую программную последовательность, чтобы очистить бит MODF:

1. Сделайте доступ на чтение или запись регистра SPI_SR, пока бит MODF установлен.
2. Затем сделайте запись в регистр SPI_CR1.

Чтобы избежать конфликта нескольких устройств slave в системе, которая состоит из нескольких MCU, вывод NSS должен быть подтянут к лог. 1 во время последовательности очистки бита MODF. Биты SPE и MSTR можно восстановить в свое оригинальное состояние после последовательности очистки бита MODF.

В целях безопасности аппаратура не разрешает установку битов SPE и MSTR, когда установлен бит MODF.

Когда устройство находится в режиме slave, бит MODF не может быть установлен. Однако в конфигурации multimaster устройство может быть в режиме slave с установленным битом MODF. В этом случае бит MODF показывает, что возможно был конфликт multimaster для системы управления. Обработчик прерывания может быть использован, чтобы чисто восстановиться из этого состояния путем выполнения сброса или возврата в состояние по умолчанию.

Флаг Overrun (OVR). Событие потери данных (overrun) произойдет, когда устройство master отправило байты данных и устройство slave не очистило бит RXNE, который был установлен после получения предыдущих байт данных. Когда произошла ошибка overrun, установится бит OVR, и будет сгенерировано прерывание, если установлен бит ERRIE.

В этом случае буфер приемника не будет обновлен новыми принятыми данными от устройства master. Чтение из регистра SPI_DR возвратит этот байт. Все другие байты, которые были переданы после этого байта, будут потеряны.

Очистка бита OVR происходит при чтении из регистра SPI_DR, после которого произойдет доступ на чтение регистра SPI_SR.

Ошибка CRC. Этот флаг используется для проверки целостности принятых данных, когда установлен бит CRCEN в регистре SPI_CR1. Флаг CRCERR в регистре SPI_SR устанавливается, если значение, принятое в регистр сдвига, не соответствует значению SPI_RXCRCR приемника.

Режим фрейма TI, ошибка формата (FRE). Ошибка формата фрейма TI детектируется, когда случается импульс NSS во время процесса обмена, и когда SPI работает в режиме slave, и сконфигурирован в режиме для поддержки протокола TI. Когда произошла такая ошибка, устанавливается флаг FRE в регистре SPI_SR. При возникновении такой ошибки SPI не запрещается, импульс NSS игнорируется, и SPI ждет следующего импульса NSS перед началом новой передачи. Данные могут быть повреждены, так как в результате детектирования ошибки могут быть потеряны 2 байта данных.

Флаг FRE очищается, когда читается регистр SPI_SR. Если бит ERRIE установлен, то при детектировании ошибки NSS генерируется прерывание. В этом случае SPI должен быть запрещен, потому что целостность данных больше не гарантируется, и обмен должен быть заново инициирован устройством master, когда SPI будет снова разрешен.

SPI-TI-mode-frame-format-error-detection-fig261

Рис. 261. Детектирование ошибки формата фрейма режима TI.

[Прерывания SPI]

Таблица 125. SPI interrupt requests.

Interrupt event (событие прерывания) Флаг Разрешающий бит
Флаг опустошения буфера передачи. TXE TXEIE
Флаг, сигнализирующий, что буфер приема не пуст. RXNE RXNEIE
Событие ошибки режима Master. MODF ERRIE
Флаг пропуска данных (overrun). OVR
Флаг ошибки CRC. CRCERR
Ошибка формата фрейма TI. FRE ERRIE

[Регистры SPI]

Прим. переводчика: некоторые регистры используются как для SPI, так и для I2S. Описание регистров I2S опущено.

Для наглядности в описании битов регистров используются следующие аббревиатуры и обозначения.

read/write (rw) программа может читать и записывать эти биты.
read-only (r) программа может только читать эти биты.
write-only (w) программа может только записывать эти биты. Чтение этих бит вернет значение сброса.
read/clear (rc_w1) программа может читать, как и очищать эти биты путем записи туда 1. Запись 0 не оказывает никакого эффекта на значение бита.
read/clear (rc_w0) программа может читать, как и очищать эти биты путем записи туда 0. Запись 1 не оказывает никакого эффекта на значение бита.
read/clear by read (rc_r) программа может читать этот бит. Чтение автоматически очищает бит, сбрасывая его в 0. Запись 0 не оказывает никакого эффекта на значение бита.
read/set (rs) программа может читать этот бить, а также устанавливать его. Запись 0 не оказывает никакого эффекта на значение бита.
read-only write trigger (rt_w) программа может читать этот бит. Запись 0 или 1 вызывает срабатывание события, но не оказывает влияния на значение бита.
toggle (t) программа может только лишь переключить этот бит, записав туда 1. Запись 0 не дает никакого эффекта.
Reserved (Res.) зарезервированный бит, его значение должно сохраняться на значении сброса.

Таблица 128. Карта регистров SPI, их значение после сброса.

SPI-register-map-and-reset-values-table128

В таблице приведена памятка по регистрам SPI, дальше регистры описываются подробно.

Это регистр управления 1, в режиме I2S он не используется. Адрес смещения 0x00, значение после сброса 0x0000.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
BIDI
MODE
BIDI
OE
CRC
EN
CRC
NEXT
DFF RX
ONLY
SSM SSI LSB
FIRST
SPE BR[2:0] MSTR CPOL CPHA
rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw

BIDIMODE: Bidirectional data mode enable, разрешение режима двунаправленного обмена. 0: выбран однонаправленный режим обмена данными по 2 сигнальным линиям, 1: двунаправленный режим обмена по 1 сигнальной линии.

BIDIOE: Output enable in bidirectional mode, разрешение работы выхода в двунаправленном режиме. Этот бит в комбинации с битом BIDIMODE выбирает направление передачи в двунаправленном режиме. 0: выход запрещен (только прием), 1: выход разрешен (только передача).

Примечание: для двунаправленной передачи режиме master используется вывод MOSI, в режиме slave используется вывод MISO.

CRCEN: разрешение аппаратного вычисления CRC, если в этот бит записана 1.

Примечание: для обеспечения корректного функционирования этот бит должен записываться только тогда, когда SPI запрещен (SPE=0).

CRCNEXT: CRC transfer next, признак того, что нужно закончить вычисление CRC и переслать её значение. 0: все еще продолжается фаза данных (идет подсчет CRC), 1: в следующей передаче должно находиться значение CRC.

Примечание: когда SPI сконфигурирован на полный дуплекс, или режимов "только передача", бит CRCNEXT должен быть установлен сразу за последней записью порции данных в регистр SPI_DR (т. е. максимально быстро, без паузы). Когда SPI сконфигурирован в режиме "только прием", бит CRCNEXT должен быть установлен после приема предпоследней (second last) порции данных. Этот бит должен быть всегда очищен, когда передачи идут под управлением DMA.

DFF: Data frame format, формат фрейма данных. 0: для передачи/приема выбран 8-битный фрейм, 1: 16-битный фрейм.

Примечание: для корректного функционирования этот бит должен быть записан только когда SPI запрещен (SPE=0).

RXONLY: Receive only, только прием. Этот бит в комбинации с битом BIDIMODE выбирает направление передачи в 2-сигнальном однонаправленном режиме. Этот бит также полезен в системе multislave, в которой к этому отдельному slave нет обращения, так что выход этого slave не портит обмен данными. 0: полный дуплекс (и передача, и прием), 1: выход запрещен (режим "только прием").

SSM: Software slave management, программное управление устройством slave. Когда этот бит установлен, вход вывода NSS заменяет значение бита SSI. 0: программное управление slave запрещено (работает аппаратное через ножку NSS), 1: программное управление slave разрешено.

Примечание: этот бит не используется в режиме SPI TI.

SSI: Slave select internal. Этот бит имеет значение только тогда, когда установлен бит SSM. Значение бита SSI принудительно работает как сигнал с линии NSS, при этом состояние входа NSS игнорируется.

Примечание: этот бит не используется в режиме SPI TI.

LSBFIRST: Least Significant Bit First, этот бит определяет формат фрейма (в каком порядке по старшинству следуют биты во фрейме). 0: MSB следует первым, 1: LSB следует первым.

Примечание: этот бит не должен изменяться, пока идет процесс обмена данными. Этот бит не используется в режиме SPI TI.

SPE: SPI enable, разрешение работы SPI. 0: периферийное устройство SPI запрещено, 1: разрешено.

Примечание: чтобы корректно запретить SPI, следуйте процедуре, описанной в разделе "Запрет работы SPI".

BR[2:0]: Baud rate control, управление скоростью передачи (частотой тактов SCK).

000: fPCLK/2
001: fPCLK/4
010: fPCLK/8
011: fPCLK/16
100: fPCLK/32
101: fPCLK/64
110: fPCLK/128
111: fPCLK/256

Примечание: эти биты не должны изменяться, пока идет процесс обмена данными.

MSTR: Master selection, выбор режима Master. 0: устройство SPI сконфигурировано как Slave (подчиненное), 1: как Master (главное).

Примечание: этот бит не должен изменяться, пока идет процесс обмена данными.

CPOL: Clock polarity, полярность тактов. 0: неактивный перепад с 1 на 0 (значение бита выбирается по нарастающему фронту тактового сигнала), 1: неактивный перепад с 0 на 1 (значение бита выбирается по спаду тактового сигнала).

Примечание: этот бит не должен изменяться, пока идет процесс обмена данными. Этот бит не используется в режиме SPI TI.

CPHA: Clock phase, фаза тактов. 0: первый перепад тактового сигнала является первым моментом выборки значения бита, 1: второй перепад тактового сигнала является первым моментом выборки значения бита.

Примечание: этот бит не должен изменяться, пока идет процесс обмена данными. Этот бит не используется в режиме SPI TI.

Регистр управления 2. Смещение адреса 0x04, значение после сброса 0x0000.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Reserved TXEIE RXNEIE ERRIE FRF Res. SSOE TXDMAEN RXDMAEN
rw rw rw rw rw rw rw

Биты 15:8 зарезервированы, их значение должно сохраняться на значении после сброса. Бит 3 также зарезервирован, он аппаратно удерживается в значении 0.

TXEIE: Tx buffer empty interrupt enable, разрешение прерывания по событию опустошения буфера передачи. 0: прерывание по флагу TXE замаскировано (не будет срабатывать), 1: прерывание по флагу TXE разрешено (в этом случае запустится обработчик прерывания, когда флаг TXE установится).

RXNEIE: RX buffer not empty interrupt enable, разрешение прерывания по событию, когда буфер приема оказался не пуст. 0: прерывание по флагу RXNE замаскировано (не будет срабатывать), 1: прерывание по флагу RXNE разрешено (в этом случае запустится обработчик прерывания, когда флаг RXNE установится).

ERRIE: Error interrupt enable, разрешение прерывания по возникновению ошибки. Этот бит управляет генерацией прерывания, когда произойдет событие ошибки (по флагам CRCERR, OVR, MODF в режиме SPI, FRE в режиме TI, UDR, OVR и FRE в режиме I2S). 0: прерывание замаскировано (не будет срабатывать), 1: разрешено.

FRF: Frame format, формат фрейма. 0: режим SPI Motorola, 1: режим SPI TI.

SSOE: SS output enable, разрешение работы выхода выборки подчиненного устройства. 0: выход управления Slave Select в режиме master запрещен, и ячейка может работать в конфигурации multimaster, 1: в режиме master выход Slave Select разрешен, когда ячейка разрешена. Ячейка не может работать в среде multimaster.

Примечание: этот бит не используется в режиме SPI TI.

TXDMAEN: Tx buffer DMA enable, работа буфера передачи через DMA разрешена. Когда этот бит установлен, делается запрос DMA независимо от того, установлен ли флаг TXE, или нет. 0: буфер Tx DMA запрещен, 1: разрешен.

RXDMAEN: Rx buffer DMA enable, работа буфера приема через DMA разрешена. Когда этот бит установлен, делается запрос DMA независимо от того, установлен ли флаг RXNE, или нет. 0: буфер Rx DMA запрещен, 1: разрешен.

Регистр статуса SPI, смещение адреса 0x08, значение после сброса 0x0002.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Reserved FRE BSY OVR MODF CRC
ERR
UDR CHSID
E
TXE RXNE
r r r r rc_w0 r r r r

Биты 15:9 зарезервированы, их значение аппаратно удерживается в значении 0.

FRE: Frame format error, ошибка формата фрейма. 0: не было ошибки формата фрейма, 1: ошибка формата фрейма произошла. Этот флаг устанавливается аппаратно и очищается программно, когда читается регистр SPIx_SR.

Примечание: этот флаг используется, когда SPI работает в режиме TI slave или I2S slave, за подробностями обращайтесь к секции Errors flags (флаги ошибок) даташита.

BSY: Busy flag, флаг занятости. 0: SPI (или I2S) не занят, 1: интерфейс занят обменом, или буфер Tx не пуст. Этот флаг устанавливается и сбрасывается аппаратно.

Примечание: флаг BSY должен использоваться с некоторыми предосторожностями, см. секции "Флаги статуса SPI" и "Запрет работы SPI".

OVR: Overrun flag, флаг потери данных. 0: потери данных не было, 1: произошла потеря данных на приеме, т. е. данные не были вовремя считаны. Этот флаг устанавливается аппаратно, и сбрасывается программно выполнением специальной последовательности действий (см. секцию "Флаги ошибок", описание флага OVR).

MODF: Mode fault, ошибка режима. 0: ошибки не было, 1: произошла ошибка режима. Этот флаг устанавливается аппаратно, и сбрасывается программно выполнением специальной последовательности действий (см. секцию "Флаги ошибок", описание флага MODF).

CRCERR: CRC error flag, флаг ошибки контрольной суммы. 0: принятое CRC соответствует значению SPI_RXCRCR, 1: это не так, произошла ошибка. Этот флаг устанавливается аппаратно, и сбрасывается программно путем записи в него 0.

UDR: Underrun flag, флаг недостаточности данных. 0: не было события underrun, 1: буфер передатчика не успел вовремя заполниться новыми данными для передачи. Этот флаг устанавливается аппаратно, и сбрасывается программно выполнением специальной последовательности действий (см. секцию "Флаги ошибок", описание флага UDR).

Примечание: этот бит не используется в режиме SPI.

CHSIDE: Channel side, флаг канала. 0: был передан или принят левый канал стерео, 1: правый канал.

Примечание: этот бит не используется в режиме SPI, и подразумевается, что он относится к PCM.

TXE: Transmit buffer empty, флаг пустоты буфера передатчика. 0: буфер Tx передатчика содержит данные для отправки, пока не переписанные в регистр сдвига, 1: буфер Tx передатчика пуст, и готов к записи новых данных.

RXNE: Receive buffer not empty, буфер приемника не пуст. 0: буфер Rx приемника пуст, данные пока не приняты, 1: буфер Rx приемника не пуст, т. е. содержит новые принятые данные, которые должны быть прочитаны программой.

Регистр данных SPI, который служит для доступа к буферам приема и передачи. Смещение адреса 0x0C, значение после сброса 0x0000.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
DR[15:0]
rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw

DR[15:0]: Data register, регистр данных, который служит для приема или передачи данных. Регистр данных служит для доступа к 2 отдельным буферам - один для записи (Tx, Transmit Buffer, буфер передачи), другой для чтения (Rx, Receive Buffer, буфер приема). Запись в регистр данных записывает данные в буфер Tx, и чтение регистра данных осуществляет чтение буфера Rx.

Примечание: есть несколько замечаний для режима SPI:

В зависимости от бита выбора формата фрейма (бит DFF в регистре SPI_CR1), отправляемые данные имеют длину либо 8, либо 16 бит. Этот выбор должен быть сделан до разрешения работы SPI, чтобы обеспечить корректное функционирование.

Для фрейма 8 бит буферы 8-битные, и используется только младший байт (SPI_DR[7:0]) регистра для передачи/приема. В режиме приема старший байт регистра (SPI_DR[15:8]) принудительно равен 0.

Для фрейма 16 бит буферы 16-битные, и для передачи/приема задействован весь регистр полностью SPI_DR[15:0].

Регистр полинома для CRC, адрес смещения 0x10, значение после сброса 0x0007.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
CRCPOLY[15:0]
rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw

CRCPOLY[15:0]: CRC polynomial register, регистр для хранения полинома вычисления CRC. После сброса регистр содержит полином 0x0007, который может быть при необходимости программно изменен на другой.

Регистр CRC для приема, адрес смещения 0x14, значение после сброса 0x0000.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
RXCRC[15:0]
r r r r r r r r r r r r r r r r

RXCRC[15:0]: Rx CRC register, регистр вычисленной CRC для принятого потока данных. Когда вычисление CRC разрешено, биты RxCRC[15:0] содержат вычисленную контрольную сумму от последовательно принятых байт. Этот регистр сбрасывается, когда в бит CRCEN в регистре SPI_CR1 записывается 1. CRC вычисляется с задействованием полинома, запрограммированного в регистре SPI_CRCPR.

Учитываются только 8 младших бит, когда формат фрейма установлен 8 бит (DFF=0 в регистре SPI_CR1), в этом случае вычисление CRC производится по стандарту CRC8. Задействованы все 16 бит этого регистра, когда выбран 16-битный формат фрейма данных (DFF=1 в регистре SPI_CR1), в этом случае вычисление CRC производится по стандарту CRC16.

Примечание: чтение этого регистра, когда установлен флаг BSY, вернет некорректное значение.

Регистр CRC для передачи, адрес смещения 0x18, значение после сброса 0x0000.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
TXCRC[15:0]
r r r r r r r r r r r r r r r r

TXCRC[15:0]: Tx CRC register, регистр вычисленной CRC для переданного потока данных. Когда вычисление CRC разрешено, биты TxCRC[15:0] содержат вычисленную контрольную сумму от последовательно переданных байт. Этот регистр сбрасывается, когда в бит CRCEN в регистре SPI_CR1 записывается 1. CRC вычисляется с задействованием полинома, запрограммированного в регистре SPI_CRCPR.

Учитываются только 8 младших бит, когда формат фрейма установлен 8 бит (DFF=0 в регистре SPI_CR1), в этом случае вычисление CRC производится по стандарту CRC8. Задействованы все 16 бит этого регистра, когда выбран 16-битный формат фрейма данных (DFF=1 в регистре SPI_CR1), в этом случае вычисление CRC производится по стандарту CRC16.

Примечание: чтение этого регистра, когда установлен флаг BSY, вернет некорректное значение.

[Ссылки]

1. Интерфейс SPI.
2. Olimex STM32-P407.
3STM32: аббревиатуры и термины.

 

Комментарии  

 
0 #1 Shamil 10.02.2015 14:09
Скажите пожалуйста, а как можно добавить в spi ещё один вывод ss(cs)? Нужно, чтобы на один spi приходилось два slave. Просто в даташите указано 4 вывода для каждой spi1 (2 или 3).
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page