目录
🌈你好呀!我是 程序猿
🌌 2024感谢你的陪伴与支持 ~
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!
1.IIC简介
IIC通信协议,也称为I2C(Inter-Integrated Circuit),是一种串行、半双工总线,主要用于近距离、低速的芯片(如传感器、存储器、显示屏等)之间的通信。它由飞利浦(Philips)公司开发,用于简化PCB板上的连接和通信需求。
I2C协议采用两根双向的信号线进行通信:
- 串行数据线(SDA):用于传输数据的双向线路。
- 串行时钟线(SCL):用于同步数据传输的时钟信号线。
这种协议支持多主设备(多个微控制器或主控制器)和多从设备(外部设备)的连接。通过地址分配和数据传输阶段,主控制器可以选择和控制特定的从设备进行通信,从而实现多设备之间的数据交换和控制操作。
I2C协议的优点包括简单、灵活、成本低廉,适合在资源有限的嵌入式系统中使用。
I2C总线物理拓扑图
SDA和SCL都是双向的,所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。
2.IIC通信协议
2.1 IIC的空闲状态
当IIC总线的数据线SDA和时钟线同时处于高电平时,规定为总线的空闲状态。此时各个器件输出级场效应管均处在截止状态,即释放总线,由两条信号线的上拉电阻把电平拉高。
2.2 IIC总线的起始信号与终止信号
IIC 总线在传送数据过程中一共有三种类型的信号,它们分别是:开始信号(S)、结束信号(P)和应答信号(ACK/NACK)。
开始信号:在SCL 串行时钟线为高电平期间,SDA 线由高电平向低电平的变化表示起始信号,只有在起始信号以后,其他命令才有效。
开始信号
结束信号:在SCL 串行时钟线为高电平期间,SDA 线由低电平向高电平的变化表示终止信号,随着终止信号的出现,所有外部操作就结束。
结束信号
起始信号和终止信号都是由主机发送的,起始信号产生之后,总线处于被占用的状态,在终止信号产生之后,总线就处于空闲状态。
2.3 IIC总线上数据传送的应答信号
应答信号:IIC总线进行数据传送时,传送的字节数并没有限制,但是每个字节长必须为8位长。数据传送过程中,先传送最高位(MSB),每一个被传送的字节后面都必须跟随着1位由接收器反馈的应答位(即一帧共有9位长)。
1、应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;
2、应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。
应答--ACK 非应答--NACK
对于反馈有效应答位ACK的要求是:接收器在第9个时钟脉冲之前的低电平期间将数据线SDA拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放数据线SDA,以便主控接收器发送一个停止信号P。
2.4 IIC总线上数据有效性
IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定;只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
即:SDA线上的数据在SCL时钟“高”期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。
应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答。
2.5 IIC总线上数据帧格式
1.字节传输与应答:每一个字节必须保证是8bit长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随1bit的应答位(即每一帧数据一共有9bit)
2.在IIC总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。
2.6 IIC寻址
在I2C(IIC)通信协议中,寻址是确定要发送或接收数据的目标设备的过程。以下是关于I2C寻址的关键点:
地址格式:
- 每个I2C设备都有一个唯一的7位或10位地址。
- 7位地址是最常见的,但有些设备支持10位地址,这取决于设备的制造商和规范要求。
地址类型:
- 写地址(写操作):主设备(通常是微控制器)向从设备发送数据。写地址的最低位为0。
- 读地址(读操作):主设备从从设备接收数据。读地址的最低位为1。
地址传输:
- 在I2C通信的起始阶段,主设备通过SDA线发送目标设备的地址。
- 主设备发送一个字节的数据,包括从设备的地址和读写位(最低位),告诉从设备是发送数据还是接收数据。
- 如果设备支持10位地址,首先发送两个字节的扩展地址,然后再发送读写位。
地址确认:
- 每当主设备发送完设备地址和读写位后,接收设备会发送一个应答信号(ACK)来确认它被正确地寻址和准备好进行数据传输。
- 如果没有设备响应(应答),或者设备拒绝通信,则没有应答(NACK)信号被发送,通信将中止或重新尝试。
多主设备冲突:
- I2C支持多主设备的连接,但是在多主模式下,会出现地址冲突的情况。
- 主设备在发送地址后,会监视SDA线的状态,如果检测到其他主设备也在发送,则会停止发送,并等待总线空闲。
总体来说,I2C的寻址过程是通过在总线上发送设备地址和读写位来确定通信目标,确保设备之间可以安全、有效地进行数据传输。
2.7 IIC主机向从机发送数据
S:主机首先产生START信号
从设备地址:然后紧跟着发送一个从机地址,这个地址共有7位,紧接着的第8位是数据方向位 (R/W),0表示主机发送数据(写),1表示主机接收数据(读)
W:主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,若相同,则认 为自己正在被主机寻址,根据R/T位将自己确定为发送器和接收器
ACK:这时候主机等待从机的应答信号(A)
数据+ACK:当主机收到应答信号时,发送要访问从机的那个地址, 继续等待从机的应答信号
数据+ACK:当主机收到应答信号时,发送N个字节的数据,继续等待从机的N次应答信号,
P:主机产生停止信号,结束传送过程。
2.8 IIC从机向主机发送数据
S:主机首先产生START信号;
从设备地址:然后紧跟着发送一个从机地址,注意此时该地址的第8位为0,表明是向从机写命令;
R:这时候主机等待从机的应答信号(ACK);
ACK:当主机收到应答信号时,发送要访问的地址,继续等待从机的应答信号;
数据+ACK:当主机收到应答信号后,主机要改变通信模式(主机将由发送变为接收,从机将由接收变为发送)所以主机重新发送一个开始start信号,然后紧跟着发送一个从机地址,注意此时该地址的第8位为1,表明将主机设置成接收模式开始读取数据;
数据+NACK这时候主机等待从机的应答信号,当主机收到应答信号时,就可以接收1个字节的数据,当接收完成后,主机发送非应答信号,表示不再接收数据;
P:主机进而产生停止信号,结束传送过程。
期待批评指正,共同进步!