Регистры SPI STM32F0
Регистры SPI1 и SPI2 STM32F0: режим ведущего или ведомого, полярность и фаза SCK, делитель частоты, размер кадра от 4 до 16 бит, FIFO приёма и передачи, программный NSS, CRC, DMA и I2S.
SPI STM32F0 отличается от SPI STM32F1 и F4 двумя вещами: размер кадра задаётся полем DS в CR2 от 4 до 16 бит, и у приёмника и передатчика есть FIFO по 32 бита. Доступ к DR 8-битной записью передаёт один кадр до 8 бит, 16-битной — два кадра или один до 16 бит; для приёма 8-битных кадров установите FRXTH = 1, иначе RXNE появится только после двух байт (RM0091, раздел 28.5.9).
Частота SCK ведущего — PCLK / 2…256 (поле BR). Если NSS не нужен, ведущему ставят SSM = 1 и SSI = 1. Флаги FTLVL и FRLVL показывают заполнение FIFO; перед выключением SPI дождитесь FTLVL = 0 и BSY = 0, затем прочитайте оставшиеся данные.
Режим I2S (регистры I2SCFGR и I2SPR) есть не у всех линеек и не у всех SPI — какие блоки его поддерживают, указано в таблице возможностей SPI в главе 28 RM0091 и в даташите.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| SPI2 | 0x4000 3800 | STM32F042, STM32F048, STM32F051, STM32F058, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098 |
| SPI1 | 0x4001 3000 | всех |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| SPI_CR1 | 0x00 | Режим, скорость, CPOL и CPHA | 0x0000 |
| SPI_CR2 | 0x04 | Размер кадра, прерывания и DMA | 0x0700 |
| SPI_SR | 0x08 | Флаги состояния и уровень FIFO | 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
SPI2->CR1 = 0x00000000;SPI_CR1 — режим, скорость, CPOL и CPHA
Смещение 0x00, 32 бит, после сброса 0x0000. В коде: SPI2->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 | CRCL | RXONLY | SSM | SSI | LSBFIRST | SPE | BR | MSTR | CPOL | CPHA | ||
- BIDIMODE (бит 15) — Двунаправленный обмен по одной линии данных.
- BIDIOE (бит 14) — Направление в двунаправленном режиме: приём или передача.
- CRCEN (бит 13) — Аппаратный расчёт CRC; меняется при выключенном SPI.
- CRCNEXT (бит 12) — Следующей передаётся CRC.
- CRCL (бит 11) — Длина CRC: 8 или 16 бит.
- RXONLY (бит 10) — Только приём в двухпроводном режиме.
- SSM (бит 9) — Программное управление NSS: вместо вывода берётся бит SSI.
- SSI (бит 8) — Уровень NSS при программном управлении.
- LSBFIRST (бит 7) — Порядок битов в кадре.
- SPE (бит 6) — Включение SPI.
- BR (биты 5:3) — Делитель частоты SCK от частоты шины.
- MSTR (бит 2) — Ведущий или ведомый.
- CPOL (бит 1) — Уровень SCK в паузе.
- CPHA (бит 0) — Фронт SCK, по которому захватываются данные.
SPI_CR2 — размер кадра, прерывания и DMA
Смещение 0x04, 32 бит, после сброса 0x0700. В коде: SPI2->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 |
| — | LDMATX | LDMARX | FRXTH | DS | TXEIE | RXNEIE | ERRIE | FRF | NSSP | SSOE | TXDMAEN | RXDMAEN | |||
- LDMATX (бит 14) — Нечётное число байт при передаче через DMA (пакеты по 8 бит).
- LDMARX (бит 13) — Нечётное число байт при приёме через DMA.
- FRXTH (бит 12) — Порог RXNE: 16 бит (половина FIFO) или 8 бит (четверть FIFO).
- DS (биты 11:8) — Размер кадра: 4…16 бит (0011 — 4 бита, 0111 — 8, 1111 — 16).
- TXEIE (бит 7) — Прерывание по флагу TXE.
- RXNEIE (бит 6) — Прерывание по флагу RXNE.
- ERRIE (бит 5) — Прерывание по ошибкам: CRCERR, OVR и MODF, в режиме I2S — UDR и OVR.
- FRF (бит 4) — Формат кадра: Motorola или TI.
- NSSP (бит 3) — Импульс NSS между кадрами (режим ведущего).
- SSOE (бит 2) — Выход NSS у ведущего; с ним работа с другими ведущими невозможна.
- TXDMAEN (бит 1) — Запрос DMA по флагу TXE.
- RXDMAEN (бит 0) — Запрос DMA по флагу RXNE.
SPI_SR — флаги состояния и уровень FIFO
Смещение 0x08, 32 бит, после сброса 0x0002. В коде: SPI2->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 |
| — | FTLVL | FRLVL | FRE | BSY | OVR | MODF | CRCERR | UDR | CHSIDE | TXE | RXNE | ||||
- FTLVL (биты 12:11) — Заполнение FIFO передатчика: пуст, 1/4, 1/2, полон.
- FRLVL (биты 10:9) — Заполнение FIFO приёмника: пуст, 1/4, 1/2, полон.
- FRE (бит 8) — Ошибка формата кадра TI.
- BSY (бит 7) — Занят: идёт обмен или буфер передачи не пуст.
- OVR (бит 6) — Переполнение: принятые данные не прочитаны вовремя.
- MODF (бит 5) — Ошибка режима: у ведущего низкий уровень NSS.
- CRCERR (бит 4) — Ошибка CRC; сбрасывается записью 0.
- UDR (бит 3) — Опустошение в режиме I2S: данные для передачи не записаны вовремя.
- CHSIDE (бит 2) — Канал I2S текущих данных: левый или правый.
- TXE (бит 1) — Буфер передачи пуст.
- RXNE (бит 0) — Буфер приёма не пуст.
SPI_DR — данные
Смещение 0x0C, 32 бит, после сброса 0x0000. В коде: SPI2->DR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| DR | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| DR | |||||||||||||||
- DR (биты 31:0) — Данные: запись — в FIFO передатчика, чтение — из FIFO приёмника.
SPI_CRCPR — полином CRC
Смещение 0x10, 32 бит, после сброса 0x0007. В коде: SPI2->CRCPR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| CRCPOLY | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| CRCPOLY | |||||||||||||||
- CRCPOLY (биты 31:0) — Полином CRC; после сброса 0x0007.
SPI_RXCRCR — cRC принятых данных
Смещение 0x14, 32 бит, после сброса 0x0000. В коде: SPI2->RXCRCR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| RXCRC | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| RXCRC | |||||||||||||||
- RXCRC (биты 31:0) — CRC, вычисленная по принятым данным.
SPI_TXCRCR — cRC переданных данных
Смещение 0x18, 32 бит, после сброса 0x0000. В коде: SPI2->TXCRCR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| TXCRC | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TXCRC | |||||||||||||||
- TXCRC (биты 31:0) — CRC, вычисленная по переданным данным.
SPI_I2SCFGR — настройка I2S
Смещение 0x1C, 32 бит, после сброса 0x0000. В коде: SPI2->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.
- I2SE (бит 10) — Включение I2S.
- I2SCFG (биты 9:8) — Роль и направление I2S.
- PCMSYNC (бит 7) — Синхронизация кадра в стандарте PCM.
- I2SSTD (биты 5:4) — Стандарт протокола I2S.
- CKPOL (бит 3) — Уровень тактового сигнала I2S в паузе.
- DATLEN (биты 2:1) — Длина данных.
- CHLEN (бит 0) — Длина канала; действует только при 16-битных данных.
SPI_I2SPR — делитель частоты I2S
Смещение 0x20, 32 бит, после сброса 0x0002. В коде: SPI2->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.
Частые вопросы
Почему SPI STM32F0 передаёт 16 бит вместо 8?
Запись в DR через 16-битный доступ (SPI1->DR = x) кладёт в FIFO два байта. Пишите байт через 8-битный указатель: *(volatile uint8_t *)&SPI1->DR = x, и установите FRXTH = 1, чтобы RXNE срабатывал на каждый принятый байт.
Как задать кадр 8 бит?
Поле DS регистра SPI_CR2 = 0111. После сброса DS = 0111, то есть 8 бит уже выбрано; 0011 — 4 бита, 1111 — 16 бит.
Источники
- STMicroelectronics. RM0091: Reference manual (Rev 10) — раздел 28.9: описание регистров, назначение полей и значения после сброса
- STMicroelectronics. cmsis-device-f0 v2.3.8: заголовки CMSIS stm32f031x6.h, stm32f038xx.h, stm32f042x6.h, stm32f048xx.h, stm32f051x8.h, stm32f058xx.h, stm32f071xb.h, stm32f072xb.h, stm32f078xx.h, stm32f091xc.h, stm32f098xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры STM32F0
- Все регистры STM32F0Блоки периферии и заголовки CMSIS
- RCC — тактирование и сбросRCC_CR, RCC_CFGR, RCC_CIR, RCC_APB2RSTR, RCC_APB1RSTR, RCC_AHBENR
- GPIO — порты ввода-выводаGPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_IDR, GPIOx_ODR
- SYSCFG — системная конфигурацияSYSCFG_CFGR1, SYSCFG_EXTICR1, SYSCFG_EXTICR2, SYSCFG_EXTICR3, SYSCFG_EXTICR4, SYSCFG_CFGR2
- EXTI — внешние прерыванияEXTI_IMR, EXTI_EMR, EXTI_RTSR, EXTI_FTSR, EXTI_SWIER, EXTI_PR
- USART — последовательные порты USARTUSART_CR1, USART_CR2, USART_CR3, USART_BRR, USART_GTPR, USART_RTOR
- I2C — интерфейс I2CI2C_CR1, I2C_CR2, I2C_OAR1, I2C_OAR2, I2C_TIMINGR, I2C_TIMEOUTR
- TIM — таймерыTIMx_CR1, TIMx_CR2, TIMx_SMCR, TIMx_DIER, TIMx_SR, TIMx_EGR
- DMA — прямой доступ к памятиDMA_ISR, DMA_IFCR, DMA_CSELR, DMA_CCR, DMA_CNDTR, DMA_CPAR
- ADC — аналого-цифровой преобразовательADC_ISR, ADC_IER, ADC_CR, ADC_CFGR1, ADC_CFGR2, ADC_SMPR
- IWDG — независимый сторожевой таймерIWDG_KR, IWDG_PR, IWDG_RLR, IWDG_SR, IWDG_WINR
- WWDG — оконный сторожевой таймерWWDG_CR, WWDG_CFR, WWDG_SR
- CRC — вычислитель CRCCRC_DR, CRC_IDR, CRC_CR, CRC_INIT, CRC_POL
- DBGMCU — блок отладкиDBGMCU_IDCODE, DBGMCU_CR, DBGMCU_APB1_FZ, DBGMCU_APB2_FZ
- PWR — управление питаниемPWR_CR, PWR_CSR
- FLASH — интерфейс флеш-памятиFLASH_ACR, FLASH_KEYR, FLASH_OPTKEYR, FLASH_SR, FLASH_CR, FLASH_AR
- RTC — часы реального времениRTC_TR, RTC_DR, RTC_CR, RTC_ISR, RTC_PRER, RTC_WUTR
- DAC — цифро-аналоговый преобразовательDAC_CR, DAC_SWTRIGR, DAC_DHR12R1, DAC_DHR12L1, DAC_DHR8R1, DAC_DHR12R2
- CAN — контроллер CANCAN_MCR, CAN_MSR, CAN_TSR, CAN_RF0R, CAN_RF1R, CAN_IER