I2C(Inter-Integrated Circuit,内置集成电路)最初为飞利浦所开发,为2线接口。这2根线为时钟线和双向数据线,分别被称为SCL(Serial CLock,串行时钟)和SDA(Serial DAta,串行数据)。由于I2C总线仅需要一对总线,因此在电路板上占用的空间更少,带来的问题是带宽较窄。即使I2C支持双向数据交换,由于仅有一根数据线,故通信是半双工的。
由于I2C被大量的微控制器所支持,在当前的市场上可找到大量便宜的I2C设备。
I2C主机:master,一般来说是主控制器,也可以理解为CPU
I2C从机:slave,一般来说是外设
I2C 总线上有3 种类型的信号,分别是:开始信号,结束信号和应答信号。这些信号都是由SDA和SCL上的电平变化来表示的。
开始信号(S):当SCL为高电平时,SDA由高电平向低电平跳变,表示开始传输数据。
结束信号(P):当SCL为高电平时,SDA由低电平向高电平跳变,表示结束传输数据。
相应信号(ACK):从机接收到8位数据后,在第9个时钟周期,拉低SDA电平,表示已经接收到数据。
当总线空闲时,SDA 和SCL 都处于高电平,主机检测到总线空闲就可以向从机发送数据。主机首先发送开始信号S,接着发出8位数据(包括前7位的从机地址和1 为的方向位),然后等待从机发回确认信号ACK.
当第8位为0时,表示向从机传输数据,主机收到确认信号后就可以连续的向从机写入8 位数据;当第8 位为1时,表示向从读取数据,这时主机就可以接收来自从机的一系列数据。最后当总个数据传输过程完成后,由主机发送结束信号P,表示本次的数据传输完成。
说到I2C总线,就不得不提一下它的一个好基友——SMBus。
SMBus (System Management Bus,系统管理总线) 是1995年由Intel提出的。它大部分基于I2C总线规范,和I2C一样,SMBus不需要增加额外的引脚。
当然I2C和SMBus还是有很多差异的,比如以运作频率,I2C此方面相当宽裕,最低频可至0Hz(直流状态,等于时间暂停),高可至100kHz(Standard Mode)、400kHz(Fast Mode)、乃至3.4MHz(High Speed Mode),相对的SMBus就很局限,最慢不慢于10kHz,最快不快于100kHz。很明显的,I2C与SMBus的交集运作频率即是10kHz〜100kHz间。其它还有不少差异,这里不做细论。
I2C设备挂载到I2C总线下,是需要一个确定的地址的。一般来说I2C都使用7位地址,协议也支持10位地址,但大多数的设备仅响应7位地址,因此在总线上最多有127个设备,0号"设备"作为群呼地址。
I2C设备,第一个字节(为slave address)由7位地址和一位R/W读写位组成的,这字节是个器件地址。
首先,你要知道:常用IIC接口通用器件的器件地址是由种类型号,及寻址码组成的,共7位。
如格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
器件类型由:D7-D4 共4位决定的。这是由半导公司生产时就已固定此类型的了,也就是说这4位已是固定的。
用户自定义地址码:D3-D1共3位。这是由用户自己设置的,通常的作法如EEPROM这些器件是由外部IC的3个引脚所组合电平决定的(用常用的名字如A0,A1,A2)。这也就是寻址码。
所以为什么同一IIC总线上同一型号的IC只能最多共挂8片同种类芯片的原因了。
最低一位:就是R/W位。
就I2C的整体结构而言,I2C可以分为核心层、总线层、设备层。
简单来说:
核心层提供统一的接口。
总线层是用来驱动I2C总线的。
设备层这是用来驱动I2C设备的。
一般来说的I2C设备只要关注设备层的内容即可。
在kernel-4.9/include/l