
I2C 速率: 标准模式 —— 100kHz. }7 F5 i, Q* u6 [* H7 f) l 快速模式 —— 400kHz 快速模式+ —— 1MHz I2C 时钟源: SYSCLK6 x6 x5 a5 F6 [2 [5 ~3 R4 l' s HSI; Q( M7 ~4 U x 输出为I2CCLK) A8 C' z7 f+ Y& U# T 隶属于APB1$ C2 t5 I4 N# [ l0 s 4 u% U: w4 l1 [ ![]() I2C的波特率0 k( s( F) F/ I# x/ i: @5 b * J8 n$ u8 k; ~9 c% z( | ![]() ![]() 7 U1 h5 E- _ W# v 上述两张图中可以得到计算波特率公式:5 n y: {7 }- e# w/ j' Z tSCL = tSYNC1 + tSYNC2 + {[(SCLH+1) + (SCLL+1)] x (PRESC+1) x tI2CCLK}8 P0 \2 |$ Y" e 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寄存器中配置( E" D: B& m# Z ~5 f y" J tI2CCLK : RCC->CFGR3 |= RCC_CFGR3_I2C1SW; // tI2CCLK =【(0)HSI 8MHz】【(1)SYSCLK】配置 SCLH 在 TIMINGR 寄存器中配置 bit[15:8]4 \4 }7 C- n6 z* D, R4 z4 Y SCLL 在 TIMINGR 寄存器中配置 bit[7:0] PRESC 在 TIMINGR 寄存器中配置 bit[31:28] tI2CCLK 在RCC->CFGR3中配置 RCC_CFGR3_I2C1SW 。 tI2CCLK =【(0)HSI 8MHz(0.125us)】【(1)SYSCLK】3 g1 [! p) G& b {/ ~! q ) E( p# E5 C" p 官方手册中提供了查表,非常方便:: F' |# U! n, T) i/ D2 B0 p 1 c" L4 D1 F0 F8 R6 U( N8 f! W ![]() % X9 v9 e, b6 M I2C的软件复位 当清除PE位(I2C_CR1),会产生I2C的软件复位。8 z8 I* `( `9 X& a. q" B* }) C $ l$ j2 L9 v j* N7 _0 f0 [ 软件复位会重置下述寄存器:9 r: H5 Q1 G( F* e. N' E 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: s* u" V+ `& { ( r |3 r3 F$ ~- M" W/ `9 \0 @ PE复位后,必须在3个APB时钟内保持为低电平,确保软件复位成功。 3 p+ g. s3 L$ M% c 官方推荐复位操作:' E( `/ h+ Y& ]+ ^+ u1 d PE = 0; (Write PE = 0) PE == 0 ?(Check PE = 0) PE = 1; (Write PE = 1) I2C的数据接收 # E0 z$ {' a, U7 Y. U2 J; K- i u3 T ![]() I2C 接收分为 移位寄存器 和 RXDR寄存器。 ; a/ }# T0 Q& ]! t) z5 G( V+ P9 _ SDA输入填充移位寄存器。在第8个SCL脉冲之后(当接收到完整的数据字节时),如果移位寄存器是空的(RXNE=0),移位寄存器被复制到I2C_RXDR寄存器。如果RXNE=1,表示前一个接收到的数据字节还没有被读取,SCL行被拉低,直到I2C_RXDR被读取。拉低延时被插入在第8位和第9位之间(在确认脉冲之前)。 I2C的数据发送& B" z$ W7 Z5 v0 r6 L r0 z2 ~. x2 q: j' h ![]() ' J* F# f1 w6 C) ]/ x I2C的发送分为 移位寄存器 和 TXDR寄存器。 2 |2 Y+ C e+ \! w 移位寄存器中的值是当前正在发送的值,TXDR寄存器相当于移位寄存器的Buffer,TXE(TXE == 1代表TXDR空)只指示这个Buffer(TXDR)的满或者空状态,因此当TXE置位时,I2C模块可能还在发送数据。/ f3 V) ?; ~/ n' B5 s: A+ {- q0 a ———————————————— 转载:Vice Versa XL& K6 P! l! {2 n! f# Y& E5 \ |
【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 指南
ST 微控制器电磁兼容性 (EMC) 设计指南