
I2C 速率:! ]9 j" g4 P+ T i 标准模式 —— 100kHz 快速模式 —— 400kHz0 O& E* ^0 p& u 快速模式+ —— 1MHz I2C 时钟源: SYSCLK ^# ^# p |& ?' G8 ? HSI3 Z( O/ }# E& n/ C0 f# _ 输出为I2CCLK 隶属于APB1" U$ \7 A2 C1 B, ?$ H4 a ![]() ( {4 \# k# d! y* U2 p' T! h! V: | I2C的波特率 ![]() * u8 i2 y' h: a ![]() 上述两张图中可以得到计算波特率公式:2 C1 R2 `8 P; K. x5 Q# N0 ? tSCL = tSYNC1 + tSYNC2 + {[(SCLH+1) + (SCLL+1)] x (PRESC+1) x tI2CCLK}1 o% j$ y6 g! m/ }; O, ~ - a+ E/ H, J1 U+ R2 m' k( i tSCL 输出波特率周期5 u% l; u, [1 s3 C$ N( n tSYNC1 = SCL下降沿 + 滤波 + DNF*tI2CCLK + 2 * tI2CCLK; t: `) H i( q) g* Z DNF: 在CR1寄存器中配置 tI2CCLK : RCC->CFGR3 |= RCC_CFGR3_I2C1SW; // tI2CCLK =【(0)HSI 8MHz】【(1)SYSCLK】配置5 n4 w" `4 G2 P4 x tSYNC2 = SCL上升沿 + 滤波 + DNF*tI2CCLK + 2 * tI2CCLK% X( o' q6 q$ \" u, k. n, o DNF: 在CR1寄存器中配置 tI2CCLK : RCC->CFGR3 |= RCC_CFGR3_I2C1SW; // tI2CCLK =【(0)HSI 8MHz】【(1)SYSCLK】配置" h: q' k$ A8 f h0 y SCLH 在 TIMINGR 寄存器中配置 bit[15:8]* y- Y0 u. p9 Q SCLL 在 TIMINGR 寄存器中配置 bit[7:0] PRESC 在 TIMINGR 寄存器中配置 bit[31:28]1 u$ ~7 c3 p! H& p0 { t tI2CCLK 在RCC->CFGR3中配置 RCC_CFGR3_I2C1SW 。 tI2CCLK =【(0)HSI 8MHz(0.125us)】【(1)SYSCLK】& q. o2 \0 s2 c/ E 官方手册中提供了查表,非常方便: ![]() I2C的软件复位" d+ r8 Y% j0 {% k' ]/ K. [; ?3 H 当清除PE位(I2C_CR1),会产生I2C的软件复位。8 N/ i. b/ H& [; }0 v 软件复位会重置下述寄存器:1 F- e; e1 Q' F; f: j T 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: PECBYTE4 ]7 h: ]+ q$ p9 Z I2C_ISR register: PECERR, TIMEOUT, ALERT & m) e) v/ G/ o# K5 K! G PE复位后,必须在3个APB时钟内保持为低电平,确保软件复位成功。 ! |0 i+ d% [+ @% w- Q# Y0 f( C 官方推荐复位操作: PE = 0; (Write PE = 0) PE == 0 ?(Check PE = 0) PE = 1; (Write PE = 1), u( t! F5 e% i$ e0 u ( I& G5 ?- Y0 b% r; |6 D% n I2C的数据接收 # x: i$ p- b T U7 I; ]5 I ![]() I2C 接收分为 移位寄存器 和 RXDR寄存器。 / j" Y* i# u3 J/ e- ` h SDA输入填充移位寄存器。在第8个SCL脉冲之后(当接收到完整的数据字节时),如果移位寄存器是空的(RXNE=0),移位寄存器被复制到I2C_RXDR寄存器。如果RXNE=1,表示前一个接收到的数据字节还没有被读取,SCL行被拉低,直到I2C_RXDR被读取。拉低延时被插入在第8位和第9位之间(在确认脉冲之前)。$ t1 } a) l/ h ; w$ M* k g6 H) l0 A- k I2C的数据发送8 I& ]7 h# T# h' y. s7 p, c ![]() ! }/ |! w! H5 w' w/ m1 [ I2C的发送分为 移位寄存器 和 TXDR寄存器。; r) V$ L9 h) ~) O* l" ?1 | $ R: b" B% ?5 o+ O8 p1 d- M$ c 移位寄存器中的值是当前正在发送的值,TXDR寄存器相当于移位寄存器的Buffer,TXE(TXE == 1代表TXDR空)只指示这个Buffer(TXDR)的满或者空状态,因此当TXE置位时,I2C模块可能还在发送数据。 ———————————————— 转载:Vice Versa XL3 B& ]6 y4 m: H: P' t2 ^ ! t& z: j4 t8 K* a* ?* m; X |
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南
ST 微控制器电磁兼容性 (EMC) 设计指南
适用于STM32微控制器的ΣΔ数字接口入门