Регистры SPI STM32F1
Регистры SPI1–SPI3 STM32F1: режим ведущего или ведомого, полярность и фаза SCK, делитель частоты, размер кадра, программный NSS, флаги и ошибки, CRC, DMA, а также регистры I2S у SPI2 и SPI3.
SPI STM32F1 — синхронный интерфейс с выводами SCK, MOSI, MISO и NSS. SPI1 тактируется от шины APB2, SPI2 и SPI3 — от APB1; частота SCK ведущего — fPCLK, делённая на 2…256 (поле BR). У high-density, XL-density и connectivity line SPI2 и SPI3 работают ещё и как I2S — для этого служат регистры I2SCFGR и I2SPR (RM0008, раздел 25.5).
Режим SPI задают CPOL — уровень SCK в паузе — и CPHA — фронт, по которому захватываются данные; CPOL = 0 и CPHA = 0 — самый распространённый режим 0. Если вывод NSS не нужен, ведущему ставят SSM = 1 и SSI = 1: низкий уровень NSS (или SSI) у ведущего означает ошибку режима — флаг MODF, SPI выключается и становится ведомым.
Флаг OVR сбрасывают чтением DR, а затем SR, CRCERR — записью нуля, MODF — обращением к SR и следом записью в CR1. Выключать SPI в полнодуплексном режиме RM0008 велит так: дождаться RXNE = 1 с последними данными, затем TXE = 1, затем BSY = 0 и только потом сбросить SPE (раздел 25.3.8).
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| SPI2 | 0x4000 3800 | STM32F101xB/xE/xG, STM32F102xB, STM32F103xB/xE/xG, STM32F105, STM32F107 |
| SPI3 | 0x4000 3C00 | STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107 |
| 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 | — | SSOE | TXDMAEN | RXDMAEN | ||||||||
- TXEIE (бит 7) — Прерывание по флагу TXE.
- RXNEIE (бит 6) — Прерывание по флагу RXNE.
- ERRIE (бит 5) — Прерывание по ошибкам: CRCERR, OVR и MODF, в режиме I2S — UDR и OVR.
- 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 |
| — | BSY | OVR | MODF | CRCERR | UDR | CHSIDE | TXE | RXNE | |||||||
- 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. В коде: 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 (только у STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107).
- I2SCFG (биты 9:8) — Роль и направление I2S (только у STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107).
I2SCFG Значение 00 Ведомый, передача 01 Ведомый, приём 10 Ведущий, передача 11 Ведущий, приём - PCMSYNC (бит 7) — Синхронизация кадра в стандарте PCM (только у STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107).
PCMSYNC Значение 0 Короткая 1 Длинная - I2SSTD (биты 5:4) — Стандарт протокола I2S (только у STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107).
I2SSTD Значение 00 I2S Philips 01 Выравнивание по старшему биту (left justified) 10 Выравнивание по младшему биту (right justified) 11 PCM - CKPOL (бит 3) — Уровень тактового сигнала I2S в паузе (только у STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107).
CKPOL Значение 0 Низкий уровень 1 Высокий уровень - DATLEN (биты 2:1) — Длина данных (только у STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107).
DATLEN Значение 00 16 бит 01 24 бита 10 32 бита 11 Недопустимо - CHLEN (бит 0) — Длина канала; действует только при 16-битных данных (только у STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107).
CHLEN Значение 0 16 бит 1 32 бита
SPI_I2SPR — делитель частоты I2S
Смещение 0x20, 32 бит, после сброса 0x0002; регистр есть только у STM32F101xE/xG, STM32F103xE/xG, STM32F105, STM32F107. В коде: 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 STM32F103 ведущим в режиме 0?
Включите тактирование SPI1 и порта A в RCC_APB2ENR. PA5 (SCK) и PA7 (MOSI) настройте альтернативными двухтактными выходами, PA6 (MISO) — входом. Затем SPI1->CR1 = SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_BR_1 | SPI_CR1_SPE: ведущий, программный NSS, SCK = 72 МГц / 8 = 9 МГц.
Почему ведущий SPI сам выключается и становится ведомым?
Это ошибка режима MODF: у ведущего на входе NSS оказался низкий уровень (или SSI = 0 при SSM = 1). SPI сбрасывает SPE и MSTR и не даёт их установить, пока флаг не сброшен: обратитесь к SR, затем запишите CR1. Если NSS не подключён, используйте SSM = 1 и SSI = 1.
Как передавать 16-битные слова?
Установите DFF = 1, пока SPI выключен (SPE = 0). Тогда регистр DR принимает и отдаёт 16 бит, а флаги TXE и RXNE относятся к целому слову.
Источники
- STMicroelectronics. RM0008: Reference manual (Rev 21) — раздел 25.5: описание регистров, назначение полей и значения после сброса
- STMicroelectronics. cmsis-device-f1 v4.3.5: заголовки CMSIS stm32f101x6.h, stm32f101xb.h, stm32f101xe.h, stm32f101xg.h, stm32f102x6.h, stm32f102xb.h, stm32f103x6.h, stm32f103xb.h, stm32f103xe.h, stm32f103xg.h, stm32f105xc.h, stm32f107xc.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры STM32F1
- Все регистры STM32F1Блоки периферии и заголовки CMSIS
- RCC — сброс и тактированиеRCC_CR, RCC_CFGR, RCC_CIR, RCC_APB2RSTR, RCC_APB1RSTR, RCC_AHBENR
- GPIO — порты ввода-выводаGPIOx_CRL, GPIOx_CRH, GPIOx_IDR, GPIOx_ODR, GPIOx_BSRR, GPIOx_BRR
- AFIO — переназначение функций и выбор входов EXTIAFIO_EVCR, AFIO_MAPR, AFIO_EXTICR1, AFIO_EXTICR2, AFIO_EXTICR3, AFIO_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_ISR, DMA_IFCR, DMA_CCR, DMA_CNDTR, DMA_CPAR, DMA_CMAR
- 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