白费
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模块可能还在发送数据。