早上醒来,好好着充分的生活。最近,我只注意了这件事。现在我不撒谎了,我的阅读逐渐不是为了虚荣和算计。过去,我总是依赖明天,敷衍现在,但现在我不会了。只是日复一日,非常珍惜生活。 太宰治 – 小说灯笼
一、概述
IIC-BUS
,是 Inter-Integrated Circuit Bus
缩写,顾名思义,简单方便地连接各种外设芯片,一种双向二线同步串行总线。
二、基本特征
基本特征如下:
- 串行(只有一根数据线,只能一位一位 bit 发送和接收)
- 同步(双方使用共同时钟线:时钟由主机提供,无论是接收还是发送数据)
- 单端(不同于差分信号,数据线使用绝对电平作为 0 或者 1 的区分)
- 双向(半双工,只能同时接收或发送)
- 主从(Master/Slave,主机只能发起通信请求,从机只能响应)
- 总线(Bus,一个通信链路可以连接多个设备)
三、电路连接与配置
一般电路连接如下: 右图显示,设备间连接至少需要三条线:
SDA
(串行数据线),SCL
和 GND
(地)。 需要注意的是,无论是主机还是从机 SDA
和 SCL
引脚需要配置成 漏极开路(OD:Open drain
,存在于MOS
管中)或者 集电极开路(Open Collector
,三极管中存在的形式: 这个特征需要我们在嵌入式系统中使用 IIC
需要考虑两点:
- 在硬件设计中,两条信号线都需要增加上拉电阻
- 在软件设计中,单片机
GPIO
端口应配备漏极开路(OD:Open drain
)模式,效果是:导线会将总线电压降低到地面,不导线是高电阻状态,相当于超大电阻,相当于大分压,不影响信号线的电平)
这种电路设计实际上是为了实现 线与
功能,线与
的意思就是 逻辑与
,这里对应的电路是:所有设备都不会降低,只要有设备降低,总线就会降低。
四、优点
- 只需要两条信号线(节省) PCB 板面积、引脚、成本等都是钱。
- 协议很简单(当然是相对的
USB
、以太网
等协议) - 协议容易实现(硬件电路简单)
- 支持多个设备(硬件)
IIC
功能现在是单片机的标准配置,当然些低端的 8 可能没有单片机,但也可以使用 GPIO 模拟实现) 。 - 总线可同时吊装多个器件 (这就是总线的优势)
- 总线电气兼容性好(常用) 5V、3.3V都支持,看你选择哪个拉电阻)
- 速率较高(
100kbps ~ 400kbps ~3.4Mbps
,其实这个速率只能算一般。 - 距离远(几米,降低速率~十几米,但一般都是比较近的使用场景,为了保证信号的准确性,远距离会选择信号线)
五、I2C 总线的电平逻辑
I2C 电平有效(SPI 也就是说,在传输数据的过程中,在 SCL 在低电平时,数据线 SDA 在 SCL高电平时,SDA 电平保持不变(此时电平为通信数据位)。 当然,也有特殊情况 I2C 当总线开始和结束数据传输时,SDA 在 SCL 对于高时变化,这正好可以区分是传输数据还是开始结束信号。
5.1.开始和结束信号
如图所示,
- 起始位: 当SCL在高电平时,SDA从高电平跳到低电平跳,产生起始位。 起始条件产生后,总线很忙(Busy)状态。起始位可以简记为S。
- 停止位: 当SCL在高电平时,SDA从低电平跳到高电平,产生停止位置。 停止条件发生后,总线处于空虚状态。停止位置可以简记为P。
5.2.通信数据帧
灰色方块表示主机控制 SDA 数据线发送数据,白色方块表示从机控制 SDA 向主机响应或响应数据线。
SA(Slave Address) 对于机器地址,主机不需要地址,但机器必须有一个地址,因为当总线连接到多个设备时,需要区分地址。同时,设备只响应自己地址的通信,总线的机器地址为 7 bits,即只能连接 128 从机设备。(值得说明的是,大多数 I2C 从机设备将这7位固定在几位,具有减少设备引脚数的优点。这取决于手册的说明)
5.3、高阶知识
重复起始(Repeated Start
)
上图中的 Sr
为重复起始 (Repeated Start
) I2C
在通信中,有时需要切换数据收发的方向,如 I2C
设备是个EEPROM
读取存储器时 EEEPROM
,地址(主->从),然后读取数据(从)->主), 此时不需要给出停止位,然后给出开始位,而是直接产生开始位,称为重复开始位,记录为 Sr。这样做的好处是提高了通信效率。
I2C 从设备子地址
我们知道,有一些 I2C
除了设备本身,除了设备本身 I2C
地址SA此外,还有几个单元可以访问,相应的子地址(寄存器), 典型的是 EEPROM
存储器等,子地址可以是 1字节~N字节,主机可以发送数据来控制子地址。让我们讨论两种情况:从设备的寄存器中写入数据和从设备的某些寄存器中读取值。
如下图所示, 主机先从机发送 IIC 地址和标记,然后跟随寄存器的地址,然后发送寄存器的数据,完成指定寄存器的写入操作。
如下图所示, 主机从机发送 IIC 地址和标记,然后发送要读取的寄存器的地址值,然后启动重启读取操作,从设备响应数据,完成从设备的寄存器值读取操作。 (值得注意的是,为什么要一次启动? Sr 重启操作怎么样?因为通信只能有一个方向,读或写,如果你想改变方向,你必须重新开始)
六、参考资料
- 《IIC 协议官方标准》https://www.nxp.com/docs/en/user-guide/UM10204.pdf
- 《IIC通信协议总结:https://blog.csdn.net/zhanghuaichao/article/details/48266309 。