【翻译】理解I2C总线

欢迎同时访问我的CSDN博客:https://blog.csdn.net/lczdk

这是对德州仪器的应用文档SLVA704的中文翻译,原文标题为:Understanding the I2C Bus。相比于飞利浦出品的几十页的I2C标准文档,此文档只有8页,但是对于想要了解标准I2C总线并应用的人来说,这个已经够用了。
原文地址:https://www.ti.com/lit/an/slva704/slva704.pdf

概述

I2C总线是一种十分流行并且强大的总线,其多用于一个(或多个)主机与单个或多个从设备通讯的场景。图1表明了多种不同的外设可以共享这种只需要两根线便可以连接到处理器的总线,相对于其他接口来说,这也是I2C总线可以提供的最大优势之一。
这篇应用笔记的目标是帮助用户理解I2C总线是如何工作的。
图1展示了一个典型的用于嵌入式系统中的I2C总线,其上挂载了多种从设备。作为I2C主机的从微控制器控制着IO拓展、不同传感器、EEPROM、多个ADC/多个DAC、等等。所有这些设备只需要通过来自主机的两根引脚来控制。

在这里插入图片描述
引用自文档:https://www.ti.com/lit/an/slva704/slva704.pdf

1 电特性

I2C总线使用开漏输出控制器,在同一线路上带有一个输入缓冲器,这样便可以允许在单根数据线上实现双向数据流传输。

1.1 用于双向通讯的开漏极

开漏输出极允许将总线上的电压拉低(大多数情况下是到地),或释放总线以允许其被上拉电阻拉高。当总线被主机或从机释放,线上的上拉电阻负责将线上电压上拉到电源轨。由于并没有设备可以在总线上输出高电平,这也就意味着总线在通讯中,将不会碰到一个设备输出高,而另一个设备试图输出低所导致的短路问题(电源轨到地)。I2C总线要求处于多主机环境下的单个主机在输出高而读回的实际总线电平为低时(这意味着另一个设备拉低了它)中止通讯,因为另一个设备正在使用总线。采用推挽输出方式的接口就没有这么自由了,这也正是I2C总线的一个优先。

在这里插入图片描述
引用自文档:https://www.ti.com/lit/an/slva704/slva704.pdf

图2展示了位于SDA/SCL线上的主从设备的内部简化结构,其由一个用于读取数据的缓冲器,以及一个用于发送数据的下拉场效应管组成。一个设备只被允许拉低总线(规定为短路到地)或释放总线(对地呈现高阻态)以允许上拉电阻拉升总线电平。当处理I2C设备时,有一个重要的概念需要阐明:没有设备可以保持总线为高。这个特性使得双向通讯得以实现。

1.1.1 开漏极拉低

正如前面章节所述,开漏输出只能将总线拉低,或者释放总线然后依靠上拉电阻拉高总线。图3展示了总线拉低时的电流流向。当逻辑电路想要发送一个低电平时,其会使能下拉场效应管,场效应管会通过短路到地的方式拉低线路。

在这里插入图片描述
引用自文档:https://www.ti.com/lit/an/slva704/slva704.pdf

1.1.2 开漏极释放总线

当从机或主机想要传输一个逻辑电平高,它只能通过使能场效应管的方式释放总线。这将会使得总线处于浮空状态,同时上拉电阻将会将总线电平拉高到供电轨,此电平被当作高电平看待。图4展示了电流如何流过用于拉高总线的上拉电阻。

在这里插入图片描述
引用自文档:https://www.ti.com/lit/an/slva704/slva704.pdf

2 I2C接口

2.1 I2C的常用操作

I2C总线是一种双向接口,其使用被称为主机的控制器与从设备进行通讯。从机不会主动传输任何数据,除非其被主机寻址。每个处于I2C总线上的设备均有独有的设备地址,以用于与位于同一总线上的其他设备做区分。很多从机需要在启动后进行配置以设置设备行为。这通常在主机访问从机的内部寄存器映射时完成,这些寄存器均有独一无二的寄存器地址。单个设备可以具有一个或多个寄存器,这些寄存器可以用来存储或读写数据。
I2C总线的物理接口由串行时钟线(SCL)和串行数据线(SDA)组成。SCL和SDA均需要通过上拉电阻连接到Vcc。上拉电阻的大小由I2C线路上的等效电容大小决定(想要了解更多,可以参考I2C Pull-up Resistor Calculation这份文档,文档号:SLVA689)。数据传送只能在总线空闲时初始化。如果SDA和SCL在一个STOP标志后均处于高电平状态,这时可以认为总线处在空闲状态。
主机访问从机的大体流程如下所示:

  1. 假设一个主机想要向从机发送数据:
    1. 发送方主机发送一个START标志并且寻址接收方从机
    2. 发送方主机发送数据到接收方从机
    3. 发送方主机通过发送STOP标志结束传输
  2. 如果主机想要从从机接收/读取数据:
    1. 接收方主机发送START标志并寻址发送方从机
    2. 接收方主机发送需要读取的寄存器地址到发送方从机
    3. 接收方主机从发送方从机接收数据
    4. 接收方主机通过发送STOP标志结束通讯