1.基本原理:
上图是I2C的总线图和通讯协议图(就是I2C是怎么实现设备之间读写数据的)
下面主要介绍通讯协议的每一步:
1.发出开始信号: 一开始都为高电平为空闲状态。当SCL为高电平时,主机将SDA拉低即为发出开始信号,从机设备检测到开始信号后会开始监听总线,总线进入繁忙状态
2.地址传输
主设备向总线发送一个字节数据:7位设备地址+1位读写数据帧。
每个从机都会将主机发送的地址与自己的地址进行比较,成功匹配地址的从设备通过拉低 SDA 线返回 ACK(应答)信号。至此主从机配对成功。接下来,无论谁是接收方,在接受到数据后必须向发送方返回成功接收的应答信号“ACK",或者接收失败的应答信号”NACK"
而后面数据传输的方向由 “ R/W读写位 ” 决定
0(写) = 主机 → 从机
1 (读)= 从机 → 主机
3.数据传输
根据读写位,主机开始发送/接收数据,接下来就是正常返回应答,还有编写自己的传输协议就行了。最后记得拉高SDA发出停止信号,代表数据传输结束
注:
因为写数据一直是”一个方向“,所以不用重写读写数据帧
但是读数据需要在配对后更改传输方向,所以需要重写读写数据帧
2.软件IIC / 硬件I2C
软件IIC:用两个底层GPIO去模拟SCL和SDA通讯时序,一般模拟的方法是编写“IIC.C"文件和”MOTOR.C"函数,如下图
"IIC.C"包含:通过底层GPIO模拟“信号”的函数
MOTOR.C包含:一般是用"IIC.C"和厂家提供的传感器驱动组成的,里面主要编写了自定义的初始化,和模拟时序函数等。
硬件I2C:一些硬件电路实现的I2C功能,HAL库中已经有调用该硬件电路的函数了,直接可以通过该函数与某个设备进行I2C通讯(即读写该设备的寄存器)