I2C(IIC)属于两线式串行总线,用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,
属于一主多从(一个主设备(Master),多个从设备(Slave))的总线结构,总线上的每个设备都有一个特定的设备地址,以区分同一I2C总线上的其他设备。连接到I2C中总线上的设备既可以用作主设备,也可以用作从设备。
物理I2C接口有两根双向线:串行时钟线(SCL)和双向串行数据线(SDA),可用于发送和接收数据,但是通信都是由主设备发起,从设备被动响应,实现数据的传输。SDA负责在设备间传输串行数据,SCL负责产生同步时钟脉冲。
调I2C时序,主要在调数据写入write_I2C和数据读取read_I2C的机制。I2C主要实现数据的传输,使主机和从机的相互响应。它有一种数据传送机制。总结起来为:起始信号,终止信号、应答信号,读字节,写字节,数据读取和数据写入。
I2C基本架构:
SDA和SCL变化情况:
SCL和SDA接上拉电阻,默认高电平,表示总线是空闲状态
:

(1) I2C的起始位
(2)I2C的结束位
I2C总线进行数据传送时,在SCL的每个时钟脉冲期间传输一个数据位,时钟信号SCL为高电平期间,数据线SDA上的数据必须保持稳定,只有在时钟线SCL上的信号为低电平期间,数据线SDA上的高电平或低电平状态才允许变化,因为当SCL是高电平时,数据线SDA的变化被规定为控制命令(START或STOP,也就是前面的起始信号和停止信号)。

从机地址发送完后可能会发送一些指令,依从机而定,然后开始传输数据,由主机或者从机发送,每个数据为8位,数据的字节数没有限制。在开始信号之后,SDA和SCL先都处于低电平,当要传输数据时SDA先为高,之后SCL再跳变为高,才可进行数据的传输:
接收端收到有效数据后向对方响应的信号,发送端每发送一个字节(8位)数据,在第9个时钟周期释放数据线去接收对方的应答。
(1)、接收数据需向发送方发送应答:
(2)、发送数据需等待接收方的应答:
即使用I2C控制器实现,使用芯片上的I2C外设,它有相应的I2C驱动电路,有专用的I2C引脚,调用I2C的控制函数即可,无需用代码去控制SCL、SDA的各种高低电平变化来实现I2C协议,只需要将I2C协议中的可变部分(如:从设备地址、传输数据等等)通过函数传参给控制器,控制器自动按照I2C协议实现传输,但是若出现问题,只能通过示波器看波形找问题。
通过使用任意IO口去模拟实现I2C通信协议,手动写代码去控制IO口的电平变化,模拟I2C协议的时序,实现I2C信号和数据传输。

注意:关于slave address是7位的一个字节,write是0位,read是1位;
示例:
则写地址在其后加一位0,即变成(),为A0
读地址在其后加一位1,即变成(),为A1;
具体为:
当总线空闲时,SDA和SCL都处于高电平状态,
当主机要和某个从机通讯时:
❶发送一个开始条件,
❷发送从机地址和读写控制位,
❸传输数据及数据传输结束时,
❹主机会发送停止条件。
4、应用示例
Define address:根据芯片规格书定义读写地址
设置端口:SDA/SCL/INT
缓存buffer: 主控端的写入和读取资料缓存
(1)读取I2C的应答标志位
(2)主控端送出应答信号
(3)主控端写入一个字节到从机
(4)主控端对从机读取一个字节
(5)主控端数据写入
(6)主控端对从机数据读取
(7)调用数据写入和读取
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/12203.html