Регистры SPI STM32F4
Регистры SPI1–SPI6 STM32F4: режим ведущего или ведомого, полярность и фаза SCK, делитель частоты, размер кадра, протокол Motorola или TI, программный NSS, флаги, CRC, DMA и регистры I2S у SPI2, SPI3, I2S2ext и I2S3ext.
SPI1, SPI4, SPI5 и SPI6 тактируются от шины APB2, SPI2 и SPI3 — от APB1; SPI4–SPI6 есть только у STM32F42x/43x. Частота SCK ведущего — fPCLK, делённая на 2…256. SPI2 и SPI3 работают и как I2S, а дополнительные блоки I2S2ext и I2S3ext добавляют им второй канал данных для полнодуплексного I2S (RM0090, раздел 28.4.2).
Режим SPI задают CPOL — уровень SCK в паузе — и CPHA — фронт захвата данных. Бит FRF переключает протокол с Motorola на TI: в нём полярность, фаза и сигнал NSS заданы самим протоколом, а ошибку формата кадра у ведомого показывает флаг FRE. Если вывод NSS ведущему не нужен, ставят SSM = 1 и SSI = 1, иначе низкий уровень NSS вызовет ошибку режима MODF.
Флаг OVR сбрасывают чтением DR, а затем SR, CRCERR — записью нуля, MODF — обращением к SR и следом записью в CR1. Перед выключением SPI в полнодуплексном режиме дожидаются RXNE = 1 с последними данными, затем TXE = 1 и BSY = 0.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| I2S2ext | 0x4000 3400 | всех |
| SPI2 | 0x4000 3800 | всех |
| SPI3 | 0x4000 3C00 | всех |
| I2S3ext | 0x4000 4000 | всех |
| SPI1 | 0x4001 3000 | всех |
| SPI4 | 0x4001 3400 | STM32F427, STM32F429, STM32F437, STM32F439 |
| SPI5 | 0x4001 5000 | STM32F427, STM32F429, STM32F437, STM32F439 |
| SPI6 | 0x4001 5400 | STM32F427, STM32F429, STM32F437, STM32F439 |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| SPI_CR1 | 0x00 | Режим, скорость и формат кадра SPI | 0x0000 |
| SPI_CR2 | 0x04 | Прерывания, DMA и вывод NSS | 0x0000 |
| SPI_SR | 0x08 | Флаги состояния и ошибок | 0x0002 |
| SPI_DR | 0x0C | Данные | 0x0000 |
| SPI_CRCPR | 0x10 | Полином CRC | 0x0007 |
| SPI_RXCRCR | 0x14 | CRC принятых данных | 0x0000 |
| SPI_TXCRCR | 0x18 | CRC переданных данных | 0x0000 |
| SPI_I2SCFGR | 0x1C | Настройка режима I2S | 0x0000 |
| SPI_I2SPR | 0x20 | Делитель частоты I2S | 0x0002 |
Конструктор значения
Выберите регистр и значения полей — конструктор покажет 32-битное значение и строку на C с макросами CMSIS. Поля, которые вы не меняете, берутся из значения после сброса.
Значение: 0x00000000
0000 0000 0000 0000 0000 0000 0000 0000
I2S2ext->CR1 = 0x00000000;SPI_CR1 — режим, скорость и формат кадра SPI
Смещение 0x00, 32 бит, после сброса 0x0000. В коде: I2S2ext->CR1.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| BIDIMODE | BIDIOE | CRCEN | CRCNEXT | DFF | RXONLY | SSM | SSI | LSBFIRST | SPE | BR | MSTR | CPOL | CPHA | ||
- BIDIMODE (бит 15) — Двунаправленный обмен по одной линии данных.
- BIDIOE (бит 14) — Направление в двунаправленном режиме: приём или передача.
BIDIOE Значение 0 Приём 1 Передача - CRCEN (бит 13) — Аппаратный расчёт CRC; меняется при выключенном SPI.
- CRCNEXT (бит 12) — Следующей передаётся CRC.
- DFF (бит 11) — Размер кадра: 8 или 16 бит; меняется при выключенном SPI.
DFF Значение 0 8 бит 1 16 бит - RXONLY (бит 10) — Только приём в двухпроводном режиме.
- SSM (бит 9) — Программное управление NSS: вместо вывода берётся бит SSI.
- SSI (бит 8) — Уровень NSS при программном управлении.
- LSBFIRST (бит 7) — Порядок битов в кадре.
LSBFIRST Значение 0 Старшим битом вперёд 1 Младшим битом вперёд - SPE (бит 6) — Включение SPI.
- BR (биты 5:3) — Делитель частоты SCK от частоты шины.
BR Значение 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 (бит 2) — Ведущий или ведомый.
MSTR Значение 0 Ведомый 1 Ведущий - CPOL (бит 1) — Уровень SCK в паузе.
CPOL Значение 0 Низкий уровень 1 Высокий уровень - CPHA (бит 0) — Фронт SCK, по которому захватываются данные.
CPHA Значение 0 Первый фронт SCK 1 Второй фронт SCK
SPI_CR2 — прерывания, DMA и вывод NSS
Смещение 0x04, 32 бит, после сброса 0x0000. В коде: I2S2ext->CR2.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | TXEIE | RXNEIE | ERRIE | FRF | — | SSOE | TXDMAEN | RXDMAEN | |||||||
- TXEIE (бит 7) — Прерывание по флагу TXE.
- RXNEIE (бит 6) — Прерывание по флагу RXNE.
- ERRIE (бит 5) — Прерывание по ошибкам: CRCERR, OVR и MODF, в режиме I2S — UDR и OVR.
- FRF (бит 4) — Протокол: Motorola или TI.
FRF Значение 0 Motorola 1 TI - SSOE (бит 2) — Выход NSS у ведущего; с ним работа с другими ведущими невозможна.
- TXDMAEN (бит 1) — Запрос DMA по флагу TXE.
- RXDMAEN (бит 0) — Запрос DMA по флагу RXNE.
SPI_SR — флаги состояния и ошибок
Смещение 0x08, 32 бит, после сброса 0x0002. В коде: I2S2ext->SR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | FRE | BSY | OVR | MODF | CRCERR | UDR | CHSIDE | TXE | RXNE | ||||||
- FRE (бит 8) — Ошибка формата кадра (ведомый TI или I2S); сбрасывается чтением SR.
- BSY (бит 7) — Занят: идёт обмен или буфер передачи не пуст.
- OVR (бит 6) — Переполнение: принятые данные не прочитаны вовремя.
- MODF (бит 5) — Ошибка режима: у ведущего низкий уровень NSS.
- CRCERR (бит 4) — Ошибка CRC; сбрасывается записью 0.
- UDR (бит 3) — Опустошение в режиме I2S: данные для передачи не записаны вовремя.
- CHSIDE (бит 2) — Канал I2S текущих данных: левый или правый.
CHSIDE Значение 0 Левый 1 Правый - TXE (бит 1) — Буфер передачи пуст.
- RXNE (бит 0) — Буфер приёма не пуст.
SPI_DR — данные
Смещение 0x0C, 32 бит, после сброса 0x0000. В коде: I2S2ext->DR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| DR | |||||||||||||||
- DR (биты 15:0) — Данные: запись — в буфер передачи, чтение — из буфера приёма.
SPI_CRCPR — полином CRC
Смещение 0x10, 32 бит, после сброса 0x0007. В коде: I2S2ext->CRCPR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| CRCPOLY | |||||||||||||||
- CRCPOLY (биты 15:0) — Полином CRC; после сброса 0x0007.
SPI_RXCRCR — cRC принятых данных
Смещение 0x14, 32 бит, после сброса 0x0000. В коде: I2S2ext->RXCRCR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| RXCRC | |||||||||||||||
- RXCRC (биты 15:0) — CRC, вычисленная по принятым данным.
SPI_TXCRCR — cRC переданных данных
Смещение 0x18, 32 бит, после сброса 0x0000. В коде: I2S2ext->TXCRCR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TXCRC | |||||||||||||||
- TXCRC (биты 15:0) — CRC, вычисленная по переданным данным.
SPI_I2SCFGR — настройка режима I2S
Смещение 0x1C, 32 бит, после сброса 0x0000. В коде: I2S2ext->I2SCFGR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | I2SMOD | I2SE | I2SCFG | PCMSYNC | — | I2SSTD | CKPOL | DATLEN | CHLEN | ||||||
- I2SMOD (бит 11) — Режим блока: SPI или I2S.
I2SMOD Значение 0 SPI 1 I2S - I2SE (бит 10) — Включение I2S.
- I2SCFG (биты 9:8) — Роль и направление I2S.
I2SCFG Значение 00 Ведомый, передача 01 Ведомый, приём 10 Ведущий, передача 11 Ведущий, приём - PCMSYNC (бит 7) — Синхронизация кадра в стандарте PCM.
PCMSYNC Значение 0 Короткая 1 Длинная - I2SSTD (биты 5:4) — Стандарт протокола I2S.
I2SSTD Значение 00 I2S Philips 01 Выравнивание по старшему биту (left justified) 10 Выравнивание по младшему биту (right justified) 11 PCM - CKPOL (бит 3) — Уровень тактового сигнала I2S в паузе.
CKPOL Значение 0 Низкий уровень 1 Высокий уровень - DATLEN (биты 2:1) — Длина данных.
DATLEN Значение 00 16 бит 01 24 бита 10 32 бита 11 Недопустимо - CHLEN (бит 0) — Длина канала; действует только при 16-битных данных.
CHLEN Значение 0 16 бит 1 32 бита
SPI_I2SPR — делитель частоты I2S
Смещение 0x20, 32 бит, после сброса 0x0002. В коде: I2S2ext->I2SPR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | MCKOE | ODD | I2SDIV | ||||||||||||
- MCKOE (бит 9) — Выход опорной частоты MCK у ведущего.
- ODD (бит 8) — Нечётный делитель: 2 × I2SDIV + 1.
- I2SDIV (биты 7:0) — Линейный делитель частоты I2S.
Частые вопросы
Какая максимальная частота SCK у SPI1 STM32F407?
SCK ведущего — частота шины, делённая минимум на 2. SPI1 сидит на APB2, у STM32F405/407 она до 84 МГц, поэтому делитель 2 даёт 42 МГц. Достижима ли такая скорость на практике, зависит от выводов и ведомого — предельные значения смотрите в даташите своего микроконтроллера.
Как включить полнодуплексный I2S на STM32F4?
Основной блок (SPI2 или SPI3 в режиме I2S) передаёт или принимает, а парный I2S2ext или I2S3ext работает в обратную сторону на своём выводе данных с теми же тактами. Оба настраиваются в регистрах I2SCFGR, а делитель частоты задаётся только у основного блока.
Что делает бит FRF?
Переключает SPI в протокол TI: кадр сопровождается импульсом на выводе NSS, полярность и фаза SCK фиксированы протоколом. В режиме ведомого SPI проверяет этот импульс и при ошибке ставит флаг FRE.
Источники
- STMicroelectronics. RM0090: Reference manual (Rev 22) — раздел 28.5: описание регистров, назначение полей и значения после сброса
- STMicroelectronics. cmsis-device-f4 v2.6.11: заголовки CMSIS stm32f405xx.h, stm32f407xx.h, stm32f415xx.h, stm32f417xx.h, stm32f427xx.h, stm32f429xx.h, stm32f437xx.h, stm32f439xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры STM32F4
- Все регистры STM32F4Блоки периферии и заголовки CMSIS
- RCC — сброс и тактированиеRCC_CR, RCC_PLLCFGR, RCC_CFGR, RCC_CIR, RCC_AHB1RSTR, RCC_AHB2RSTR
- GPIO — порты ввода-выводаGPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_IDR, GPIOx_ODR
- SYSCFG — системная конфигурацияSYSCFG_MEMRMP, SYSCFG_PMC, SYSCFG_EXTICR1, SYSCFG_EXTICR2, SYSCFG_EXTICR3, SYSCFG_EXTICR4
- EXTI — контроллер внешних прерываний и событийEXTI_IMR, EXTI_EMR, EXTI_RTSR, EXTI_FTSR, EXTI_SWIER, EXTI_PR
- USART — последовательные порты USART и UARTUSART_SR, USART_DR, USART_BRR, USART_CR1, USART_CR2, USART_CR3
- I2C — интерфейс I2CI2C_CR1, I2C_CR2, I2C_OAR1, I2C_OAR2, I2C_DR, I2C_SR1
- TIM — таймерыTIMx_CR1, TIMx_CR2, TIMx_SMCR, TIMx_DIER, TIMx_SR, TIMx_EGR
- DMA — контроллеры прямого доступа к памятиDMA_LISR, DMA_HISR, DMA_LIFCR, DMA_HIFCR, DMA_SxCR, DMA_SxNDT
- ADC — аналого-цифровые преобразователиADC_SR, ADC_CR1, ADC_CR2, ADC_SMPR1, ADC_SMPR2, ADC_JOFR1
- IWDG — независимый сторожевой таймерIWDG_KR, IWDG_PR, IWDG_RLR, IWDG_SR
- WWDG — оконный сторожевой таймерWWDG_CR, WWDG_CFR, WWDG_SR
- CRC — блок вычисления CRCCRC_DR, CRC_IDR, CRC_CR
- DBGMCU — регистры отладкиDBGMCU_IDCODE, DBGMCU_CR, DBGMCU_APB1_FZ, DBGMCU_APB2_FZ