I2C(Inter-Integrated circuit)协议是电子传输信号中常用的一种协议。
它是一种两线式串行双向总线,用于连接微控制器和外部设备,也因为它所需的引脚数只需要两条(CLK和DATA),硬件实现简单,可扩展性强,所以被广泛应用于系统内多个集成电路IC间的通信。
在硬件连接上,I2C协议的实现有分主设备和从设备,并且在主从上比SPI协议更好的一点是支持多个主设备或多个从设备(SPI仅支持单主多从)。
在总线中,SCL和SDA都会接上拉电阻,通常情况下,3.3V系统上拉电阻取3.3KΩ,5V系统上拉电阻取4.7KΩ。所以当I2C设备空闲时,会输出高阻态,当所有设备都空闲,上拉电阻会把总线拉成高电平。
它的多主机多从机的实现原理主要有两点:
a, 每个连接到总线上的从设备都有一个独立的地址,主设备通过这个独立的地址访问到从设备。
b, 当有多个主设备同时使用同一条总线时,为了 防止数据产生冲突,就会利用仲裁的方式决定让哪个主设备先占用总线(同一时间段只能有一个主设备占用I2C总线)。
I2C工作中的整个流程:
1,Master(主设备)发送起始信号
2,Master发送7bit address地址加1bit Write信号
3,找到符合地址的Slaver(从设备)响应ACK
4,然后就可以正式发送数据了,Master发送8bit数据(数据帧大小为8位)
5,Slaver响应ACK
6,最后Master发送停止信号(若Master仅发送一个字节的数据)
起始信号:SCL处于高电平,SDA从高电平向低电平转换。
停止信号:SCL处于高电平,SDA由低电平向高电平转换(与起始信号相反)。
帧地址:每个从属设备有唯一的7位或10位地址,用于主从设备之间的地址识别。一般地址的位长是7或10位,7位用的更广泛。
读/写位:1bit,一般会伴随着地址帧发送。如果主机是向从机发送数据(写)则为低电平,请求数据(读)则为高电平。
ACK/NACK:响应数据,确保数据有被正常发送且接受到。I2C的数据和地址传输都带有响应(先响应地址,后响应数据)。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。ACK时DATA为低电平,NACK时DATA为高电平。
数据有效:数据的传输有分有效和无效,只有在SCL为高电平时,SDA的数据才有效,此时SDA高电平表示数据“1”,低电平表示数据“0”.当SCL为低电平时,数据无效,此时通常需要对SDA进行电平切换。
I2C具有三种传输模式,对应的速率也会不同。
标志模式:100kbit/s
快速模式:400kbit/s
高速模式:3.4Mbit/s