IIC (Inter-Integrated Circuit), 通常发音为: I-squared-C,是多主、多从、分组交换、单工的串行总线,通常用于处理器或微控制器与低速外围器件的短距离通信连接。这个通信协议是由(NXP半导体的前生)飞利浦公司发明,并在2006年开始,I2C协议的实施不要许可费,但仍要收取I2C从机分配地址的费用。
来自:wiki
IIC的特性如下:
来自: I2C-BUS.COM
IIC 的发展历史
时间 | 事件 |
---|---|
1982年 | 最初的100KHz I2C系统产生,其作为内部总线系统用于建立带各种飞利浦芯片的控制电路。 |
1992年 | I2C的首个标准版本1.0出现,加入400KHz的(Fast-mode)快速模式;引入10bits的地址,使得系统能够容纳多达1008个节点。 |
1998年 | 版本2.0加入3.4MHz的高速模式(High-speed mode)以及满足系统在电压和电流方面的节能需求。 |
2000年 | 版本2.1基于版本2 引入一个小清理。 |
2007年 | 版本3 加入1 Mhz 快速+模式(Fast-mode plus)。 |
2012年 | 版本4 加入5 MHz的极快模式(Ultra Fast-mode),这种模式的数据线和时钟线使用推挽输出来替代上拉电阻,并加入了辅助分配Id表。此模式只能用于单向总线。 |
2012年 | 版本5 修正了一些错误。 |
2014年 | 版本6 修正了两幅图。 |
来自:wiki
IIC物理层的连接结构十分简单,信号的传输仅需2根线(设备之间隔离)便能实现,分别是通信时钟线(SCL)和数据线(SDA),SCL作为时钟线进行时钟同步,SDA作为数据传输线路,由于只有一条,这决定了IIC通信是单工的。一般无隔离的情况下,由于共地还需引入一条地线。
通常,I2C通信设备之间只通过普通导线进行连接,比特流信号采用TTL/CMOS标准下的高/低电平来表示1/0信号,这一方式使得传输距离很短(本来设计目的就是用于短距离通信),直接连接的传输距离短达40cm,提升通信距离则需使用P82B715一类的中继器或者改用其它通信协议与设备。
IIC是多主的总线协议。总线的时钟信号(SCL)是由主设备提供,因此同一时间一条总线中只能存在一个主设备,先不考虑多主情况下的总线仲裁竞争,只考虑主设备确定的通信规则。
IIC传输数据的模式模式为:
[ 开始 +(7位地址+1位读写+1位ACK)+(8位数据+1位ACK)*n+停止 ]
在传输过程中,每传输8位后,要通过一个ACK位进行相互确认。
SDA_H SCL_H | SDA_H SCL_H | SDA_L SCL_L |
---|
SDA_L SCL_L | SDA_L SCL_H | SDA_H SCL_H |
---|
这是写操作,ACK位均是从从设备向主设备发送的。
主设备每次发送8位数据完毕后,主设备会返回一个ACK值(低电平)以响应已获得数据。
接下来将用IIC获取ADS1115芯片的电压值。
SLAVE地址
由于模块addr pin是悬空的,参考表5应该和Ground同一个地址,为SLAVE ADDRESS:1001000。
Pointer 寄存器
这个寄存器具有指向下一个寄存器的作用,类似索引,通过向该寄存器写入不同的数据,就可指向相应的寄存器,接下来就可以对该寄存器进行操作。
以指向config寄存器操作为例:
对寄存器config进行写操作
Start+地址+写+ACK*+0000 0001+ACK*+Config_H+ACK*+Config_L+NACK*/ACK*+End
对寄存器config进行读操作
Start+地址+写+ACK*+0000 0001+NACK*/ACK*+End
ReStart+地址+读+ACK*+Config_H*+ACK+Config_L*+NACK+End
注:带*表示从设备向主设备发送。
pointer寄存器中只有BIT1、BIT0有效,指向地址见表6如下:
CONFIG 寄存器
Lo_thresh and Hi_thresh 寄存器
上下限,寄存器中的是带符号的补码(负数 取反加1)
默认:
补码:8000 H~7FFF H
原码:(-2^15)~(2^15-1)
CONVERSION寄存器
该寄存器存着转换得到的AD值。
例如:
[1] Semiconductor P. The i2c-bus specification[J]. 2000.
[2] ADS1115 datasheet
[3] wiki