
I2C 速率: 标准模式 —— 100kHz 快速模式 —— 400kHz 快速模式+ —— 1MHz I2C 时钟源: SYSCLK HSI 输出为I2CCLK 隶属于APB1 ![]() I2C的波特率 ![]() ![]() 上述两张图中可以得到计算波特率公式: tSCL = tSYNC1 + tSYNC2 + {[(SCLH+1) + (SCLL+1)] x (PRESC+1) x tI2CCLK} tSCL 输出波特率周期 tSYNC1 = SCL下降沿 + 滤波 + DNF*tI2CCLK + 2 * tI2CCLK DNF: 在CR1寄存器中配置 tI2CCLK : RCC->CFGR3 |= RCC_CFGR3_I2C1SW; // tI2CCLK =【(0)HSI 8MHz】【(1)SYSCLK】配置 tSYNC2 = SCL上升沿 + 滤波 + DNF*tI2CCLK + 2 * tI2CCLK DNF: 在CR1寄存器中配置 tI2CCLK : RCC->CFGR3 |= RCC_CFGR3_I2C1SW; // tI2CCLK =【(0)HSI 8MHz】【(1)SYSCLK】配置 SCLH 在 TIMINGR 寄存器中配置 bit[15:8] SCLL 在 TIMINGR 寄存器中配置 bit[7:0] PRESC 在 TIMINGR 寄存器中配置 bit[31:28] tI2CCLK 在RCC->CFGR3中配置 RCC_CFGR3_I2C1SW 。 tI2CCLK =【(0)HSI 8MHz(0.125us)】【(1)SYSCLK】 官方手册中提供了查表,非常方便: ![]() I2C的软件复位 当清除PE位(I2C_CR1),会产生I2C的软件复位。 软件复位会重置下述寄存器: I2C_CR2 register: START, STOP, NACK I2C_ISR register: BUSY, TXE, TXIS, RXNE, ADDR, NACKF, TCR, TC, STOPF, BERR, ARLO, OVR 当处于SMbus状态下,下述寄存器也会被重置: I2C_CR2 register: PECBYTE I2C_ISR register: PECERR, TIMEOUT, ALERT PE复位后,必须在3个APB时钟内保持为低电平,确保软件复位成功。 官方推荐复位操作: PE = 0; (Write PE = 0) PE == 0 ?(Check PE = 0) PE = 1; (Write PE = 1) I2C的数据接收 ![]() I2C 接收分为 移位寄存器 和 RXDR寄存器。 SDA输入填充移位寄存器。在第8个SCL脉冲之后(当接收到完整的数据字节时),如果移位寄存器是空的(RXNE=0),移位寄存器被复制到I2C_RXDR寄存器。如果RXNE=1,表示前一个接收到的数据字节还没有被读取,SCL行被拉低,直到I2C_RXDR被读取。拉低延时被插入在第8位和第9位之间(在确认脉冲之前)。 I2C的数据发送 ![]() I2C的发送分为 移位寄存器 和 TXDR寄存器。 移位寄存器中的值是当前正在发送的值,TXDR寄存器相当于移位寄存器的Buffer,TXE(TXE == 1代表TXDR空)只指示这个Buffer(TXDR)的满或者空状态,因此当TXE置位时,I2C模块可能还在发送数据。 ———————————————— 转载:Vice Versa XL |
STM32 GUI LTDC 最大像素时钟评估方法
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南