协议介绍
-
I2C(Inter-Integrated Circuit)是一种通用的【总线协议】,一种简单的双向两线制总线协议标准;
-
实现I2C需要两根信号线完成信息交换,SCL时钟信号线,SDA数据输入/输出线。它属于【同步通信】,由于输入输出数据均使用一根线,支持【双向数据交换】,因此通信方向为【半双工】;
-
I2C可以支持多主机(multi-master)系统,允许有多个master,并且每个master都可以与所有的slaves通信(master之间不可通过I2C通信,并且每个master只能 【轮流】 使用I2C总线)
-
I2C的数据传输速率位于串口和SPI之间,大部分I2C设备支持100KHz和400KHz模式
-
使用I2C传输数据会有一些额外消耗:每发送8bits数据,就需要额外1bit的元数据(ACK或NACK)
I2C物理层
-
它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。
-
一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA),一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
-
每个连接到总线的设备都有一个【独立的地址】,主机可以利用这个地址进行不同设备之间的访问。
-
总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成【高电平】。
-
多个主机同时使用总线时,为了防止数据冲突,会利用【仲裁】方式决定由哪个设备占用总线。
-
具有三种传输模式:标准模式传输速率为100kbit/s,快速模式为400kbit/s,高速模下可达3.4Mbit/s,但目前大多I2C设备尚不支持高速模式
I2C协议层
协议中主要规定了4种信号:
- 起始信号
- 停止信号
- 数据位
- 应答信号
以主机向从机写数据为例,其基本结构如图所示,依次为:
起始信号——从机地址(7位)——读写信号(1位)——数据位——应答位——……——停止位
-
起始信号(S):当 SCL 线是高电平时,SDA 线从高电平向低电平切换;
-
停止信号(P):当 SCL 是高电平时,SDA 线由低电平向高电平切换。
-
帧地址:I2C总线上的每个设备都有自己的独立地址,主机发起通讯时,通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机。I2C协议规定设备地址可以是7位或10位,实际中7位的地址应用比较广泛。
-
I2C使用SDA信号线来传输数据,使用SCL信号线进行数据同步。
- SDA数据线在SCL的每个时钟周期传输一位数据。传输时,SCL为高电平的时候SDA表示的数据有效,即此时的SDA为高电平时表示数据“1”,为低电平时表示数据“0”。当SCL为低电平时,SDA的数据无效,一般在这个时候SDA进行电平切换,为下一次表示数据做好准备。
-
I2C的数据和地址传输都带响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。
-
作为数据接收端时,当设备(无论主从机)接收到I2C传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送“应答(ACK)”信号,发送方会继续发送下一个数据;
若接收端希望结束数据传输,则向对方发送“非应答(NACK)”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。