【stm32】I2C通信协议
概念及原理
-
如果我们想要读写寄存器来控制硬件电路,就至少需要定义两个字节数据
-
一个字节是我们要读写哪个寄存器,也就是指定寄存器的地址
-
另一个字节就是这个地址下存储寄存器的内容
- 写入内容就是控制电路,读出内容就是获取电路状态
-
I2C硬件规定(硬件电路)
一主多从
-
cpu就是我们的单片机,作为总线的主机
-
任何时候都是主机掌控SCL线
-
在空闲状态下,主机可以主动发起对SDA的控制
-
只有在从机发送数据和从机应答的时候,主机才会转交SDA的控制权给从机
-
对于从机在任何时候,都只能被动的获取SCL时钟线,从机不允许控制SCL线
-
对于SDA数据线,只有在主机发送读取从机的命令后,或者从机应答的时候,从机才能短暂的获取SDA的控制权
-
L2C的SCL和SDA的输入输出配置问题
-
为了避免总线没协调好导致电源短路这个问题(从机一个输出高电平一个输出低电平),I2C的设计是,禁止所有设备输出强上拉的高电平
-
采用外置弱上拉电阻加开漏输出的电路结构
-
就是设备的SCL和SDA均要配置成开漏输出模式
-
-
要是想输出,就去拉杆子或放手,操作杆子变化就行
-
要是像输入,就直接放手,观察杆子高低就行
-
因为开漏模式下,开漏模式下,输出高电平就相当于断开引脚
-
所以在输入之前,可以直接输出高电平
-
不需要再切换成输入模式了
-
-
关于SCL和SDA时序问题
-
拽下SCL是因为:
-
一方面是占用这个总线
-
另一方面也是方便我们这些基本单元的拼接
- 就是我们之后会保证,除了起始和终止条件,每个时序单元的SCL都是以低电平开始低电平结束
-
-
主机接收一个字节数据
-
在接收前需要释放SDA,释放SDA就相当于切换成输入模式
-
或者理解成,所有设备包括主机都处于输入模式,当主机需要发送的时候,可以主动拉低SDA,而主机在被动接收的时候,就必须先释放SDA
-
因为总线是线与的特征,任何一个设备拉低,总线就是低电平
-
如果有相同的芯片挂在同一条总线
-
这就用到地址中的可变部分了
-
一般器件的最后几位是可以在电路中改变的
-
比如MPU6050地址的最后一位,就可以由板子上的AD0引脚确定
-
这个引脚接低电平,那他的地址就是1101 000
-
这个引脚接高电平,那他的地址就是1101 001
-