Перейти к содержанию

Регистры 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.

ЭкземплярБазовый адресЕсть у
SPI20x4000 3800всех
SPI30x4000 3C00всех
SPI10x4001 3000всех
SPI40x4001 3400всех
SPI50x4001 5000всех
SPI60x5800 1400всех

Регистры блока

РегистрСмещениеНазначениеПосле сброса
SPI_CR10x00Включение, запуск и приостановка передачи0x0000 0000
SPI_CR20x04Число кадров передачи и следующей передачи0x0000 0000
SPI_CFG10x08Делитель скорости, размер кадра, FIFO, CRC и DMA0x0007 0007
SPI_CFG20x0CРежим, полярность и фаза, NSS, протокол и паузы0x0000 0000
SPI_IER0x10Разрешение прерываний0x0000 0000
SPI_SR0x14Флаги состояния и уровни FIFO0x0000 1002
SPI_IFCR0x18Сброс флагов0x0000 0000
SPI_TXDR0x20Данные для передачи0x0000 0000
SPI_RXDR0x30Принятые данные0x0000 0000
SPI_CRCPOLY0x40Полином CRC0x0000 0107
SPI_TXCRC0x44CRC переданных данных0x0000 0000
SPI_RXCRC0x48CRC принятых данных0x0000 0000
SPI_UDRDR0x4CДанные, передаваемые ведомым при недогрузке0x0000 0000
SPI_I2SCFGR0x50Настройка режима I2S0x0000 0000

Конструктор значения

Выберите регистр и значения полей — конструктор покажет 32-битное значение и строку на C с макросами CMSIS. Поля, которые вы не меняете, берутся из значения после сброса.

Значение: 0x00000000

0000 0000 0000 0000 0000 0000 0000 0000

SPI2->CR1 = 0x00000000;

SPI_CR1 — включение, запуск и приостановка передачи

Смещение 0x00, 32 бит, после сброса 0x0000 0000. В коде: SPI2->CR1.

31302928272625242322212019181716
—IOLOCK
1514131211109876543210
TCRCINIRCRCINICRC33_17SSIHDDIRCSUSPCSTARTMASRX—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.

31302928272625242322212019181716
TSER
1514131211109876543210
TSIZE
  • TSER (биты 31:16) — Число кадров следующей передачи (перезагружается в TSIZE).
  • TSIZE (биты 15:0) — Число кадров передачи; 0 — без ограничения.

SPI_CFG1 — делитель скорости, размер кадра, FIFO, CRC и DMA

Смещение 0x08, 32 бит, после сброса 0x0007 0007. В коде: SPI2->CFG1.

31302928272625242322212019181716
—MBR—CRCEN—CRCSIZE
1514131211109876543210
TXDMAENRXDMAEN—UDRDETUDRCFGFTHLVDSIZE
  • 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.

31302928272625242322212019181716
AFCNTRSSOMSSOESSIOP—SSMCPOLCPHALSBFRSTMASTERSPCOMM—
1514131211109876543210
IOSWP—MIDIMSSI
  • 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Значение
    000Motorola
    001TI
  • 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.

31302928272625242322212019181716
—
1514131211109876543210
—TSERFIEMODFIETIFREIECRCEIEOVRIEUDRIETXTFIEEOTIEDXPIETXPIERXPIE
  • 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.

31302928272625242322212019181716
CTSIZE
1514131211109876543210
RXWNERXPLVLTXCSUSPTSERFMODFTIFRECRCEOVRUDRTXTFEOTDXPTXPRXP
  • 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.

31302928272625242322212019181716
—
1514131211109876543210
—SUSPCTSERFCMODFCTIFRECCRCECOVRCUDRCTXTFCEOTC—
  • 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.

31302928272625242322212019181716
TXDR
1514131211109876543210
TXDR
  • TXDR (биты 31:0) — Данные для передачи: запись 8, 16 или 32 бит.

SPI_RXDR — принятые данные

Смещение 0x30, 32 бит, после сброса 0x0000 0000. В коде: SPI2->RXDR.

31302928272625242322212019181716
RXDR
1514131211109876543210
RXDR
  • RXDR (биты 31:0) — Принятые данные: чтение 8, 16 или 32 бит.

SPI_CRCPOLY — полином CRC

Смещение 0x40, 32 бит, после сброса 0x0000 0107. В коде: SPI2->CRCPOLY.

31302928272625242322212019181716
CRCPOLY
1514131211109876543210
CRCPOLY
  • CRCPOLY (биты 31:0) — Полином CRC.

SPI_TXCRC — cRC переданных данных

Смещение 0x44, 32 бит, после сброса 0x0000 0000. В коде: SPI2->TXCRC.

31302928272625242322212019181716
TXCRC
1514131211109876543210
TXCRC
  • TXCRC (биты 31:0) — Запись 1 сбрасывает флаг TXCR.

SPI_RXCRC — cRC принятых данных

Смещение 0x48, 32 бит, после сброса 0x0000 0000. В коде: SPI2->RXCRC.

31302928272625242322212019181716
RXCRC
1514131211109876543210
RXCRC
  • RXCRC (биты 31:0) — Запись 1 сбрасывает флаг RXCR.

SPI_UDRDR — данные, передаваемые ведомым при недогрузке

Смещение 0x4C, 32 бит, после сброса 0x0000 0000. В коде: SPI2->UDRDR.

31302928272625242322212019181716
UDRDR
1514131211109876543210
UDRDR
  • UDRDR (биты 31:0) — Кадр, который ведомый передаёт при недогрузке (UDRCFG = 00).

SPI_I2SCFGR — настройка режима I2S

Смещение 0x50, 32 бит, после сброса 0x0000 0000. В коде: SPI2->I2SCFGR.

31302928272625242322212019181716
—MCKOEODDI2SDIV
1514131211109876543210
—DATFMTWSINVFIXCHCKPOLCHLENDATLENPCMSYNC—I2SSTDI2SCFGI2SMOD
  • 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Значение
    0016 бит
    0124 бита
    1032 бита
  • PCMSYNC (бит 7) — Запись 1 сбрасывает флаг PCMSYN.
  • I2SSTD (биты 5:4) — Стандарт I2S: Philips, по старшему биту, по младшему биту или PCM.
    I2SSTDЗначение
    00I2S Philips
    01По старшему биту (left justified)
    10По младшему биту (right justified)
    11PCM
  • 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 четыре кадра.

Источники

  1. STMicroelectronics. RM0433: Reference manual (Rev 9) — раздел 50.11: описание регистров, назначение полей и значения после сброса
  2. STMicroelectronics. cmsis-device-h7 v1.10.7: заголовки CMSIS stm32h742xx.h, stm32h743xx.h, stm32h750xx.h, stm32h753xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0

Нашли ошибку в регистрах?

Другие регистры STM32H7

Калькуляторы и статьи