串行总线详解 I2C(IIC)
文章目录
- 前言
- I2C 总线特性
- 一、I2C-Bus 简介
- 二、I2C 底层
- 典型设置
- I2C 硬件工作原理
- 上拉电阻与导线电容
- 上拉电阻与串联电阻
- 串联电阻和调试
- SDA 和 SCL 之间的串扰
- 时钟、拉伸、仲裁
- 设备要求
- 系统中的常见问题
- 系统中的疑难问题
- 三、寻址
- 通用调用地址
- 起始字节
- CBUS 地址
- 不同的总线格式
- 高速(High Speed模式)
- 10 Bit 寻址
- 四、时钟拉伸
- 五、Fast Mode
- 六、Fast Mode Plus
- 七、High Speed Mode
- 八、速度
- 九、电平转换
- I2C 总线协议
- 一、SDA 和 SCL 信号
- 二、SDA 和 SCL 逻辑等级
- 三、数据的有效性
- 四、START 和 STOP 条件
- 五、字节格式
- 六、Acknowledge (ACK) 和 Not Acknowledge (NACK)
- 七、目标地址和读写位
- 参考资料
前言
最初,I2C 总线规范由 Philips Semiconductors 编写。这家公司后来成为 NXP Semiconductors。
在NXP网站上可以查看最近的 I²C 总线规范,NXP 文档 7.0 版,UM10204。
NXP 应用说明 AN10216-01 “I2C 手册” 非常有用。
I2C 总线特性
一、I2C-Bus 简介
I2C 总线由 Philips 在 80 年代初设计,允许位于同一电路板上的组件之间简单通信。
I2C 这个名字翻译为“Inter IC”。有时总线称为 IIC 或 I²C 总线。
最初的通信速度定义为最大 100 kbit/s,许多应用程序不需要更快的传输速度。对于快速传输需求,还有一个 400 kbit/s 的快速模式(fast mode)。自 1998 年以来,还提供高速 3.4 Mbit/s (high speed mode)的选项。最近,还制定了超快速模式(fast mode plus),传输速率在 fast mode 和 high speed mode 之间。除此之外,还有超快速模式 UFM(ultra fast mode UFM),但坦率地说,它不是真正的 I2C 总线。
I2C 不仅用于单板,还用于连接通过电缆连接的组件。简单性和灵活性是使该总线对许多应用具有吸引力的关键特性。具体请查看 NXP 的 I2C 器件概述
最重要的功能包括:
- 只需要两条总线线路
- 没有严格的波特率要求,例如使用 RS232,主机生成总线时钟
- 所有组件之间存在简单的主/从关系,连接到总线的每个设备都可通过唯一地址进行软件寻址
- I2C 是真正的多主总线,提供仲裁和冲突检测
二、I2C 底层
为了正确有效地使用 I2C 总线,了解硬件在电气层面上发生的情况非常重要。本小节主要介绍:
- I2C 总线的硬件设置
- I2C 总线正常运行的要求
- 如何找到问题的原因以及如何解决问题
典型设置
该图显示了两个设备(主设备或从设备)之间 I2C 连接的简化等效电路图,其中包含 I2C 的所有相关因素。
VCC | I2C 电源电压,通常范围为 1.2 V 至 5.5 V |
---|---|
GND | 共地 |
SDA | 串行数据(I2C 数据线) |
SCL | 串行时钟(I2C 时钟线) |
Rp | 上拉电阻(也称为 I2C 端接) |
Rs | 串联电阻 |
Cp | 导线电容 |
Cc | 跨通道电容 |
I2C 硬件工作原理
I2C 总线通过 SDA 和 SCL 传输数据和时钟。首先要意识到:SDA 和 SCL 是漏极开路(在 TTL 中也称为集电极开路),即 I2C 主器件和从器件只能将这些线路驱动为低电平或保持开路。如果没有 I2C 器件将其拉低,则上拉电阻 Rp 会将线路拉至 Vcc。这允许多个 I2C 主机并发操作(如果它们支持多主控)或扩展(从机可以通过控制SCL 来减慢通信速度)等功能。
上拉电阻 Rp 与导线电容 Cp 一起影响 SDA 和 SCL 上信号的时间特性。虽然 I2C 器件使用开漏驱动器或 FET 拉低线路,通常可以驱动至少 10mA 或更高的电流,但上拉电阻 Rp 负责将信号恢复到高电平。Rp 的范围通常为 1 kΩ 至 10 kΩ,导致典型的上拉电流约为 1 mA 或更低。这就是 I2C 信号具有锯齿状外观的原因。事实上,每个“齿”都显示了上升沿线的电荷特性和下降沿的放电特性。
SDA(上图)和 SCL(下图),Rp = 10 kΩ ,Cp = 300 pF。SCL 时钟以 100 kHz (标称) 运行。
上拉电阻与导线电容
Cp 和 Rp 有效地限制了可通过 SDA 和 SCL 传输的最大数据速率。高 Cp 可以用低 Rp 来补偿,反之亦然。
以下三张图片显示了 I2C 传输的相同部分。与第一张图片相比,第二张图片显示了修改后的 Rp 为 2 kΩ 的信号,第三张图片的 Cp 较低,为 150 pF。
注意:长线会显著增加 Cp。I2C 连接应始终尽可能短,并通过合适的接线模式连接(参见 I2C 规范,第 17.3 节)。
SDA(上图)和 SCL(下图),Rp = 10 kΩ 和 Cp = 300 pF。SCL 时钟以 100 kHz (标称) 运行。
传输与上述相同,但这次的上拉电阻降低(Rp = 2 kΩ,Cp = 300 pF)
传输与上述相同,但这次导线电容降低(Rp = 10 kΩ,Cp = 150 pF)
请注意,I2C 标准将 Cp 限制为最大值 400 pF。但是,使用适当的上拉电阻,通常可以(但不建议)以更高的电容操作 I2C 总线。
上拉电阻与串联电阻
通常,如果 I2C 总线仅在一块板上使用,则串行电阻 Rs 非常低或根本不存在。在某些电路中,例如,如果 I2C 总线可通过连接器从外部访问,则需要在 SDA 和 SCL 线路中添加串联电阻,以保护 I2C 器件免受过流影响。
串联电阻 Rs 与上拉电阻 Rp 一起影响 I2C 线路的静态低电平。下图显示了 I2C 总线上主机部分,Rs1= 250 Ω 和 Rs2= 0 Ω,上拉电阻 Rp = 1 kΩ。第一个图是在 I2C 器件 #1处测得的传输 (主机),第二个图是在 I2C 器件 #2处测得的传输(从机)。注意不同的低电平电压;在从机上测得的低电平约为 Rs / (Rs + Rp) * Vcc = ~1/5 * Vcc,而在主机上测得的低电平接近 GND。
SDA(上图)和 SCL(下图)在 I2C 器件 #1(主机)处测量
传输与上述相同,在 I2C 器件 #2 (从机) 上测量
在某些情况下,SCL 和 SDA 的高低电平可能会导致问题,因为某些设备可能无法正确将其识别为有效的低电平。如果由于某种原因无法降低 Rs,则提高上拉电阻 Rp 会有所帮助。下图显示了上拉电阻增加至 Rp = 10 kΩ 的从机 #2处的传输。
传输与上述相同,在 I2C 器件 #2(从机)上测量,Rp 增加
串联电阻和调试
尽管串联电阻有明显的缺点,但在分析 I2C 总线流量以跟踪 I2C 相关问题时,有时可能会很有用。如上所述,串联电阻 Rs 在低电平期间会导致不同的电压电平,具体取决于当前将 SDA 或 SCL 拉低的器件。因此,可以通过分析 I2C 线路上的低电平来识别当前哪个 I2C 器件处于活动状态。下图显示了 I2C 主机和从机之间的完整主接收器传输。由于串联电阻,从机的低电平低于主机的低电平。这适用于 SDA 和 SCL 线路。因此,可以很容易地看到从机在 acknowledge clock cycle期间很短的拉低了 SCL 线(标记为 “!”)。
I2C 主机和 I2C 从机之间的完整主接收器传输,Rs = 200 Ω,在从机上测量。
SDA 和 SCL 之间的串扰
下图显示了典型的 I2C 传输。仔细观察信号会发现信号中的小尖峰。这些是跨通道电容 Cc 产生的后果。一般来说,只要产生的尖峰不是太大,串扰应该不是问题。Cc 本身可以通过使用尽可能短的互连来最小化。增加串联电阻 Rs 和上拉电阻 Rp 有助于降低跨通道电容 Cc 的影响。
SDA 和 SCL 之间的串扰
时钟、拉伸、仲裁
-
时钟生成
SCL 时钟始终由 I2C 主机生成。该规范要求 clock 信号的低相位和高相位的最小周期。因此,实际时钟速率可能低于标称时钟速率,例如,在由于高电容而具有较大上升时间的 I2C 总线中。 -
时钟拉伸
I2C 设备可以通过拉伸 SCL 来减慢通信速度:在 SCL 低电平阶段,总线上的任何 I2C 设备都可能额外控制 SCL 以防止其再次上升,从而使其能够减慢 SCL 时钟速率或暂时停止 I2C 通信。这也称为 clock synchronization。
注意: I2C 规范没有为 clock stretching 指定任何超时条件,即任何器件都可以随心所欲地控制 SCL。 -
仲裁
多个 I2C 主机可以连接到同一 I2C 总线并并发运行。通过持续监控 SDA 和 SCL 的启动和停止条件,他们可以确定总线当前是否处于空闲状态。如果总线繁忙,主设备会延迟等待 I2C 传输,直到停止条件指示总线再次空闲。
但是,可能会发生两个 Master 同时开始传输的情况。在传输过程中,主机持续监控 SDA 和 SCL。如果其中一个检测到 SDA 为低电平,而实际上它应该是高电平,则假定另一个主机处于活动状态并立即停止其传输。此过程称为仲裁。
设备要求
I2C 规范对 I2C 设备提出了多项要求,以确保在不同环境中正常运行。最重要的是:
- SDA 和 SCL 都必须是开漏的,并且不得被连接到 I2C 总线的任何器件驱动为高电平。
- 在大多数 I2C 总线中,SDA 和 SCL 的低输入电压电平阈值和高输入电压电平阈值必须取决于 Vcc。例如,1.1 V 的 SDA 电压电平在 Vcc = 2 V 的 I2C 总线中将被解释为低电平,而在 Vcc = 2.1 V 的 I2C 总线中将被解释为高电平。
- SCL 和 SDA 信号必须由施密特触发器输入采样,即具有一定的滞后。
- SCL 和 SDA 信号中的尖峰必须过滤到一定量(仅适用于全速 I2C)。
- 建立和保持时间;这包括指定的最大 SCL 时钟速率(正常速度为 100 kHz,全速为 400 kHz)。
大多数现成的标准 I2C IC 都满足这些要求,而微控制器中的 I2C 软件实现通常不能满足这些要求。只要环境不需要 I2C 总线上的某个器件不支持的功能,这不一定会成为问题,但在跟踪 I2C 总线相关问题时必须牢记这一点。
系统中的常见问题
通常,I2C 总线系统中的问题原因很简单,可以通过使用简单的设备轻松验证。
- 是否有稳定的电源电压 Vcc?通常,外部 I2C 设备(如 I2C 主机或监视器)必须提供 Vcc。
- SDA、SCL 和 Vcc 之间是否连接了适当的上拉电阻?只要总线处于空闲状态,SDA 和 SCL 上的电压电平就必须为 Vcc,如果与GND 短路,则在 GND 附近下降。[注意:很少有 I2C 主机将 SCL 驱动为高电平和低电平,即 SCL线路不是开漏线。在这种情况下,不需要终端电阻器,并且不能将 SCL拉低。这些主机不能与其他主机一起工作(因为它们没有多主机支持),并且不能与传输过程中拉伸 SCL 的设备一起使用。
- SDA 和 SCL 混淆了吗?例如,当使用电缆或连接器连接 I2C 总线时,可能会意外发生这种情况。
- 是否所有 I2C 器件都支持总线上使用的 I2C 电源电压?
- 是否所有 I2C 器件都支持总线上使用的最大 SCL 时钟速率?
- 如果总线上连接了多个 I2C 主机:是否所有主机都提供多主机支持?
通过将 Vcc、SCL 和 SDA 连接到示波器或适当的 I2C 监控设备,可以进行进一步的诊断:
- 在 I2C 传输期间,SDA 和 SCL 上的高电平和低电平电压是否正确?I2C 标准将低电平阈值定义为 0.3 Vcc,高电平阈值定义为 0.7 Vcc。修改上拉电阻 Rp、串联电阻 Rs 或降低 SCL 时钟速率可能会有所帮助。
- SDA、SCL 甚至 Vcc 上是否存在尖峰或噪声?它们可能是由其他元件的干扰或电容 Cp / Cc 过高引起的。通常可以通过使用较短的互连来减少影响。
系统中的疑难问题
如果在总线上使用不完全符合 I2C 规范的 I2C 设备,则可能会出现其他问题。如果没有合适的设备(如复杂的 I2C 监视器或逻辑分析仪),通常很难找到它们,尤其是在它们不容易重现的情况下。不明显问题的潜在来源包括:
- 一些 I2C 主机(尤其是以软件实现的)不支持多主机,并且不能与某些在传输过程中拉伸 SCL 的器件一起使用。请注意,在软件实现的 I2C 主机中,功能齐全的多主机支持并非易事。
- 非常简单的 I2C 主机实现甚至可能无法识别错误条件,例如从机的负确认。
- 一些 I2C 器件没有使用正确的电压阈值来识别 SDA 和 SCL 上的高电平和低电平,这使得它们特别容易受到串联和上拉电阻错误组合的影响。
- 一些 I2C 器件没有施密特触发器输入或尖峰滤波器,这使得它们特别容易受到串扰和噪声的影响。
- 一些 I2C 器件在 I2C 总线上处于非活动状态一段时间后取消 I2C 传输,之后认为总线空闲。I2C 规范没有指定任何超时条件 – I2C 设备可以在任意时间段内占用总线。
三、寻址
I2C 传输的第一个字节包含从地址和数据方向。
地址长度为 7 位,后跟方向位。与所有数据字节一样,地址首先以最高有效位传输。
一个 7 位宽的地址空间理论上允许 128 个 I2C 地址,但是,有些地址是为特殊目的保留的。因此,7 位宽地址方案只有 112 个地址可用。为了避免这种情况,定义了一种使用 10 位宽地址的特殊方法。
下表显示了为特殊用途保留的 I2C 地址:
10 bit adresses, binary noted, MSB is left | 目的 |
---|---|
0000000 0 | General Call |
0000000 1 | Start Byte |
0000001 X | CBUS Addresses |
0000010 X | Reserved for Different Bus Formats |
0000011 X | Reserved for future purposes |
00001XX X | High-Speed Master Code |
11110XX X | 10-bit Slave Addressing |
11111XX X | Reserved for future purposes |
通用调用地址
常规调用使用 I2C 地址 0 寻址总线上的所有器件。
如果设备不需要提供信息,则它什么都不做。处理消息的设备确认此地址并充当从机。
主机无法检测到有多少设备正在使用该消息。
第二个字节包含一个命令。可能的命令在 I2C 规范第 3.13 章中描述。值 0 (例如)是软件重置。
起始字节
并非每个连接到 I2C 总线的微控制器都集成了 I2C 控制器。这些微控制器必须持续观察 I2C 线路以检测 I2C 传输。这消耗了大量的 CPU 时间,主要通过轮询来完成。为了减少这种 CPU 能力的浪费,可以使用较慢的仲裁方法建立 I2C 传输。
为此,主设备传输 start-condition,后跟 start byte (‘00000001’)、一个假的确认脉冲和一个重复的启动条件。观察微控制器必须检测 SDA 上的七个零中的一个来检测 I2C 传输。这可以通过相对较慢的轮询速率来实现。一旦控制器检测到 SDA 为低电平,它可以切换到更高的轮询速率,以便等待重复的启动条件和随后的 I2C 传输。
传输结束后,它可以切换回 CPU 省电的慢轮询速率,以便检测下一个传输。
CBUS 地址
CBUS 是三线总线,使用与 I2C 不同的传输格式。为了能够将 CBUS 接收器连接到 I2C 总线,此特殊地址已保留 (‘0000001X’)。I2C 器件必须忽略发送到此地址的消息。
CBUS 已不再使用。
不同的总线格式
地址“0000010X”用于将 I2C 器件与同一总线上使用不同协议的器件互连。只有能够使用这些协议运行的 I2C 设备才能回复消息。
高速(High Speed模式)
高速传输的寻址方案与正常的寻址过程不同。
在启动条件之后,传输所谓的主码 ‘00001XXX’,后跟一个强制性的 NACK 位。主代码以快速或标准模式发送(最大为 400bkit/s)。
最低的三个位用于标识同一总线上的不同 I2C 主机——每个主机都有其唯一的标识符。在传输主机代码期间,将进行仲裁,因此只有获胜的主机可以执行以下高速传输。
设计人员可以选择主机代码,并允许在一个系统中连接多达八个高速主机(主机代码“00001000”应保留用于测试和诊断目的)。
在主机代码的确认阶段之后,高速传输以重复的开始条件开始,然后是从地址和后续数据,就像在快速或标准模式下一样,但比特率更高。
高速模式将保持活动状态,直到传输停止条件,此时连接的高速设备将切换回慢速传输速率,如快速或标准模式。
下图显示了高速传输的开始。
10 Bit 寻址
为了防止地址冲突,由于 7 位地址的范围有限,引入了一种新的 10 位地址方案。此增强功能可以与 7 位寻址混合使用,并将可用地址范围增加约 10 倍。在启动条件之后,前导 ‘11110’ 引入了 10 位寻址方案。第一个字节的最后两个地址位与整个 10 位地址的第二个字节的8位连接。只使用 7 位寻址的设备简单地忽略以 ‘11110’ 开头的消息。下图显示了 10 位地址传输的前两个字节。
主机用两个地址字节向从机寻址,如上所述,RW-Bit = ‘0’ 后跟来自主机的数据字节。主接收方传输只能使用组合传输,因为只有当第一个地址字节的 RW 位为 ‘0’ 时,第二个地址字节才能传输。因此,主接收方传输的开始将与主发送方传输的开始相同,然后重复启动条件,并且地址字节的第一个字节RW-Bit= ‘1’(切换到从发送方模式)。请参考以下主接收顺序:
- 启动条件
- 第一个地址字节,RW-Bit = ‘0’,从机发送 ACK
- 第二个地址字节,从机发送 ACK
- 重复启动条件(无停止条件!)
- 再次是第一个地址字节,RW-Bit = ‘1’,从机发送 ACK,从机切换到传输模式
- 从机传输数据字节,主机发送 ACK
- 在最后一个数据字节之后,主机发送一个 NACK
- 停止条件
有关详细信息,请参阅 I2C 规范。
四、时钟拉伸
在 I2C 通信中,主设备决定时钟速度。与 RS232 不同,I2C 总线提供了一个明确的时钟信号,可以使主从完全同步到预定义的波特率。
然而,在某些情况下,I2C 从机无法与主机给出的时钟速度合作,需要放慢一点。这是通过一种称为时钟拉伸的机制完成的。
如果需要降低总线速度,则允许 I2C 从机拉低时钟。另一方面,主机在释放时钟信号到高电平状态后,需要回读时钟信号,并等待,直到线路实际达到高电平。
带宽
时钟拉伸听起来有点奇怪,但这是一种常见的做法。但是,共享总线的总带宽可能会显著减少。因此,特别是对于由多个设备共享的 I2C 总线,评估时钟拉伸的影响非常重要。因此,不要让最慢的 I2C 设备主导您的总线性能。
High Speed Mode 下的时钟拉伸
High-Speed-Mode 中的时钟拉伸只允许在 ACK 位之后(和下一个字节的第 1 位之前)。在位 2-9 之间拉伸是非法的,因为这些比特的边缘被额外的电流源增强。有关更多详细信息,请参见 I2C 规范修订版 Rev. 03 第 5.3.1 章。
五、Fast Mode
I2C 快速模式定义了高达 400 kbit/s 的传输速率,而 1982 年的第一个 I2C 规范限制为 100kbit /s。为了实现 400 kbit/s,对时序要求进行了更严格的定义。
2006 年 1 月,NXP(前身为飞利浦)推出了允许高达 1Mbit/s 的 Fast-mode Plus。
此外,还有高达 3.4 Mbit/s 的high speed mode。
六、Fast Mode Plus
I2C 快速模式最初指定运行在 400 khz。那么,是什么让人们忽略这个 400kb 的限制,用同样的逻辑以更高的速度运行同一总线呢?有几个因素限制了总线的最高速度。首先,电容会引入信号的上升时间。作为一种“对抗措施”,总线上的电流可以通过降低终端上拉的电阻值来增加。
其次,总线有一些时间公差,如果速度增加,这些公差需要更多的限制。飞利浦半导体(现为NXP)于 2006 年 4 月推出的 Fast-mode plus 规范 FM+ 定义了这种最大速度为 1 Mhz 的总线。不像 high speed mode,没有额外的逻辑来实现。因此, fast-mode plus 设备向下兼容标准设备和快速模式设备。事实上,市场上的许多 I2C 从设备,如 RAM 和 EEPROM,已经能够承受更高的总线频率。
FM+ 的规范现在是当前 I2C 总线规范和用户手册的一部分(文件 UM10204 来自 NXP),可从 NXP 获得。
NXP 提供 I2C Fast-mode Plus 设备概述。
七、High Speed Mode
在某些应用中,I2C 传输速度是一个限制因素。为了实现更高的传输速率,同时保持一定的兼容性,飞利浦推出了 HS I2C 标准。以下是一些细节和特殊性:
电气特性
- I2C 总线的高速版本允许高达每秒 3.4 Mbit 的通信。
- 主设备和从设备都必须启用高速才能从这种增加中受益。
- 高速 IC 器件向下兼容,允许混合总线系统。
- 为了缩短信号上升时间,HS 模式主器件在 SCL 输出上结合了开漏下拉电路和电流源上拉电路。
- HS IC 主控器实际上可以将电流提供给总线,这称为升压。
- 此电流源仅在 HS 操作期间启用 (!),并且仅对一个主控器启用。
- HS 模式主器件产生一个串行时钟信号,其 HIGH 与 LOW 的比率为 1 比 2。
- HS 模式主设备可以具有内置桥接器,用于在 HS 传输期间将低速设备与总线分离。这种网桥的主要目的是减少总线上的电容负载,避免低速设备引起的冲突。
传输格式
高速传输以全速模式启动,即最大 400 kbit。
- 发送启动条件
- 8 位 ‘master code’ 以最大 400 kbit 的速度发送
- Master code is ‘not acknowledged’
- 有源主机切换到高速通信
- ‘master code’ 是一个保留值。其中 8 个可用
- 仲裁和时钟同步仅在 ‘master code’ 传输期间进行,而不是在 HS 传输期间进行
- 电流源电路在发送 ‘master code’ 后使能
- 活动主设备发出重复的启动条件,后跟所需从设备的地址
- 此地址为 acked 或 nacked
- 以已知的方式继续传输
- 电流源电路在每次重复启动条件之后和每次 ACK 或 NACK 之后被禁用,以便为从机提供延长时钟的机会
- 当所有装置释放 SCL 后,它就会重新启用
- 发送停止条件后,所有设备都返回快速模式操作
时钟拉伸
High-Speed-Mode 中的时钟拉伸只允许在 ACK 位之后(和下一个字节的第 1 位之前)。在位 2-9 之间拉伸是非法的,因为这些比特的边缘被额外的电流源增强。有关更多详细信息,请参见 I2C 规范修订版 Rev. 03 第 5.3.1 章。
八、速度
I2C 时钟速度 – 为什么精度无关紧要
在 RS232 通信等同步串行传输中,时钟速度是预先确定的。由于接收方没有得到明确的时钟信号,它不得不依赖于发送方计时的准确性。任何偏差都几乎是致命的,因为它迟早会导致错误。虽然有技术可以使这种通信保持同步,即使所谓的波特率略有漂移,但总体方法是保持速率恒定和准确。
这样做的优点是可以预测传输时间,但它明显增加了保持恒定速率的要求。这就是为什么波特率计算器在互联网上随处可见的原因。
在像 I2C 总线这样的同步传输中,情况要轻松得多。时钟由发送方传输,接收方始终能够与该时钟同步。I2C 定义了几个速度等级,但是波特率这个术语在这种情况下是相当不寻常的。
速度等级(standard mode: 100 kbit/s, full speed: 400 kbit/s, fast mode: 1 mbit/s, high speed: 3,2 Mbit/s)是最大额定值。兼容的硬件保证它可以处理传输速度高达模式指定的最大时钟速率。
这并不意味着传输不能以任何较低的速度或甚至以某种可变的比特率进行。
事实上,总线主机甚至不能完全控制实际的时间。原因很简单。I2C 总线采用开漏技术。总线保持在高电平,对总线的写入意味着将其拉到地。根据总线终端、串行电阻、电容、电缆长度、总线电压和其他因素,这个降低电平和释放电平的过程需要一些时间。因此,对于任何设备来说,在进行进一步操作之前,回读修改线路(时钟和数据)的逻辑电平是一种很好的做法。
首先,主机将总线拉低来在总线上写一个零,然后读回线路的状态,然后进行下一步。
因此,实际传输速度将小于标称传输速度。由于电延迟的影响随着时钟速率的提高而增加,这种影响在速度越高时表现得越明显。
I2C 总线用于 IC 间通信,这通常意味着小数据包。由于不能精确地确定时间,而且传输的信息通常很短,因此总线时钟的准确性在大多数应用中几乎没有关系。
为了安全起见,如果有疑问,最好随时将最大比特率保持在最大额定值以下,而不是偶尔超过最大额定值。
九、电平转换
I2C 总线不限于定义的电压。在某些应用中,不同的 IC 使用不同的 I2C 参考电压。有时有必要让他们共享同一总线。为了能够识别什么是逻辑零和逻辑一,电平移位器是必要的。
与大多数接口不同,I2C 总线没有专用方向,例如,多个设备可能会将 SCL 线路拉至地。
这会导致构建 level shifters 的严重问题,因为它们必须负责将请求从一侧移动到另一侧,反之亦然,而不会引入反向耦合和振荡。处理此问题的基本思路是限制总线上的带宽。这当然会导致传输速率很差。
关于如何构建 Level Shifter 的基本想法
半导体公司 NXP 提供了一些 I2C 电压电平转换器。
I2C 总线协议
本文仅介绍 Standard-mode, Fast-mode and Fast-mode Plus 三种标准下的总线协议。
一、SDA 和 SCL 信号
SDA 和 SCL 都是双向线,通过电流源或上拉电阻连接到 VDD。当总线空闲时,两条线都是高电平。连接到总线的设备的输出级必须有一个开路漏极(open-drain)或开路集电极(open-collector)来执行接线与功能。总线的数据传输速率在Standard-mode 下可达 100kbit/s,在 Fast-mode 下可达 400kbit/s,在 Fast-mode Plus 下可达 1mbit/s,在高High-speed mode 下可达 3.4 Mbit/s。总线电容限制连接到总线的接口数量。对于单个主机应用,如果总线上没有会延长时钟的从机,控制器的 SCL 输出可以是推挽驱动(push-pull)设计。
二、SDA 和 SCL 逻辑等级
由于可以连接到 I2C 总线的设备有很多种 (CMOS, NMOS, bipolar)。逻辑 0(LOW)和 1(HIGH)的电平不是固定的,取决于 VDD 的相关电平。输入参考电平设置为 VDD 的 30% 和 70%;VIL is 0.3VDD and VIH is 0.7VDD。一些传统设备的输入电平固定在 VIL = 1.5 V 和 VIH = 3.0 V,但所有新设备都需要满足这个 30% / 70% 的规格。
三、数据的有效性
在时钟的 HIGH 期间,SDA 线上的数据必须是稳定的。只有当 SCL 线上的时钟信号为 LOW 时,数据线的 HIGH 或 LOW 状态才能改变。每传输一个数据位产生一个时钟脉冲。
四、START 和 STOP 条件
所有事务都以 START (S) 开始,并以 STOP § 终止。当 SCL 为 HIGH 时,SDA 线上的 HIGH 到 LOW 转换定义了 START 条件。当 SCL 为 HIGH 时,SDA 线上的 LOW 到 HIGH 转换定义了 STOP 条件 。
START 和 STOP 条件总是由主机生成。在 START 条件之后,总线被认为是繁忙的。在 STOP 条件之后的一段时间内,总线被认为是空闲的。
五、字节格式
在 SDA 线路上的每个字节必须是 8bit 长度。每次传输可以传输的字节数不受限制。每个字节后面必须跟一个ACK。数据首先以最高有效位(MSB)传输。如果从机不能接收或传输另一个完整的数据字节,直到它执行了一些其他功能,例如服务内部中断,它可以保持时钟线 SCL LOW 以迫使主机进入等待状态。然后,当从机准备好接收另一个字节数据并释放时钟线 SCL 时,数据传输继续进行。
六、Acknowledge (ACK) 和 Not Acknowledge (NACK)
ACK 发生在每个字节之后。ACK允许接收方通知发送方该字节已成功接收,并且可以发送另一个字节。主机产生所有时钟脉冲,包括确认第九时钟脉冲。
确认信号的定义如下:在确认时钟脉冲期间,发送方释放 SDA 线,因此接收方可以将 SDA 线拉低,并在该时钟脉冲的高周期保持稳定低电平。建立和保持时间也必须考虑在内。
当 SDA 在第 9 个时钟脉冲期间保持高电平时,这被定义为 NACK 信号。然后主机可以生成一个 STOP 条件来中止传输,或者一个重复的 START 条件来开始新的传输。有五个条件会导致 NACK 的产生:
- 总线上没有带有传输地址的接收方,因此没有设备响应确认。
- 接收方无法接收或发送,因为它正在执行一些实时功能,还没有准备好开始与主机通信。
- 在传输过程中,接收方接收到它不理解的数据或命令。
- 在传输过程中,接收方不能再接收数据字节。
- 主机-接收方时必须向从机-发送方发出传输结束的信号。
【注】主机不等于发送方,从机不等于接收方。
七、目标地址和读写位
数据传输遵循下图所示的格式。在 START 条件(S)之后,发送一个目标地址。这个地址有 7 位长,后面跟着第 8 位数据方向位(R/W):“0” 表示传输(WRITE),“1” 表示数据请求(READ)。数据传输总是由主机生成的 STOP 条件(P)终止。但是,如果主机仍然希望在总线上进行通信,它可以生成重复的 START 条件(Sr),并在不首先生成 STOP 条件的情况下处理另一个目标。在这样的传输中,读/写格式的各种组合是可能的。
可能的数据传输格式有:
- 主机向从机发送数据。传输方向没有改变(参见图 11)。从机确认每个字节。
- 主机在第一个字节之后立即读取目标(参见图 12)。在第一次 ACK 的时刻,主机从发送者成为接收者,从机从接收者成为发送者。第一个 ACK 仍然由从机生成。主机生成后续 ACK。STOP 条件由主机生成,主机在 STOP 条件之前发送一个 NACK。
- 组合格式(参见图 13)。在传输过程中改变方向时,START 条件和目标地址都是重复的,但是 R/W 位颠倒了。如果主机-接收方发送一个重复的 START 条件,它在重复的 START 条件之前发送一个 NACK。
参考资料
https://www.i2c-bus.org/