锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【嵌入式基础小知识】简单聊聊 IIC 总线

时间:2022-11-10 20:30:00 2sa1611三极管三极管1282sa1106三极管

早上醒来,好好着充分的生活。最近,我只注意了这件事。现在我不撒谎了,我的阅读逐渐不是为了虚荣和算计。过去,我总是依赖明天,敷衍现在,但现在我不会了。只是日复一日,非常珍惜生活。
太宰治 – 小说灯笼

一、概述

IIC-BUS,是 Inter-Integrated Circuit Bus 缩写,顾名思义,简单方便地连接各种外设芯片,一种双向二线同步串行总线。

二、基本特征

基本特征如下:

  • 串行(只有一根数据线,只能一位一位 bit 发送和接收)
  • 同步(双方使用共同时钟线:时钟由主机提供,无论是接收还是发送数据)
  • 单端(不同于差分信号,数据线使用绝对电平作为 0 或者 1 的区分)
  • 双向(半双工,只能同时接收或发送)
  • 主从(Master/Slave,主机只能发起通信请求,从机只能响应)
  • 总线(Bus,一个通信链路可以连接多个设备)

三、电路连接与配置

一般电路连接如下:
在这里插入图片描述
右图显示,设备间连接至少需要三条线:SDA(串行数据线),SCLGND(地)。
需要注意的是,无论是主机还是从机 SDASCL 引脚需要配置成 漏极开路(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
    更多精彩内容,更多惊喜,请关注微信官方账号嵌入式散修
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章