Регистры I2C STM32F0
Регистры I2C1 и I2C2 STM32F0: включение и фильтры помех, временные параметры шины, адрес ведомого и число байт передачи, условия START и STOP, собственные адреса, флаги и их сброс, SMBus.
I2C STM32F0 — новый блок, не такой, как у STM32F1 и F4. Скорость и времена шины задаёт один регистр TIMINGR: предделитель PRESC и длительности SCLL, SCLH, SDADEL и SCLDEL в тактах I2CCLK. Значение для нужной скорости считает STM32CubeMX или калькулятор TIMINGR; для I2C1 источник такта выбирается в RCC_CFGR3 — HSI 8 МГц или SYSCLK (RM0091, раздел 26.4.10).
Ведущий пишет в CR2 адрес ведомого SADD, направление RD_WRN, число байт NBYTES и бит START — дальше блок сам передаёт адрес и данные. При AUTOEND = 1 STOP формируется после NBYTES байт, при AUTOEND = 0 появляется флаг TC и можно дать повторный START. Передачи длиннее 255 байт идут частями с битом RELOAD.
Флаги ошибок и событий сбрасываются записью 1 в ICR. Режим Fast-mode Plus (1 МГц, ток 20 мА) включается для выводов в SYSCFG_CFGR1.
| Экземпляр | Базовый адрес | Есть у |
|---|---|---|
| I2C1 | 0x4000 5400 | всех |
| I2C2 | 0x4000 5800 | STM32F051, STM32F058, STM32F071, STM32F072, STM32F078, STM32F091, STM32F098 |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| 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 | SWRST | 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 при передаче.
- SWRST (бит 13) — Программный сброс I2C.
- 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 для 100 кГц при I2CCLK 8 МГц?
0x1042 0F13 по таблице примеров RM0091 (раздел 26.4.10): PRESC = 1, SCLL = 0x13, SCLH = 0x0F, SDADEL = 2, SCLDEL = 4. Для 400 кГц при 8 МГц — 0x0031 0309. I2C2 тактируется от PCLK, и значение для него зависит от частоты шины.
Как прочитать регистр датчика по I2C на STM32F0?
Запишите в CR2 адрес, NBYTES = 1, запись, AUTOEND = 0 и START; по TXIS положите номер регистра в TXDR, дождитесь TC. Затем CR2: тот же адрес, RD_WRN = 1, NBYTES — сколько читать, AUTOEND = 1, START; каждый байт забирайте из RXDR по флагу RXNE.
Источники
- STMicroelectronics. RM0091: Reference manual (Rev 10) — раздел 26.7: описание регистров, назначение полей и значения после сброса
- STMicroelectronics. cmsis-device-f0 v2.3.8: заголовки CMSIS stm32f031x6.h, stm32f038xx.h, stm32f042x6.h, stm32f048xx.h, stm32f051x8.h, stm32f058xx.h, stm32f071xb.h, stm32f072xb.h, stm32f078xx.h, stm32f091xc.h, stm32f098xx.h — структуры периферии, смещения, адреса экземпляров и макросы полей; лицензия Apache-2.0
Нашли ошибку в регистрах?
Другие регистры STM32F0
- Все регистры STM32F0Блоки периферии и заголовки CMSIS
- RCC — тактирование и сбросRCC_CR, RCC_CFGR, RCC_CIR, RCC_APB2RSTR, RCC_APB1RSTR, RCC_AHBENR
- GPIO — порты ввода-выводаGPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_IDR, GPIOx_ODR
- SYSCFG — системная конфигурацияSYSCFG_CFGR1, SYSCFG_EXTICR1, SYSCFG_EXTICR2, SYSCFG_EXTICR3, SYSCFG_EXTICR4, SYSCFG_CFGR2
- EXTI — внешние прерыванияEXTI_IMR, EXTI_EMR, EXTI_RTSR, EXTI_FTSR, EXTI_SWIER, EXTI_PR
- USART — последовательные порты USARTUSART_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
- DMA — прямой доступ к памятиDMA_ISR, DMA_IFCR, DMA_CSELR, DMA_CCR, DMA_CNDTR, DMA_CPAR
- ADC — аналого-цифровой преобразователь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
- DBGMCU — блок отладкиDBGMCU_IDCODE, DBGMCU_CR, DBGMCU_APB1_FZ, DBGMCU_APB2_FZ
- PWR — управление питаниемPWR_CR, PWR_CSR
- FLASH — интерфейс флеш-памятиFLASH_ACR, FLASH_KEYR, FLASH_OPTKEYR, FLASH_SR, FLASH_CR, FLASH_AR
- RTC — часы реального времениRTC_TR, RTC_DR, RTC_CR, RTC_ISR, RTC_PRER, RTC_WUTR
- DAC — цифро-аналоговый преобразовательDAC_CR, DAC_SWTRIGR, DAC_DHR12R1, DAC_DHR12L1, DAC_DHR8R1, DAC_DHR12R2
- CAN — контроллер CANCAN_MCR, CAN_MSR, CAN_TSR, CAN_RF0R, CAN_RF1R, CAN_IER
Калькуляторы и статьи
- I2C_TIMINGR STM32PRESC, SCLL, SCLH, SDADEL и SCLDEL по частоте I2CCLK и фронтам
- I²CSDA и SCL, START/STOP, ACK, адреса, скорости, расчёт подтяжек
- Подтягивающие резисторы I²CДиапазон Rp по напряжению, скорости и ёмкости шины
- STM32F0Cortex-M0, до 48 МГц: F030/F070, F031–F091, F042/F072, F0x8 — линейки и распиновки