[应用相关] STM32的I2C通讯过程

[复制链接]
705|9
 楼主| 过期的塔头 发表于 2021-11-30 12:43 | 显示全部楼层 |阅读模式
[backcolor=rgba(255, 255, 255, 0.9)]使用I2C外设通讯时,在通讯的不同阶段它会对“状态寄存器(SR1 及SR2)”的不同数据位写入参数,通过读取这些寄存器标志来了解通讯状态。
[backcolor=rgba(255, 255, 255, 0.9)]1.主发送器
[backcolor=rgba(255, 255, 255, 0.9)] 1287290-20180503233124301-264509877.png
[backcolor=rgba(255, 255, 255, 0.9)]                        可使用STM32标准库函数来直接检测这些事件的复合标志,降低编程难度。



 楼主| 过期的塔头 发表于 2021-11-30 19:43 | 显示全部楼层
控制产生起始信号(S),当发生起始信号后,它产生事件“EV5”,并会对 SR1寄存器的“SB”位置1,表示起始信号已经发送;
 楼主| 过期的塔头 发表于 2021-11-30 19:47 | 显示全部楼层
发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”及 “EV8”,这时SR1寄存器的“ADDR”位及“TXE”位被置1,ADDR 为1 表示地址已经发送,TXE为1表示数据寄存器为空;
 楼主| 过期的塔头 发表于 2021-11-30 19:48 | 显示全部楼层
往I2C的“数据寄存器DR”写入要发送的数据,这时TXE位会被重置0,表示数据寄存器非空,I2C外设通过SDA信号线一位位把数据发送出去后,又会产生“EV8”事件,即TXE位被置1,重复这个过程,可以发送多个字节数据;
 楼主| 过期的塔头 发表于 2021-11-30 19:51 | 显示全部楼层
发送数据完成后,控制I2C设备产生一个停止信号(P),这个时候会产生EV2 事件,SR1的TXE位及BTF位都被置1,表示通讯结束
 楼主| 过期的塔头 发表于 2021-11-30 19:54 | 显示全部楼层
2.主接收器
6207661a610c09633d.png
 楼主| 过期的塔头 发表于 2021-11-30 19:54 | 显示全部楼层
• 起始信号(S)是由主机端产生的,控制发生起始信号后,它产生事件 “EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送;
 楼主| 过期的塔头 发表于 2021-11-30 19:55 | 显示全部楼层
发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”这时SR1寄存器的“ADDR”位被置1,表示地址已经发送。
 楼主| 过期的塔头 发表于 2021-11-30 19:56 | 显示全部楼层
从机端接收到地址后,开始向主机端发送数据。当主机接收到这些数据后,会产生“EV7”事件,SR1寄存器的RXNE被置1,表示接收数据寄存器非空,读取该寄存器后,可对数据寄存器清空,以便接收下一次数据。此时可以控制I2C发送应答信号(ACK)或非应答信号(NACK),若应答,则重复以上步骤接收数据,若非应答,则停止传输;
 楼主| 过期的塔头 发表于 2021-11-30 20:05 | 显示全部楼层
   • 发送非应答信号后,产生停止信号(P),结束传输。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

999

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部