Регистры SPI STM32L0
Регистры SPI1 и SPI2 STM32L0x1: ведущий и ведомый режимы, полярность и фаза тактового сигнала, делитель скорости, кадр 8 или 16 бит, аппаратный CRC и режим I2S у SPI2.
SPI STM32L0x1 — классический блок без FIFO: длину кадра 8 или 16 бит задаёт бит DFF, флаги TXE и RXNE показывают одно слово в буфере. Скорость — fPCLK / 2…256 (поле BR). У SPI2 есть режим I2S с регистрами SPI_I2SCFGR и SPI_I2SPR, у SPI1 его нет (RM0377, таблица 134 и раздел 26.7).
Перед изменением режима, CPOL, CPHA и BR выключите SPI битом SPE. В ведущем режиме с программным NSS установите SSM и SSI, иначе блок переходит в ведомый режим с флагом MODF.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| SPI2 | 0x4000 3800 | STM32L051, STM32L071, STM32L081 |
| SPI1 | 0x4001 3000 | всех |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| 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
SPI2->CR1 = 0x00000000;SPI_CR1 — режим, скорость и формат кадра SPI
Смещение 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 | 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. В коде: 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 |
| — | 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. В коде: 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 |
| — | 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. В коде: 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) — Данные: запись — в буфер передачи, чтение — из буфера приёма.
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; регистр есть только у STM32L051, STM32L071, STM32L081. В коде: 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.
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; регистр есть только у STM32L051, STM32L071, STM32L081. В коде: 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 STM32L0 сразу сбрасывает MSTR?
Сработала защита от конфликта ведущих: вход NSS оказался низким. При программном управлении NSS установите в SPI_CR1 биты SSM и SSI или настройте вывод NSS на выход битом SSOE регистра SPI_CR2.
Есть ли I2S у STM32L031?
Нет: в STM32L0x1 I2S есть только у SPI2, а SPI2 есть у STM32L051, L071 и L081. У L011, L021, L031 и L041 один SPI1 без I2S.
Источники
- STMicroelectronics. RM0377: Reference manual (Rev 10) — раздел 26.7: описание регистров, назначение полей и значения после сброса
- STMicroelectronics. cmsis-device-l0 v1.9.4: заголовки CMSIS stm32l011xx.h, stm32l021xx.h, stm32l031xx.h, stm32l041xx.h, stm32l051xx.h, stm32l071xx.h, stm32l081xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры STM32L0
- Все регистры STM32L0Блоки периферии и заголовки CMSIS
- RCC — тактирование и сбросRCC_CR, RCC_ICSCR, RCC_CFGR, RCC_CIER, RCC_CIFR, RCC_CICR
- GPIO — порты ввода-выводаGPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_IDR, GPIOx_ODR
- SYSCFG — системная конфигурацияSYSCFG_CFGR1, SYSCFG_CFGR2, SYSCFG_EXTICR1, SYSCFG_EXTICR2, SYSCFG_EXTICR3, SYSCFG_EXTICR4
- EXTI — контроллер внешних прерываний и событийEXTI_IMR, EXTI_EMR, EXTI_RTSR, EXTI_FTSR, EXTI_SWIER, EXTI_PR
- 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 — контроллер прямого доступа к памятиDMA_ISR, DMA_IFCR, DMA_CCR, DMA_CNDTR, DMA_CPAR, DMA_CMAR
- АЦП — аналого-цифровой преобразователь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 — поддержка отладкиDBGMCU_IDCODE, DBG_CR, DBG_APB1_FZ, DBG_APB2_FZ
- PWR — управление питаниемPWR_CR, PWR_CSR
- FLASH — интерфейс флеш-памяти и EEPROMFLASH_ACR, FLASH_PECR, FLASH_PDKEYR, FLASH_PEKEYR, FLASH_PRGKEYR, FLASH_OPTKEYR
- RTC — часы реального времениRTC_TR, RTC_DR, RTC_CR, RTC_ISR, RTC_PRER, RTC_WUTR