Регистры SPI STM32G0
Регистры SPI1–SPI3 STM32G0: режим ведущего или ведомого, полярность и фаза SCK, делитель частоты, размер кадра от 4 до 16 бит, FIFO приёма и передачи, программный NSS, CRC, DMA и I2S.
SPI STM32G0 такой же, как у STM32F0: размер кадра 4–16 бит в поле DS регистра CR2, FIFO приёма и передачи по 32 бита, порог RXNE задаёт FRXTH. Для 8-битных кадров пишите в DR 8-битным доступом и ставьте FRXTH = 1 (RM0444, раздел 35.5.9).
Частота SCK ведущего — PCLK / 2…256. SPI1 и SPI2 поддерживают I2S (регистры I2SCFGR и I2SPR); источник такта I2S выбирается в RCC_CCIPR (или RCC_CCIPR2 у STM32G0B1/C1). SPI3 есть только у STM32G0B1/C1.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| SPI2 | 0x4000 3800 | всех |
| SPI3 | 0x4000 3C00 | STM32G0B1, STM32G0C1 |
| 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 |
| — | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| DR | |||||||||||||||
- DR (биты 15: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 |
| — | |||||||||||||||
| 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. В коде: SPI2->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. В коде: SPI2->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. В коде: 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 |
| — | ASTRTEN | I2SMOD | I2SE | I2SCFG | PCMSYNC | — | I2SSTD | CKPOL | DATLEN | CHLEN | |||||
- ASTRTEN (бит 12) — Асинхронный запуск I2S ведомого без ожидания нужного уровня WS.
- 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.
Частые вопросы
Как отправить байт по SPI1 STM32G0?
Дождитесь TXE и запишите байт 8-битным доступом: *(volatile uint8_t *)&SPI1->DR = b. Чтобы принять ответ, дождитесь RXNE (при FRXTH = 1) и прочитайте DR тоже 8-битным доступом.
Источники
- STMicroelectronics. RM0444: Reference manual (Rev 6) — раздел 35.9: описание регистров, назначение полей и значения после сброса
- STMicroelectronics. cmsis-device-g0 v1.4.5: заголовки CMSIS stm32g031xx.h, stm32g041xx.h, stm32g051xx.h, stm32g061xx.h, stm32g071xx.h, stm32g081xx.h, stm32g0b1xx.h, stm32g0c1xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры STM32G0
- Все регистры STM32G0Блоки периферии и заголовки CMSIS
- RCC — тактирование и сбросRCC_CR, RCC_ICSCR, RCC_CFGR, RCC_PLLCFGR, RCC_CRRCR, RCC_CIER
- GPIO — порты ввода-выводаGPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_IDR, GPIOx_ODR
- SYSCFG — системная конфигурацияSYSCFG_CFGR1, SYSCFG_CFGR2
- EXTI — внешние прерыванияEXTI_RTSR1, EXTI_FTSR1, EXTI_SWIER1, EXTI_RPR1, EXTI_FPR1, EXTI_RTSR2
- USART — последовательные порты USART и LPUARTUSART_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
- LPTIM — маломощные таймерыLPTIM_ISR, LPTIM_ICR, LPTIM_IER, LPTIM_CFGR, LPTIM_CR, LPTIM_CMP
- DMA — прямой доступ к памяти и DMAMUXDMA_ISR, DMA_IFCR, DMA_CCR, DMA_CNDTR, DMA_CPAR, DMA_CMAR
- 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
- DBG — блок отладкиDBG_IDCODE, DBG_CR, DBG_APB_FZ1, DBG_APB_FZ2
- PWR — управление питаниемPWR_CR1, PWR_CR2, PWR_CR3, PWR_CR4, PWR_SR1, PWR_SR2
- FLASH — интерфейс флеш-памятиFLASH_ACR, FLASH_KEYR, FLASH_OPTKEYR, FLASH_SR, FLASH_CR, FLASH_ECCR
- RTC — часы реального времени и защита от вмешательстваRTC_TR, RTC_DR, RTC_SSR, RTC_ICSR, RTC_PRER, RTC_WUTR
- DAC — цифро-аналоговый преобразовательDAC_CR, DAC_SWTRIGR, DAC_DHR12R1, DAC_DHR12L1, DAC_DHR8R1, DAC_DHR12R2