I2C—读写EEPROM学习笔记之STM32的I2C通讯过程

STM32的I2C通讯过程

使用I2C外设通讯时,在通讯的不同阶段它会对“状态寄存器(SR1及SR2)”的不同数据位写入参数,通过读取这些寄存器标志来了解通讯状态。
1.主发送器
I2C—读写EEPROM学习笔记之STM32的I2C通讯过程_第1张图片
SB:start bit 起始位发送成功
ADDR:收到A
TxE:数据寄存器为空
BTF:移位寄存器为空
• 控制产生起始信号(S),当发生起始信号后,它产生事件“EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送;
• 发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”及“EV8”,这时SR1寄存器的“ADDR”位及“TXE”位被置1, ADDR 为1表示地址已经发送, TXE为1表示数据寄存器为空;
• 往I2C的“数据寄存器DR”写入要发送的数据,这时TXE位会被重置0,表示数据寄存器非空, I2C外设通过SDA信号线一位位把数据发送出去后,又会产生“EV8”事件,即TXE位被置1,重复这个过程,可以发送多个字节数据;
• 发送数据完成后,控制I2C设备产生一个停止信号( P ),这个时候会产生EV2事件,SR1的TXE位及BTF位都被置1,表示通讯结束。

2.主接收器
I2C—读写EEPROM学习笔记之STM32的I2C通讯过程_第2张图片
RxNE:数据寄存器非空(接收时)
EV7_1:读取RxNE=1,设置ACK=0,
• 起始信号(S)是由主机端产生的,控制发生起始信号后,它产生事件“EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送;
• 发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”这时SR1寄存器的“ADDR”位被置1,表示地址已经发送。
• 从机端接收到地址后,开始向主机端发送数据。当主机接收到这些数据后,会产生“EV7”事件, SR1寄存器的RXNE被置1,表示接收数据寄存器非空,读取该寄存器后,可对数据寄存器清空,以便接收下一次数据。此时可以控制I2C发送应答信号(ACK)或非应答信号(NACK),若应答,则重复以上步骤接收数据,若非应答,则停止传输;
• 发送非应答信号后,产生停止信号( P ),结束传输。

清除标志位操作过于复杂,可使用STM32标准库函数来直接检测这些事件的复合标志,降低编程难度。

你可能感兴趣的:(单片机)