Регистры I2C STM32G4
Регистры I2C1–I2C4 STM32G4: включение и фильтры помех, временные параметры шины, адрес ведомого и число байт передачи, условия START и STOP, собственные адреса, флаги и их сброс, SMBus и пробуждение из Stop.
I2C STM32G4 — тот же блок, что у STM32G0: регистр TIMINGR задаёт скорость (PRESC, SCLL, SCLH, SDADEL, SCLDEL в тактах I2CCLK), CR2 — адрес, направление, число байт NBYTES и START. Источник I2CCLK — PCLK1, SYSCLK или HSI16, выбор в RCC_CCIPR; от HSI16 блок будит микроконтроллер из Stop по своему адресу (RM0440, раздел 39.9).
Флаги сбрасываются записью 1 в ICR. Бит 13 регистра CR1, который заголовок CMSIS называет SWRST, в RM0440 зарезервирован, и страница его не показывает: программный сброс блока — сброс бита PE. I2C4 есть только у категории 3.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| I2C1 | 0x4000 5400 | всех |
| I2C2 | 0x4000 5800 | всех |
| I2C3 | 0x4000 7800 | всех |
| I2C4 | 0x4000 8400 | STM32G471, STM32G473, STM32G474, STM32G483, STM32G484 |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| I2C_CR1 | 0x00 | Включение, фильтры, прерывания и DMA | 0x0000 0000 |
| I2C_CR2 | 0x04 | Адрес ведомого, число байт, START и STOP | 0x0000 0000 |
| I2C_OAR1 | 0x08 | Собственный адрес 1 | 0x0000 0000 |
| I2C_OAR2 | 0x0C | Собственный адрес 2 с маской | 0x0000 0000 |
| I2C_TIMINGR | 0x10 | Временные параметры шины | 0x0000 0000 |
| I2C_TIMEOUTR | 0x14 | Тайм-ауты SMBus | 0x0000 0000 |
| I2C_ISR | 0x18 | Флаги состояния и прерываний | 0x0000 0001 |
| I2C_ICR | 0x1C | Сброс флагов | 0x0000 0000 |
| I2C_PECR | 0x20 | Контрольный байт PEC | 0x0000 0000 |
| I2C_RXDR | 0x24 | Принятый байт | 0x0000 0000 |
| I2C_TXDR | 0x28 | Байт для передачи | 0x0000 0000 |
Конструктор значения
Выберите регистр и значения полей — конструктор покажет 32-битное значение и строку на C с макросами CMSIS. Поля, которые вы не меняете, берутся из значения после сброса.
Значение: 0x00000000
0000 0000 0000 0000 0000 0000 0000 0000
I2C1->CR1 = 0x00000000;I2C_CR1 — включение, фильтры, прерывания и DMA
Смещение 0x00, 32 бит, после сброса 0x0000 0000. В коде: I2C1->CR1.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | PECEN | ALERTEN | SMBDEN | SMBHEN | GCEN | WUPEN | NOSTRETCH | SBC | |||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| RXDMAEN | TXDMAEN | — | ANFOFF | DNF | ERRIE | TCIE | STOPIE | NACKIE | ADDRIE | RXIE | TXIE | PE | |||
- PECEN (бит 23) — Контрольный байт PEC (SMBus).
- ALERTEN (бит 22) — Сигнал SMBALERT.
- SMBDEN (бит 21) — Ответ на адрес устройства SMBus по умолчанию (0b1100001x).
- SMBHEN (бит 20) — Ответ на адрес хоста SMBus (0b0001000x).
- GCEN (бит 19) — Ответ на общий вызов (адрес 0x00).
- WUPEN (бит 18) — Пробуждение из режима Stop при совпадении адреса.
- NOSTRETCH (бит 17) — Запрет растягивания SCL ведомым.
- SBC (бит 16) — Подтверждение каждого байта программой (ведомый, SMBus).
- RXDMAEN (бит 15) — DMA при приёме.
- TXDMAEN (бит 14) — DMA при передаче.
- ANFOFF (бит 12) — Выключение аналогового фильтра помех.
- DNF (биты 11:8) — Цифровой фильтр помех: 0 — выключен, 1…15 — длина в тактах I2CCLK.
- ERRIE (бит 7) — Прерывание по ошибкам: BERR, ARLO, OVR, PECERR, TIMEOUT, ALERT.
- TCIE (бит 6) — Прерывание по окончании передачи (TC, TCR).
- STOPIE (бит 5) — Прерывание по условию STOP.
- NACKIE (бит 4) — Прерывание по приёму NACK.
- ADDRIE (бит 3) — Прерывание по совпадению адреса (ведомый).
- RXIE (бит 2) — Прерывание: принят байт (RXNE).
- TXIE (бит 1) — Прерывание: можно писать следующий байт (TXIS).
- PE (бит 0) — Включение I2C.
I2C_CR2 — адрес ведомого, число байт, START и STOP
Смещение 0x04, 32 бит, после сброса 0x0000 0000. В коде: I2C1->CR2.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | PECBYTE | AUTOEND | RELOAD | NBYTES | |||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| NACK | STOP | START | HEAD10R | ADD10 | RD_WRN | SADD | |||||||||
- PECBYTE (бит 26) — Передать или принять байт PEC.
- AUTOEND (бит 25) — Автоматический STOP после NBYTES байт (ведущий).
- RELOAD (бит 24) — Передача длиннее NBYTES: после них — флаг TCR и новое NBYTES.
- NBYTES (биты 23:16) — Число байт передачи: 0…255.
- NACK (бит 15) — Ответить NACK на следующий байт (ведомый).
- STOP (бит 14) — Сформировать STOP после текущего байта (ведущий).
- START (бит 13) — Сформировать START или повторный START и передать адрес.
- HEAD10R (бит 12) — Чтение с 10-битным адресом: только заголовок после повторного START.
- ADD10 (бит 11) — 10-битный адрес ведомого.
- RD_WRN (бит 10) — Направление: 0 — запись, 1 — чтение.
- SADD (биты 9:0) — Адрес ведомого; 7-битный адрес пишется в биты 7:1.
I2C_OAR1 — собственный адрес 1
Смещение 0x08, 32 бит, после сброса 0x0000 0000. В коде: I2C1->OAR1.
| 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 |
| OA1EN | — | OA1MODE | OA1 | ||||||||||||
- OA1EN (бит 15) — Включение собственного адреса 1.
- OA1MODE (бит 10) — Собственный адрес 1 — 10-битный.
- OA1 (биты 9:0) — Собственный адрес 1; 7-битный — в битах 7:1.
I2C_OAR2 — собственный адрес 2 с маской
Смещение 0x0C, 32 бит, после сброса 0x0000 0000. В коде: I2C1->OAR2.
| 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 |
| OA2EN | — | OA2MSK | OA2 | — | |||||||||||
- OA2EN (бит 15) — Включение собственного адреса 2.
- OA2MSK (биты 10:8) — Маска адреса 2: число младших битов OA2, которые не сравниваются.
OA2MSK Значение Макрос CMSIS 001 Не сравниваются OA2[1], сравниваются OA2[7:2] I2C_OAR2_OA2MASK01 010 Не сравниваются OA2[2:1], сравниваются OA2[7:3] I2C_OAR2_OA2MASK02 011 Не сравниваются OA2[3:1], сравниваются OA2[7:4] I2C_OAR2_OA2MASK03 100 Не сравниваются OA2[4:1], сравниваются OA2[7:5] I2C_OAR2_OA2MASK04 101 Не сравниваются OA2[5:1], сравниваются OA2[7:6] I2C_OAR2_OA2MASK05 110 Не сравниваются OA2[6:1], сравниваются OA2[7:7] I2C_OAR2_OA2MASK06 111 OA2[7:1] не сравниваются: подтверждаются все 7-битные адреса, кроме зарезервированных I2C_OAR2_OA2MASK07 - OA2 (биты 7:1) — Собственный адрес 2 (7 бит).
I2C_TIMINGR — временные параметры шины
Смещение 0x10, 32 бит, после сброса 0x0000 0000. В коде: I2C1->TIMINGR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| PRESC | — | SCLDEL | SDADEL | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SCLH | SCLL | ||||||||||||||
- PRESC (биты 31:28) — Предделитель I2CCLK: tPRESC = (PRESC + 1) / fI2CCLK.
- SCLDEL (биты 23:20) — Время установки данных: (SCLDEL + 1) × tPRESC.
- SDADEL (биты 19:16) — Время удержания данных: SDADEL × tPRESC.
- SCLH (биты 15:8) — Длительность высокого уровня SCL: (SCLH + 1) × tPRESC.
- SCLL (биты 7:0) — Длительность низкого уровня SCL: (SCLL + 1) × tPRESC.
I2C_TIMEOUTR — тайм-ауты SMBus
Смещение 0x14, 32 бит, после сброса 0x0000 0000. В коде: I2C1->TIMEOUTR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| TEXTEN | — | TIMEOUTB | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TIMOUTEN | — | TIDLE | TIMEOUTA | ||||||||||||
- TEXTEN (бит 31) — Тайм-аут суммарного растягивания SCL (tLOW:SEXT, tLOW:MEXT).
- TIMEOUTB (биты 27:16) — Тайм-аут B: суммарное растягивание SCL.
- TIMOUTEN (бит 15) — Тайм-аут шины SMBus.
- TIDLE (бит 12) — Что отслеживает тайм-аут A: низкий уровень SCL (0) или простой шины — SCL и SDA высокие (1).
- TIMEOUTA (биты 11:0) — Тайм-аут A шины SMBus.
I2C_ISR — флаги состояния и прерываний
Смещение 0x18, 32 бит, после сброса 0x0000 0001. В коде: I2C1->ISR.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | ADDCODE | DIR | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| BUSY | — | ALERT | TIMEOUT | PECERR | OVR | ARLO | BERR | TCR | TC | STOPF | NACKF | ADDR | RXNE | TXIS | TXE |
- ADDCODE (биты 23:17) — Принятый адрес (ведомый).
- DIR (бит 16) — Направление передачи у ведомого: 1 — ведущий читает.
- BUSY (бит 15) — Шина занята: между START и STOP.
- ALERT (бит 13) — Сигнал SMBALERT.
- TIMEOUT (бит 12) — Тайм-аут шины.
- PECERR (бит 11) — Ошибка PEC при приёме.
- OVR (бит 10) — Переполнение или недогрузка (ведомый при NOSTRETCH = 1).
- ARLO (бит 9) — Потеря арбитража.
- BERR (бит 8) — Ошибка шины: START или STOP не на месте.
- TCR (бит 7) — Передано NBYTES байт при RELOAD = 1: запишите новое NBYTES.
- TC (бит 6) — Передано NBYTES байт при AUTOEND = 0: пора START или STOP.
- STOPF (бит 5) — Обнаружено условие STOP.
- NACKF (бит 4) — Принят NACK.
- ADDR (бит 3) — Совпадение адреса (ведомый).
- RXNE (бит 2) — В RXDR есть принятый байт.
- TXIS (бит 1) — Нужен следующий байт в TXDR.
- TXE (бит 0) — Регистр TXDR пуст; запись 1 очищает его.
I2C_ICR — сброс флагов
Смещение 0x1C, 32 бит, после сброса 0x0000 0000. В коде: I2C1->ICR.
| 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 |
| — | ALERTCF | TIMOUTCF | PECCF | OVRCF | ARLOCF | BERRCF | — | STOPCF | NACKCF | ADDRCF | — | ||||
- ALERTCF (бит 13) — Сброс флага ALERT записью 1.
- TIMOUTCF (бит 12) — Сброс флага TIMEOUT записью 1.
- PECCF (бит 11) — Сброс флага PECERR записью 1.
- OVRCF (бит 10) — Сброс флага OVR записью 1.
- ARLOCF (бит 9) — Сброс флага ARLO записью 1.
- BERRCF (бит 8) — Сброс флага BERR записью 1.
- STOPCF (бит 5) — Сброс флага STOPF записью 1.
- NACKCF (бит 4) — Сброс флага NACKF записью 1.
- ADDRCF (бит 3) — Сброс флага ADDR записью 1.
I2C_PECR — контрольный байт PEC
Смещение 0x20, 32 бит, после сброса 0x0000 0000. В коде: I2C1->PECR.
| 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 |
| — | PEC | ||||||||||||||
- PEC (биты 7:0) — Вычисленный байт PEC.
I2C_RXDR — принятый байт
Смещение 0x24, 32 бит, после сброса 0x0000 0000. В коде: I2C1->RXDR.
| 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 |
| — | RXDATA | ||||||||||||||
- RXDATA (биты 7:0) — Принятый байт.
I2C_TXDR — байт для передачи
Смещение 0x28, 32 бит, после сброса 0x0000 0000. В коде: I2C1->TXDR.
| 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 |
| — | TXDATA | ||||||||||||||
- TXDATA (биты 7:0) — Байт для передачи.
Частые вопросы
Какое значение TIMINGR для 400 кГц при I2CCLK = HSI16?
0x1032 0309 по таблице 360 RM0440: PRESC = 1, SCLL = 9, SCLH = 3, SDADEL = 2, SCLDEL = 3. Для 100 кГц при 16 МГц — 0x3042 0F13.
Как прочитать регистр датчика по I2C на STM32G4?
CR2: адрес, NBYTES = 1, запись, AUTOEND = 0, START; по TXIS положите номер регистра в TXDR и дождитесь TC. Затем CR2: тот же адрес, RD_WRN = 1, NBYTES — сколько читать, AUTOEND = 1, START; байты забирайте из RXDR по RXNE.
Источники
- STMicroelectronics. RM0440: Reference manual (Rev 9) — раздел 39.9: описание регистров, назначение полей и значения после сброса
- STMicroelectronics. cmsis-device-g4 v1.2.6: заголовки CMSIS stm32g431xx.h, stm32g441xx.h, stm32g471xx.h, stm32g473xx.h, stm32g474xx.h, stm32g483xx.h, stm32g484xx.h, stm32g491xx.h, stm32g4a1xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры STM32G4
- Все регистры STM32G4Блоки периферии и заголовки CMSIS
- RCC — тактирование и сбросRCC_CR, RCC_ICSCR, RCC_CFGR, RCC_PLLCFGR, RCC_CIER, RCC_CIFR
- GPIO — порты ввода-выводаGPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_IDR, GPIOx_ODR
- SYSCFG — системная конфигурацияSYSCFG_MEMRMP, SYSCFG_CFGR1, SYSCFG_EXTICR1, SYSCFG_EXTICR2, SYSCFG_EXTICR3, SYSCFG_EXTICR4
- EXTI — внешние прерыванияEXTI_IMR1, EXTI_EMR1, EXTI_RTSR1, EXTI_FTSR1, EXTI_SWIER1, EXTI_PR1
- USART — последовательные порты USART и LPUARTUSART_CR1, USART_CR2, USART_CR3, USART_BRR, USART_GTPR, USART_RTOR
- SPI — интерфейсы SPI и I2SSPI_CR1, SPI_CR2, SPI_SR, SPI_DR, SPI_CRCPR, SPI_RXCRCR
- 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_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_IDCODE, DBGMCU_CR, DBGMCU_APB1FZR1, DBGMCU_APB1FZR2, DBGMCU_APB2FZR
- PWR — управление питаниемPWR_CR1, PWR_CR2, PWR_CR3, PWR_CR4, PWR_SR1, PWR_SR2
- FLASH — флеш-памятьFLASH_ACR, FLASH_PDKEYR, FLASH_KEYR, FLASH_OPTKEYR, FLASH_SR, FLASH_CR
- RTC — часы реального времени и вмешательствоRTC_TR, RTC_DR, RTC_SSR, RTC_ICSR, RTC_PRER, RTC_WUTR
- ЦАП — цифро-аналоговые преобразователиDAC_CR, DAC_SWTRIGR, DAC_DHR12R1, DAC_DHR12L1, DAC_DHR8R1, DAC_DHR12R2
- CORDIC — сопроцессор тригонометрии CORDICCORDIC_CSR, CORDIC_WDATA, CORDIC_RDATA
- FMAC — фильтровый ускоритель FMACFMAC_X1BUFCFG, FMAC_X2BUFCFG, FMAC_YBUFCFG, FMAC_PARAM, FMAC_CR, FMAC_SR
Калькуляторы и статьи
- I2C_TIMINGR STM32PRESC, SCLL, SCLH, SDADEL и SCLDEL по частоте I2CCLK и фронтам
- I²CSDA и SCL, START/STOP, ACK, адреса, скорости, расчёт подтяжек
- Подтягивающие резисторы I²CДиапазон Rp по напряжению, скорости и ёмкости шины
- STM32G4Cortex-M4 с FPU, до 170 МГц: G431/G441, G471–G484, G491/G4A1 — линейки и распиновки