Регистры SPI STM32H7
Регистры SPI1…SPI6 STM32H742/H743/H750/H753: запуск и приостановка передачи, число кадров, делитель скорости, размер кадра и порог FIFO, CRC до 32 бит, режим и NSS, прерывания, флаги и данные.
SPI STM32H7 — новый блок, не похожий на SPI STM32F4: настройки в CFG1 (делитель MBR, размер кадра DSIZE 4…32 бита, порог FIFO FTHLV, CRC, DMA) и CFG2 (режим, CPOL, CPHA, NSS, протокол), а передачей ведущего управляют SPE и CSTART регистра CR1. Число кадров передачи задаёт TSIZE; после него ставится флаг EOT (RM0433, раздел 50.11).
Флаги SR сбрасываются записью в IFCR; данные пишут в TXDR и читают из RXDR словами 8, 16 или 32 бит. Настройки CFG1 и CFG2 меняют только при SPE = 0. I2S есть у SPI1, SPI2 и SPI3.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| SPI2 | 0x4000 3800 | всех |
| SPI3 | 0x4000 3C00 | всех |
| SPI1 | 0x4001 3000 | всех |
| SPI4 | 0x4001 3400 | всех |
| SPI5 | 0x4001 5000 | всех |
| SPI6 | 0x5800 1400 | всех |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| SPI_CR1 | 0x00 | Включение, запуск и приостановка передачи | 0x0000 0000 |
| SPI_CR2 | 0x04 | Число кадров передачи и следующей передачи | 0x0000 0000 |
| SPI_CFG1 | 0x08 | Делитель скорости, размер кадра, FIFO, CRC и DMA | 0x0007 0007 |
| SPI_CFG2 | 0x0C | Режим, полярность и фаза, NSS, протокол и паузы | 0x0000 0000 |
| SPI_IER | 0x10 | Разрешение прерываний | 0x0000 0000 |
| SPI_SR | 0x14 | Флаги состояния и уровни FIFO | 0x0000 1002 |
| SPI_IFCR | 0x18 | Сброс флагов | 0x0000 0000 |
| SPI_TXDR | 0x20 | Данные для передачи | 0x0000 0000 |
| SPI_RXDR | 0x30 | Принятые данные | 0x0000 0000 |
| SPI_CRCPOLY | 0x40 | Полином CRC | 0x0000 0107 |
| SPI_TXCRC | 0x44 | CRC переданных данных | 0x0000 0000 |
| SPI_RXCRC | 0x48 | CRC принятых данных | 0x0000 0000 |
| SPI_UDRDR | 0x4C | Данные, передаваемые ведомым при недогрузке | 0x0000 0000 |
| SPI_I2SCFGR | 0x50 | Настройка режима I2S | 0x0000 0000 |
Конструктор значения
Выберите регистр и значения полей — конструктор покажет 32-битное значение и строку на C с макросами CMSIS. Поля, которые вы не меняете, берутся из значения после сброса.
Значение: 0x00000000
0000 0000 0000 0000 0000 0000 0000 0000
SPI2->CR1 = 0x00000000;SPI_CR1 — включение, запуск и приостановка передачи
Смещение 0x00, 32 бит, после сброса 0x0000 0000. В коде: SPI2->CR1.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | IOLOCK | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TCRCINI | RCRCINI | CRC33_17 | SSI | HDDIR | CSUSP | CSTART | MASRX | — | SPE | ||||||
- IOLOCK (бит 16) — Блокировка настроек выводов (CFG2) до сброса.
- TCRCINI (бит 15) — Начальное значение CRC передатчика: нули или единицы.
- RCRCINI (бит 14) — Начальное значение CRC приёмника: нули или единицы.
- CRC33_17 (бит 13) — Полный полином CRC в 33 или 17 бит.
- SSI (бит 12) — Внутренний уровень NSS при SSM = 1.
- HDDIR (бит 11) — Направление в полудуплексном режиме: приём (0) или передача (1).
- CSUSP (бит 10) — Запрос приостановки передачи ведущего.
- CSTART (бит 9) — Запуск передачи ведущего.
- MASRX (бит 8) — Автоприостановка ведущего при заполнении FIFO приёма.
- SPE (бит 0) — Включение SPI.
SPI_CR2 — число кадров передачи и следующей передачи
Смещение 0x04, 32 бит, после сброса 0x0000 0000. В коде: SPI2->CR2.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| TSER | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TSIZE | |||||||||||||||
- TSER (биты 31:16) — Число кадров следующей передачи (перезагружается в TSIZE).
- TSIZE (биты 15:0) — Число кадров передачи; 0 — без ограничения.
SPI_CFG1 — делитель скорости, размер кадра, FIFO, CRC и DMA
Смещение 0x08, 32 бит, после сброса 0x0007 0007. В коде: SPI2->CFG1.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | MBR | — | CRCEN | — | CRCSIZE | ||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TXDMAEN | RXDMAEN | — | UDRDET | UDRCFG | FTHLV | DSIZE | |||||||||
- MBR (биты 30:28) — Делитель такта ведущего: SCK = такт SPI / 2…256.
MBR Значение 000 /2 001 /4 010 /8 011 /16 100 /32 101 /64 110 /128 111 /256 - CRCEN (бит 22) — Аппаратный CRC.
- CRCSIZE (биты 20:16) — Длина CRC: 4…32 бита (записывается длина − 1).
- TXDMAEN (бит 15) — Запрос DMA передачи.
- RXDMAEN (бит 14) — Запрос DMA приёма.
- UDRDET (биты 12:11) — Когда ведомый обнаруживает недогрузку передатчика.
UDRDET Значение 00 В начале кадра 01 В конце последнего кадра 10 В начале активного NSS - UDRCFG (биты 10:9) — Что передаёт ведомый при недогрузке.
UDRCFG Значение 00 Константа из SPI_UDRDR 01 Последний принятый кадр 10 Последний переданный кадр - FTHLV (биты 8:5) — Порог FIFO: 1…16 кадров на событие TXP/RXP.
- DSIZE (биты 4:0) — Размер кадра: 4…32 бита (записывается размер − 1).
SPI_CFG2 — режим, полярность и фаза, NSS, протокол и паузы
Смещение 0x0C, 32 бит, после сброса 0x0000 0000. В коде: SPI2->CFG2.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| AFCNTR | SSOM | SSOE | SSIOP | — | SSM | CPOL | CPHA | LSBFRST | MASTER | SP | COMM | — | |||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| IOSWP | — | MIDI | MSSI | ||||||||||||
- AFCNTR (бит 31) — SPI держит выводы и при выключенном блоке.
- SSOM (бит 30) — Импульсы NSS между кадрами (при MIDI > 1).
- SSOE (бит 29) — Выход NSS ведущего.
- SSIOP (бит 28) — Активный уровень NSS: низкий (0) или высокий (1).
- SSM (бит 26) — Программное управление входом NSS (уровень — SSI).
- CPOL (бит 25) — Уровень SCK в паузе.
CPOL Значение 0 Низкий уровень 1 Высокий уровень - CPHA (бит 24) — Фронт SCK, по которому захватываются данные.
CPHA Значение 0 Первый фронт SCK 1 Второй фронт SCK - LSBFRST (бит 23) — Порядок битов: старшим (0) или младшим (1) битом вперёд.
- MASTER (бит 22) — Ведущий (1) или ведомый (0).
- SP (биты 21:19) — Протокол: Motorola (000) или TI (001).
SP Значение 000 Motorola 001 TI - COMM (биты 18:17) — Режим: полный дуплекс, только передача, только приём или полудуплекс.
COMM Значение 00 Полный дуплекс 01 Только передача 10 Только приём 11 Полудуплекс - IOSWP (бит 15) — Обмен выводов MISO и MOSI.
- MIDI (биты 7:4) — Пауза ведущего между кадрами: 0…15 тактов SCK.
- MSSI (биты 3:0) — Пауза ведущего после NSS до первого кадра: 0…15 тактов SCK.
SPI_IER — разрешение прерываний
Смещение 0x10, 32 бит, после сброса 0x0000 0000. В коде: SPI2->IER.
| 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 |
| — | TSERFIE | MODFIE | TIFREIE | CRCEIE | OVRIE | UDRIE | TXTFIE | EOTIE | DXPIE | TXPIE | RXPIE | ||||
- TSERFIE (бит 10) — Прерывание: загружено значение TSER.
- MODFIE (бит 9) — Прерывание по конфликту ведущих (MODF).
- TIFREIE (бит 8) — Прерывание по ошибке кадра TI (TIFRE).
- CRCEIE (бит 7) — Прерывание по ошибке CRC.
- OVRIE (бит 6) — Прерывание по переполнению приёма.
- UDRIE (бит 5) — Прерывание по недогрузке передатчика ведомого.
- TXTFIE (бит 4) — Прерывание: все данные передачи загружены в FIFO.
- EOTIE (бит 3) — Прерывание по окончании передачи.
- DXPIE (бит 2) — Прерывание: есть место для передачи и данные для приёма.
- TXPIE (бит 1) — Прерывание: есть место в FIFO передачи.
- RXPIE (бит 0) — Прерывание: есть данные в FIFO приёма.
SPI_SR — флаги состояния и уровни FIFO
Смещение 0x14, 32 бит, после сброса 0x0000 1002. В коде: SPI2->SR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| CTSIZE | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| RXWNE | RXPLVL | TXC | SUSP | TSERF | MODF | TIFRE | CRCE | OVR | UDR | TXTF | EOT | DXP | TXP | RXP | |
- CTSIZE (биты 31:16) — Число оставшихся кадров передачи (только чтение).
- RXWNE (бит 15) — В FIFO приёма не меньше 32 бит (только чтение).
- RXPLVL (биты 14:13) — Число кадров в FIFO приёма, если их меньше 32 бит (только чтение).
- TXC (бит 12) — Передача закончена, FIFO передачи пуст (только чтение).
- SUSP (бит 11) — Передача приостановлена.
- TSERF (бит 10) — TSER загружен в TSIZE.
- MODF (бит 9) — Конфликт ведущих: NSS стал активным у ведущего.
- TIFRE (бит 8) — Ошибка формата кадра TI.
- CRCE (бит 7) — Ошибка CRC.
- OVR (бит 6) — Переполнение приёма.
- UDR (бит 5) — Недогрузка передатчика ведомого.
- TXTF (бит 4) — Все данные передачи загружены (TSIZE).
- EOT (бит 3) — Передача окончена (после TSIZE кадров).
- DXP (бит 2) — Есть место для передачи и данные для приёма.
- TXP (бит 1) — Есть место в FIFO передачи.
- RXP (бит 0) — Есть данные в FIFO приёма.
SPI_IFCR — сброс флагов
Смещение 0x18, 32 бит, после сброса 0x0000 0000. В коде: SPI2->IFCR.
| 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 |
| — | SUSPC | TSERFC | MODFC | TIFREC | CRCEC | OVRC | UDRC | TXTFC | EOTC | — | |||||
- SUSPC (бит 11) — Запись 1 сбрасывает флаг SUSP.
- TSERFC (бит 10) — Запись 1 сбрасывает флаг TSERF.
- MODFC (бит 9) — Запись 1 сбрасывает флаг MODF.
- TIFREC (бит 8) — Запись 1 сбрасывает флаг TIFRE.
- CRCEC (бит 7) — Запись 1 сбрасывает флаг CRCE.
- OVRC (бит 6) — Запись 1 сбрасывает флаг OVR.
- UDRC (бит 5) — Запись 1 сбрасывает флаг UDR.
- TXTFC (бит 4) — Запись 1 сбрасывает флаг TXTF.
- EOTC (бит 3) — Запись 1 сбрасывает флаг EOT.
SPI_TXDR — данные для передачи
Смещение 0x20, 32 бит, после сброса 0x0000 0000. В коде: SPI2->TXDR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| TXDR | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TXDR | |||||||||||||||
- TXDR (биты 31:0) — Данные для передачи: запись 8, 16 или 32 бит.
SPI_RXDR — принятые данные
Смещение 0x30, 32 бит, после сброса 0x0000 0000. В коде: SPI2->RXDR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| RXDR | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| RXDR | |||||||||||||||
- RXDR (биты 31:0) — Принятые данные: чтение 8, 16 или 32 бит.
SPI_CRCPOLY — полином CRC
Смещение 0x40, 32 бит, после сброса 0x0000 0107. В коде: SPI2->CRCPOLY.
| 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.
SPI_TXCRC — cRC переданных данных
Смещение 0x44, 32 бит, после сброса 0x0000 0000. В коде: SPI2->TXCRC.
| 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) — Запись 1 сбрасывает флаг TXCR.
SPI_RXCRC — cRC принятых данных
Смещение 0x48, 32 бит, после сброса 0x0000 0000. В коде: SPI2->RXCRC.
| 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) — Запись 1 сбрасывает флаг RXCR.
SPI_UDRDR — данные, передаваемые ведомым при недогрузке
Смещение 0x4C, 32 бит, после сброса 0x0000 0000. В коде: SPI2->UDRDR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| UDRDR | |||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| UDRDR | |||||||||||||||
- UDRDR (биты 31:0) — Кадр, который ведомый передаёт при недогрузке (UDRCFG = 00).
SPI_I2SCFGR — настройка режима I2S
Смещение 0x50, 32 бит, после сброса 0x0000 0000. В коде: SPI2->I2SCFGR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | MCKOE | ODD | I2SDIV | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | DATFMT | WSINV | FIXCH | CKPOL | CHLEN | DATLEN | PCMSYNC | — | I2SSTD | I2SCFG | I2SMOD | ||||
- MCKOE (бит 25) — Выход тактового сигнала MCK.
- ODD (бит 24) — Нечётный делитель: 2 × I2SDIV + 1.
- I2SDIV (биты 23:16) — Делитель такта I2S.
- DATFMT (бит 14) — Выравнивание данных в 32-битном регистре: вправо или влево.
- WSINV (бит 13) — Инверсия сигнала WS.
- FIXCH (бит 12) — Фиксированная длина канала.
- CKPOL (бит 11) — Полярность такта I2S.
- CHLEN (бит 10) — Длина канала: 16 или 32 бита.
- DATLEN (биты 9:8) — Длина данных: 16, 24 или 32 бита.
DATLEN Значение 00 16 бит 01 24 бита 10 32 бита - PCMSYNC (бит 7) — Запись 1 сбрасывает флаг PCMSYN.
- I2SSTD (биты 5:4) — Стандарт I2S: Philips, по старшему биту, по младшему биту или PCM.
I2SSTD Значение 00 I2S Philips 01 По старшему биту (left justified) 10 По младшему биту (right justified) 11 PCM - I2SCFG (биты 3:1) — Режим I2S: ведомый или ведущий, передача, приём или дуплекс.
I2SCFG Значение 000 Ведомый, передача 001 Ведомый, приём 010 Ведущий, передача 011 Ведущий, приём 100 Ведомый, дуплекс 101 Ведущий, дуплекс - I2SMOD (бит 0) — Режим блока: SPI (0) или I2S (1).
Частые вопросы
Почему ведущий SPI STM32H7 ничего не передаёт?
Кроме SPE нужен бит CSTART в SPI_CR1 — он запускает передачу. Кроме того, при программном NSS в ведущем режиме установите SSM = 1 и SSI = 1, иначе блок выставит MODF.
Как передать 8-битные кадры через SPI STM32H7?
Задайте DSIZE = 7 (8 бит) в CFG1 и пишите в TXDR байтом: *(volatile uint8_t *)&SPI1->TXDR = data. 32-битная запись положит в FIFO четыре кадра.
Источники
- STMicroelectronics. RM0433: Reference manual (Rev 9) — раздел 50.11: описание регистров, назначение полей и значения после сброса
- STMicroelectronics. cmsis-device-h7 v1.10.7: заголовки CMSIS stm32h742xx.h, stm32h743xx.h, stm32h750xx.h, stm32h753xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры STM32H7
- Все регистры STM32H7Блоки периферии и заголовки CMSIS
- RCC — тактирование и сбросRCC_CR, RCC_HSICFGR, RCC_CRRCR, RCC_CSICFGR, RCC_CFGR, RCC_D1CFGR
- GPIO — порты ввода-выводаGPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_IDR, GPIOx_ODR
- SYSCFG — системная конфигурацияSYSCFG_PMCR, SYSCFG_EXTICR1, SYSCFG_EXTICR2, SYSCFG_EXTICR3, SYSCFG_EXTICR4, SYSCFG_CFGR
- EXTI — контроллер внешних прерываний и событийEXTI_RTSR1, EXTI_FTSR1, EXTI_SWIER1, EXTI_D3PMR1, EXTI_D3PCR1L, EXTI_D3PCR1H
- 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 и мультиплексор запросовDMA_LISR, DMA_HISR, DMA_LIFCR, DMA_HIFCR, DMA_SxCR, DMA_SxNDT
- АЦП — аналого-цифровые преобразователиADC_ISR, ADC_IER, ADC_CR, ADC_CFGR, ADC_CFGR2, ADC_SMPR1
- 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_IDC, DBGMCU_CR, DBGMCU_APB3FZ1, DBGMCU_APB1LFZ1, DBGMCU_APB2FZ1, DBGMCU_APB4FZ1
- PWR — управление питаниемPWR_CR1, PWR_CSR1, PWR_CR2, PWR_CR3, PWR_CPUCR, PWR_D3CR
- RTC — часы реального времениRTC_TR, RTC_DR, RTC_CR, RTC_ISR, RTC_PRER, RTC_WUTR
- ЦАП — цифро-аналоговый преобразовательDAC_CR, DAC_SWTRGR, DAC_DHR12R1, DAC_DHR12L1, DAC_DHR8R1, DAC_DHR12R2