i2c总线是由飞利浦在80年代初设计的,以允许位于同一电路板上的组件之间能够轻松通信。其大大简化了电路的设计,早期的电视机中很多地方用到了i2c这种通信方式。飞利浦半导体于2006年迁移到了NXP。i2c名称翻译为“ Inter IC”。有时,该总线称为IIC或I²C总线。
I2C总线的基本的特征
(一)同步、半双工,带数据应答;
(二)两根通信线:SCL(Serial Clock)、SDA(Serial Data);
(三)i2c为总线型结构,主设备依靠从设备地址进行寻址;
(四)设备的SCL和SDA均要配置成开漏输出模式;
(五)SCL和SDA必须添加上拉电阻;
(六)开漏输出和上拉电阻的共同作用实现了“线与”的功能,此设计主要是为了解决多机通信互相干扰的问题;
(七)i2c标准的传输速率可以达到100Kbit/s,快速模式下可以达到400Kbit/s,高速模式下可以到达3.4Mbit/s。
i2c时序结构
(一)起始/停止信号
i2c的起始和停止信号,波形如下:
起始信号:SCL为高电平期间,SDA从高电平到低电平;
停止信号:SCL为高电平期间,SDA从低电平到高电平;
(二)收发数据
发送数据:SCL低电平期间,主机根据要发送的数据,将SDA线置0或置1(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,循环8次,即可发送一个字节。
接收数据:SCL低电平期间,从机根据要发送的数据,将SDA线置0或置1(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,循环8次,即可接收一个字节。
i2c的发送和接收波形是类似的,区别在于SDA上的数据是主机提供还是从机提供。
(三)应答位
无论是主机还是从机,当i2c设备接受一个字节数据后,会在下一个时钟发送1个应答位,发送的数据为0表示应答,数据为1表示非应答。
(四)设备寻址
每一台i2c设备都有一个设备地址,设备地址由7位地址和1个读写位组成,i2c开始通信时,主设备会发起总线寻址,在发起起始信号之后,发送一个字节的设备地址。
R/W位:表示数据传输的方向。当R/W位为0时,表示主机向从机写入数据;当R/W位为1时,表示主机从从机读取数据。
设备地址可以分为可编程和不可编程两种方式。对于一些设备,它们的地址是固定且不可更改的,而对于另一些设备,则可以通过芯片引脚来设定设备的地址。可编程地址的设备可以更方便地连接多个相同类型的设备在同一条i2c总线上,并通过地址来区分不同的设备。
(五)写时序
下图完整的展示了主机向从机写一个字节的时序图,需要注意的包括:
当主设备通过i2c总线向从设备写入数据时,主设备需首先在总线上发送带有从设备地址的起始条件,并且最后一位设置为0(R/W位),该位表示写入。
从设备发送应答位后,主设备将发送它希望写入的寄存器的寄存器地址。从设备将再次确认,让主设备知道它准备好了。
在此之后,主设备将开始将数据发送到从设备的寄存器,直到主设备发送了所需的所有数据(有时这只是一个字节),主设备将以STOP条件终止传输。
(六)读时序
对从设备的读取与写入非常相似:
为了对从设备读取,主设备必须首先向从设备指示它希望从哪个寄存器读取。 这是由主设备以与写入类似的方式开始传输,通过发送R/W位等于0(表示写入)的地址,然后是希望从中读取的寄存器地址。
一旦从设备确认该寄存器地址,主设备将再次发送START条件,然后是从设备地址,R/W位设置为1(表示读取)。
之后主设备读取从设备的数据,一旦主设备收到了预期的字节数,他就会发送一个ACK,向从设备发送停止信号,然后主设备将以STOP条件结束通讯。