【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