STM32 I2C通讯协议的硬件配置
STM32 I2C通讯协议的硬件配置
功能框图
SMBALERT: SMBus模式下的报警信号,对于普通的I2C通讯,无关紧要。
- 数据移位寄存器和DATA register一起完成数据串行和并行的转换。
- 因为是高位先行,接收时,每一位先放到最低位再移位,发送时,发送每一个最高位后再移位。
- 时钟控制寄存器进行分频等等。
- 硬件电路上在控制寄存器中实现等待应答。
寄存器
1.I2C控制寄存器CR1
START:置1直接产生一个起始信号。STOP同理。
ACK:应答使能。仅仅是配置收到数据后是否产生应答,而不是产生一个应答。
NO STRETCH: 使能时钟延长。拓展时钟的作用。
PE:I2C模块使能。
2.I2C控制寄存器CR2
位[5:0]可以配置I2C模块的时钟频率。
对于STM32F10X,位于APB1上的I2C1和I2C2最快速度就是32MHz。
收发数据的标准模式只有100Kb/s,因此需要下方的CCR配置时钟。
3.I2C时钟控制寄存器CCR
只有在PE=0时才能设置。
默认标准模式的100Kb/s。
T_high是高电平时间,T_low是低电平时间。
Tpclk1就是模块的时钟周期,由CR2设置的,当CR2设置成最高频率时,Tpclk1为 1/36 us,标准模式的时钟周期是10us,占空比为50%情况下,高电平应该是5us,也就是说,CCR配置成180时就完成了当前模块时钟下,标准模式I2C的时钟频率的设置。如果FREQR=08 (模块为8MHz) 则CCR=40即可使高电平为5us。
3.Trise寄存器
设置上升沿最大时间。
根据STM32 F103的电气特性,最大上升时间为1us。
写入TRISE[5:0]的值是最大允许时间除以模块时钟周期再加1。
协议控制
1.起始和停止信号
控制寄存器中的START位并不是置1后就完成了整个有效合理的起始条件,在该位被置位后,要查看状态寄存器 SB 判断起始信号是不是产生了(总线空闲,收到起始信号后交出控制权):
SB:起始位(主模式)。是否成功发送起始条件。SB置1,START自动置0。
对于STOP位,也不是立马发送stop位,实际是一个配置项,延时生效,准备发送stop位。接收模式下,要等接收完成后再发送STOP
2.应答和非应答信号
CR1中的ACK:应答使能。是接收一个字节后返回应答。
3.收发数据
发送数据为例发送和接收使用一个数据寄存器,等发送寄存器为空时,再把当前数据写入数据寄存器。
不用手动判断应答,直接判断BTF就可以检测字节发送是否完成
7位设备地址以及一位方向位是否成功被发送。
对于接收数据,使用RXNE判断接受数据寄存器是否空,以及STOPF位是否检测到停止工作。
作者:咸蛋烧茄子