
I2C 速率: 标准模式 —— 100kHz 快速模式 —— 400kHz 快速模式+ —— 1MHz I2C 时钟源: SYSCLK HSI6 z2 h! d( F7 q7 b: v# G 输出为I2CCLK 隶属于APB1 K2 X' J+ V6 N; i5 y$ ] K 6 z4 s" ~* {) h* n f+ [1 f4 O ![]() I2C的波特率 ![]() ' F1 b* W& P6 [4 q8 G ![]() ; i1 f& ], M, p( ]- q" h 上述两张图中可以得到计算波特率公式: tSCL = tSYNC1 + tSYNC2 + {[(SCLH+1) + (SCLL+1)] x (PRESC+1) x tI2CCLK}1 ?, [( i9 V1 \7 U! l! [! @ 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】配置$ @! I# @2 Z# p) n8 w 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】8 G, l/ c- a* r1 \3 w6 s% s/ d 官方手册中提供了查表,非常方便:" j: [) u4 H. A; |" Z: ?8 b% `3 g $ D' l! i- t/ ^+ v1 a ![]() - m V& w. \4 }9 e1 ? I2C的软件复位 当清除PE位(I2C_CR1),会产生I2C的软件复位。8 l2 Z2 T8 c% n4 w3 d 软件复位会重置下述寄存器: I2C_CR2 register: START, STOP, NACK/ g! d% u- u1 l" W I2C_ISR register: BUSY, TXE, TXIS, RXNE, ADDR, NACKF, TCR, TC, STOPF, BERR, ARLO, OVR B! M4 R$ J6 d8 x$ A4 T! j 当处于SMbus状态下,下述寄存器也会被重置: I2C_CR2 register: PECBYTE I2C_ISR register: PECERR, TIMEOUT, ALERT PE复位后,必须在3个APB时钟内保持为低电平,确保软件复位成功。- h4 C$ I# e9 y$ B& r: a _7 u1 d9 c 官方推荐复位操作: PE = 0; (Write PE = 0)+ Y% z8 V% x Z* J T0 E/ _ PE == 0 ?(Check PE = 0) PE = 1; (Write PE = 1) I2C的数据接收) u& L, v1 Z1 `/ D, `. x: ` 5 k& y$ D: B' n9 |4 I; p& N ![]() I2C 接收分为 移位寄存器 和 RXDR寄存器。 u5 |3 E7 ]. g+ X2 U ! r5 Q# }9 j/ n- G SDA输入填充移位寄存器。在第8个SCL脉冲之后(当接收到完整的数据字节时),如果移位寄存器是空的(RXNE=0),移位寄存器被复制到I2C_RXDR寄存器。如果RXNE=1,表示前一个接收到的数据字节还没有被读取,SCL行被拉低,直到I2C_RXDR被读取。拉低延时被插入在第8位和第9位之间(在确认脉冲之前)。 ; c% i$ V- d% B: M+ ~ I2C的数据发送5 B0 c" }* v* ^ ! ?& ]9 Q% w+ v0 ?# J ![]() 6 x9 O% o- W( {$ c% v# Y I2C的发送分为 移位寄存器 和 TXDR寄存器。4 o S% Q( A6 x 移位寄存器中的值是当前正在发送的值,TXDR寄存器相当于移位寄存器的Buffer,TXE(TXE == 1代表TXDR空)只指示这个Buffer(TXDR)的满或者空状态,因此当TXE置位时,I2C模块可能还在发送数据。 ———————————————— 转载:Vice Versa XL 4 N, R2 d2 |* x' [# O 6 v6 Y) {% q2 k& u. o |
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南
ST 微控制器电磁兼容性 (EMC) 设计指南
适用于STM32微控制器的ΣΔ数字接口入门