【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 
 
-