I2C总线规范详解及其Verilog实现系列文章:
I2C总线规范详解及其Verilog实现01——电路特性与原理 – 徐晓康的博客(myhardware.top)
I2C总线规范详解及其Verilog实现02——通信协议 – 徐晓康的博客(myhardware.top)
I2C总线规范详解及其Verilog实现03——读写过程与时序要求 – 徐晓康的博客(myhardware.top)
I2C总线规范详解及其Verilog实现04——I2C主机Verilog功能模块 – 徐晓康的博客(myhardware.top)
前言
此篇承接上篇,包含了I2C的Standard-Mode、Fast-Mode与Fast-Mode plus的协议,这三种工作模式所使用的协议是完全相同的。
对于Hs-mode,除传输期间不执行仲裁和时钟同步外,其余协议与上述三种模式相同。
对于Ultra Fast-Mode,NXP在原协议基础上开发了新的协议,本文不涉及。
本文参考:UM10204(I2C-bus specification and user manual) Rev. 7.0 — 1 October 2021 第三章 The I2C-bus protocol
一. I2C总线协议
I2C有两根线,串行数据线(SDA)和串行时钟线(SCL),在连接到总线上的设备之间传输信息。每个设备都有一个唯一的地址,可以根据设备的功能作为发送器或接收器进行操作。
表2 I2C总线术语的定义
Term(术语) | Description | 描述 | |
---|---|---|---|
Transmitter(发送器) | The device which sends data to the bus | 发送数据到总线的设备 | |
Receiver(接收器) | The device which receives data from the bus | 从总线接收数据的设备 | |
Controller(控制器) | The device which initiates a transfer, generates clock signals, and terminates a transfer | 启动传输、生成时钟信号和终止传输的设备 | |
Target(目标) | The device addressed by a controller | 控制器寻址的设备 | |
Multi-controller(多控制器) | More than one controller can attempt to control the bus at the same time without corrupting the message | 多个控制器可以同时尝试控制总线,而不会破坏消息 | |
Arbitration(仲裁) | Procedure to ensure that, if more than one controller simultaneously tries to control the bus, only one is allowed to do so and the winning message is not corrupted | 仲裁过程确保,如果多个控制器同时尝试控制总线,只允许一个控制器这样做,并且获胜的消息不会被破坏 | |
Synchronization(同步) | Procedure to synchronize the clock signals of two or more devices | 同步两个或多个设备的时钟信号的过程 |
I2c总线是一个多控制器总线。这意味着可以将多个能够控制总线的设备连接到它上。由于控制器通常是微控制器,所以让我们考虑一下连接到i2c总线的两个微控制器之间的数据传输的情况(见图2)。
这个例子突出显示了在I2c总线上发现的控制器-目标和接收机-发射机的关系。请注意,这些关系不是永久性的,而只取决于当时数据传输的方向。数据传输过程如下:
-
如果微控制器A想要向微控制器B发送信息:
• 微控制器A(控制器)寻址微控制器B(目标)
• 微控制器A(控制器-发送器)向微控制器B(目标-接收器)发送数据
• 微控制器A终止传输。 -
如果微控制器A想要从微控制器B接收信息:
• 微控制器A(控制器)寻址微控制器B(目标)
• 微控制器A(控制器-接收器)从微控制器B(目标-发送器)接收数据
• 微控制器A终止传输。
在这种情况下,控制器(微控制器A)生成时钟并终止传输。
连接多个微控制器到I2C总线的可能性意味着多个控制器可能会同时尝试启动数据传输。为了避免可能发生的混乱,开发了一种仲裁过程。该过程依赖于将所有I2C接口通过有线与门连接到I2C总线上。
如果两个或多个控制器试图将信息放入总线上,当一个控制器产生“1”而另一个控制器产生“0”时,首先产生“1”的控制器将失去仲裁。在仲裁过程中,时钟信号是由使用有线与门连接到SCL线的控制器生成的时钟信号的同步组合(有关仲裁的更详细信息,请参阅规范第3.1.8节)。
在I2C总线上生成时钟信号始终是控制器设备的责任;每个控制器在总线上传输数据时都会生成自己的时钟信号。当时钟线被慢速目标设备拉低或在发生仲裁时被另一个控制器拉高时,控制器的总线时钟信号才会被改变。
表3总结了I2C总线规范的强制和可选部分的使用情况,以及使用它们的系统配置
表3 I2C总线协议特性的适用性
M=强制性;O=可选;n/a =不适用
Feature (特性) | 单控制器 (Single controller) | 多控制器 (Multi-controller) | 目标 (Target)[1] |
---|---|---|---|
START condition (起始条件) | M | M | M |
STOP condition (停止条件) | M | M | M |
Acknowledge (确认信号) | M | M | M |
Synchronization (同步) | n/a | M | n/a |
Arbitration (仲裁) | n/a | M | n/a |
Clock stretching (时钟拉伸) | O[2] | O[2] | O |
7-bit target address (7位目标地址) | M | M | M |
10-bit target address (10位目标地址) | O | O | O |
General Call address (广播地址) | O | O | O |
Software Reset (软件复位) | O | O | O |
START byte (起始字节) | n/a | O[3] | n/a |
Device ID (设备ID) | n/a | n/a | O |
[1] 也指控制器作为目标的情况。
[2] 时钟拉伸是某些目标设备的特性。如果系统中没有任何目标设备可以拉伸时钟(将SCL保持低电平),则控制器无需设计来处理这个过程。
[3] “位操作”(软件模拟)的多控制器系统应考虑使用起始字节。请参阅规范第3.1.15节。
1.1 数据有效性(Data validity)
在时钟的高电平期间,SDA线上的数据必须保持稳定。只有当SCL线上的时钟信号为低电平时,数据线的高电平或低电平状态才能改变(参见图4)。每传输一个数据位时会生成一个时钟脉冲。
1.2 起始和停止条件(START and STOP conditions)
所有的传输都以START(S)起始,并以STOP(P)结束(参见图5)。当SCL为高电平时,SDA线上的高到低的转变定义了START条件。当SCL为高电平时,SDA线上的低到高的转变定义了STOP条件。
START和STOP条件总是由控制器生成。在START条件之后,总线被视为繁忙状态。在STOP条件之后的一段时间后,总线被视为空闲状态。这个总线空闲状态在第6节中有详细说明。
如果生成了重复的START(Sr)而不是STOP条件,总线将保持繁忙状态。在这方面,START(S)和重复的START(Sr)条件在功能上是相同的。因此,在本文档的其余部分,除非Sr特别相关,否则使用S符号作为泛指术语来表示START和重复的START条件。
连接到总线上的设备可以轻松检测到START和STOP条件,如果它们包含必要的接口硬件。然而,没有这种接口的微控制器必须至少每个时钟周期对SDA线进行两次采样以感知转换。
1.3 字节格式(Byte format)
放在SDA线上的每个字节必须是8位长。每次传输可以传输的字节数没有限制。每个字节后面必须跟着一个应答位。数据以最高有效位(MSB)优先的方式传输。如果目标设备在执行其他功能(例如处理内部中断)之前无法接收或传输另一个完整的数据字节,它可以将时钟线SCL保持低电平,以使控制器进入等待状态。当目标设备准备好接收另一个数据字节并释放时钟线SCL时,数据传输将继续。
1.4 应答和不应答( Acknowledge (ACK) and Not Acknowledge (NACK))
在每个字节传输后会进行应答。应答位允许接收方向发送方发出信号,表示字节已成功接收,并可以发送另一个字节。控制器生成所有的时钟脉冲,包括应答的第九个时钟脉冲。
应答信号(ACK)的定义如下:发送方在应答时钟脉冲期间释放SDA线,以便接收方可以将SDA线拉低,并在该时钟脉冲的高电平期间保持稳定低电平。需要考虑设置和保持时间(在第6节中指定)。
当SDA在第九个时钟脉冲期间保持高电平时,这被定义为不应答信号(NACK)。控制器可以生成停止条件来中止传输,或者生成重复的START条件来开始新的传输。导致生成不应答的情况有五种:
-
总线上没有接收方使用传输的地址,因此没有设备能够回复应答。 -
接收方由于执行某些实时功能而无法接收或传输数据,因此无法与控制器进行通信。 -
在传输过程中,接收方收到了无法理解的数据或命令。 -
在传输过程中,接收方无法接收更多的数据字节。 -
控制器-接收方必须向目标发射器发出传输结束的信号。
1.5 时钟同步(Clock synchronization)
当两个控制器同时开始在空闲总线上传输时,必须有一种方法来决定哪个控制器控制总线并完成传输。这是通过时钟同步和仲裁来实现的。在单个控制器系统中,不需要时钟同步和仲裁。
时钟同步是通过将I2C接口的有线与门连接到SCL线来完成的。这意味着SCL线上的高到低的转变会导致相关的控制器开始计算其低电平的持续时间,并且一旦控制器的时钟变为低电平,它会保持SCL线处于该状态,直到时钟达到高电平状态(参见图7)。然而,如果另一个时钟仍处于低电平期间,则该时钟的低到高的转变可能不会改变SCL线的状态。因此,SCL线由具有最长低电平期间的控制器保持为低电平。具有较短低电平期间的控制器在此期间进入高电平等待状态。
当所有相关的控制器计数完它们的低电平期间后,时钟线被释放并变为高电平。此时,控制器的时钟和SCL线的状态没有区别,所有的控制器开始计数它们的高电平期间。第一个完成高电平期间的控制器再次将SCL线拉低。
通过这种方式,生成了一个同步的SCL时钟,其低电平期间由具有最长时钟低电平期间的控制器确定,其高电平期间由具有最短时钟高电平期间的控制器确定。
1.6 仲裁(Arbitration)
仲裁是指在系统中使用多个控制器时才需要的协议的一部分,与同步类似。目标设备不参与仲裁过程。只有在总线空闲时,控制器才能开始传输。两个控制器可能在START条件的最小保持时间(tHD;STA)内生成START条件,从而在总线上产生有效的START条件。然后需要进行仲裁来确定哪个控制器将完成传输。
仲裁是逐位进行的。在每个位期间,当SCL为高电平时,每个控制器检查SDA电平是否与其发送的内容匹配。这个过程可能需要许多位。只要传输是相同的,两个控制器实际上可以完整地完成整个事务而没有错误。当控制器第一次尝试发送高电平,但检测到SDA电平为低电平时,控制器知道自己输掉了仲裁,并关闭其SDA输出驱动器。另一个控制器继续完成其事务。在仲裁过程中不会丢失任何信息。输掉仲裁的控制器可以在输掉仲裁的字节结束之前生成时钟脉冲,并在总线空闲时重新开始其事务。
如果控制器还具有目标功能,并且在寻址阶段输掉了仲裁,那么获胜的控制器可能正试图寻址它。输掉仲裁的控制器因此必须立即切换到目标模式。
图8展示了两个控制器的仲裁过程。根据连接到总线上的控制器数量,可能还涉及更多的控制器。当控制器生成DATA1的内部数据电平与SDA线上的实际电平之间存在差异时,DATA1输出将被关闭。这不会影响由获胜的控制器发起的数据传输。
由于对I2C总线的控制完全取决于竞争控制器发送的地址和数据,因此总线上没有中央控制器,也没有任何优先级顺序。
如果在一个控制器发送重复的START或STOP条件时另一个控制器仍在发送数据,那么仲裁过程仍在进行中的时刻将出现未定义的情况。换句话说,以下组合会导致未定义的情况:
-
控制器1发送重复的START条件,控制器2发送数据位。 -
控制器1发送STOP条件,控制器2发送数据位。 -
控制器1发送重复的START条件,控制器2发送STOP条件。
1.7 时钟拉伸(Clock stretching)
时钟拉伸通过保持SCL线为低电平来暂停传输。在SCL线再次被释放为高电平之前,传输无法继续进行。时钟拉伸是可选的,实际上,大多数目标设备不包含SCL驱动器,因此它们无法进行时钟拉伸。
在字节级别上,设备可能能够以较快的速度接收字节数据,但需要更多时间来存储接收到的字节或准备另一个要传输的字节。目标设备可以在接收并确认一个字节后将SCL线保持为低电平,强制控制器进入等待状态,直到目标设备准备好进行下一个字节传输,这是一种握手过程(参见图7)。
在位级别上,例如带有或不带有I2C总线的有限硬件的微控制器可以通过延长每个时钟的低电平期间来减慢总线时钟。任何控制器的速度都适应于该设备的内部操作速率。
在Hs模式下,这种握手特性只能在字节级别上使用(参见第5.3.2节)。
1.8 目标地址和读/写位(The target address and R/W bit)
数据传输遵循图9所示的格式。在起始条件(S)之后,发送一个目标地址。该地址由七位长度的地址位和一个第八位的数据方向位(R/W)组成 —— ‘0’表示传输(写入),‘1’表示请求数据(读取)(参考图10)。数据传输总是由控制器生成的停止条件(P)终止。然而,如果控制器仍希望在总线上通信,它可以生成一个重复的起始条件(Sr)并寻址另一个目标,而无需先生成停止条件。在这样的传输中,可以有各种读/写格式的组合。
可能的数据传输格式包括:
• 控制器-发送器向目标-接收器进行传输。传输方向不变(参见图11)。目标接收器对每个字节进行确认。
• 控制器在第一个字节后立即读取目标(参见图12)。在第一个确认时刻,控制器-发送器变成了控制器-接收器,目标-接收器变成了目标-发送器。这个第一个确认仍然由目标生成。控制器生成后续的确认。停止条件由控制器生成,在停止条件之前发送一个非确认(A)。
• 组合格式(参见图13)。在传输中改变方向时,起始条件和目标地址都会重复,但R/W位会反转。如果控制器-接收器发送一个重复的起始条件,则在重复的起始条件之前发送一个非确认(A)。
注意事项:
-
组合格式可以用于控制串行存储器,例如。在第一个数据字节中必须写入内部存储器位置。在重复起始条件和目标地址之后,可以进行数据传输。 -
关于自动增减先前访问的存储器位置等问题的决策由设备的设计者决定。 -
每个字节后面都跟着一个确认位,如序列中的A或A块所示。 -
符合I2C总线的设备在接收到起始或重复起始条件时必须重置其总线逻辑,以便它们都预期发送目标地址,即使这些起始条件没有按照正确的格式放置。 -
紧跟着停止条件的起始条件(空消息)是非法格式。然而,许多设备设计成在这种情况下能正常工作。 -
连接到总线上的每个设备都可以通过唯一的地址寻址。通常存在简单的控制器/目标关系,但也可以有多个相同的目标,可以同时接收和响应,例如在组播中。当使用像PCA9546A这样的总线切换设备时,这种技术效果最好,其中所有四个通道都处于打开状态,并且在同一时间配置相同的设备,理解无法确定每个目标是否确认,然后逐个打开通道以读取每个单独设备的配置以确认编程。请参考各个组件的数据手册。
1.9 10位寻址(10-bit addressing)
10位寻址扩展了可能的地址数量。7位和10位地址的设备可以连接到同一个I2C总线上,并且在所有总线速度模式下都可以使用7位和10位寻址。目前,10位寻址并没有被广泛使用。
10位目标地址是在起始条件(S)或重复起始条件(Sr)之后的前两个字节形成的。
第一个字节的前七位是组合 1111 0XX,其中最后两位(XX)是10位地址的最高有效位(MSB);第一个字节的第八位是确定消息方向的R/W位。
尽管保留地址位1111 XXX有八种可能的组合,但只有四种组合 1111 0XX 用于10位寻址。剩下的四种组合 1111 1XX 保留用于未来的I2C总线增强。
先前描述的所有读/写格式的组合在10位寻址下都是可能的。这里详细描述了其中两种:
• 控制器-发送器使用10位目标地址向目标-接收器进行传输。传输方向不变(参见图14)。当10位地址跟随起始条件时,每个目标将目标地址的第一个字节的前七位(1111 0XX)与自己的地址进行比较,并测试第八位(R/W方向位)是否为0。可能有多个设备找到匹配并生成确认(A1)。所有找到匹配的目标将目标地址的第二个字节的八位(XXXX XXXX)与自己的地址进行比较,但只有一个目标找到匹配并生成确认(A2)。匹配的目标将继续由控制器寻址,直到收到停止条件(P)或重复的起始条件(Sr)后跟一个不同的目标地址。
• 控制器-接收器使用10位目标地址读取目标-发送器。在第二个R/W位之后,传输方向发生变化(参见图15)。直到和包括确认位A2,该过程与控制器-发送器寻址目标-接收器的过程相同。
在重复的起始条件(Sr)之后,匹配的目标记住它之前被寻址过。然后,该目标检查跟随Sr的目标地址的第一个字节的前七位是否与起始条件(S)之后的相同,并测试第八位(R/W)是否为1。如果匹配,则目标认为自己已被寻址为发送器,并生成确认A3。目标-发送器将保持被寻址状态,直到收到停止条件(P)或收到另一个重复的起始条件(Sr)后跟一个不同的目标地址。
在重复的起始条件(Sr)之后,所有其他目标设备也会将目标地址的第一个字节的前七位(1111 0XX)与自己的地址进行比较,并测试第八位(R/W)。然而,它们中的任何一个都不会被寻址,因为R/W = 1(对于10位设备)或1111 0XX目标地址(对于7位设备)不匹配。
目标设备具有10位寻址的情况下,对于“广播调用”会和具有7位寻址的目标设备一样做出反应。硬件控制器可以在“广播调用”后传输它们的10位地址。在这种情况下,“广播调用”地址字节后面是两个连续的字节,包含控制器-发射器的10位地址。格式如图15所示,其中第一个数据字节包含控制器地址的八个最低有效位。
在10位寻址的情况下,起始字节0000 0001(01h)可以与7位寻址一样放在前面(参见第3.1.15节)。
1.10 保留地址( Reserved addresses)
两组八个地址(0000 XXX和1111 XXX)被保留用于表4中所示的目的。
Table4 保留地址
X=不在乎;1=高;0=低。
Target address | R/W bit | Description |
---|---|---|
0000 000 | 0 | General call address[1] |
0000 000 | 1 | START byte [2] |
0000 001 | X | CBUS address[3] |
0000 010 | X | Reserved for different bus format [4] |
0000 011 | X | Reserved for future purposes |
0000 1XX | X | Hs-mode controller code |
1111 1XX | 1 | Device ID |
1111 0XX | X | 10-bit target addressing |
[1] 广播寻址用于多种功能,包括软件复位。
[2] 在接收到起始字节时,没有设备被允许发送响应信号。
[3] CBUS地址被保留用于在同一系统中混合使用兼容CBUS和I2C总线的设备。I2C总线兼容设备不允许在接收到此地址时作出响应。
[4] 为不同总线格式保留的地址用于支持I2C和其他协议的混合使用。只有能够与这些格式和协议一起工作的I2C总线兼容设备被允许对此地址作出响应。
在本地系统中分配地址的工作由系统架构师负责,他必须考虑总线上使用的设备以及与其他传统I2C总线的未来交互。例如,一个具有七个用户可分配地址引脚的设备可以分配所有128个地址。如果已知保留地址永远不会用于其预期目的,那么可以将保留地址用作目标地址。
1.11 广播寻址(General call address)
广播寻址用于同时寻址连接到I2C总线上的每个设备。然而,如果设备不需要广播调用结构中提供的任何数据,它可以通过不发送确认信号来忽略这个地址。如果设备需要来自广播寻址的数据,它会发送确认信号并作为目标接收器进行响应。控制器实际上不知道有多少设备发送了确认信号。第二个及之后的字节会被每个能够处理这些数据的目标接收器确认。如果某个目标无法处理其中的某个字节,它可以通过不发送确认信号来忽略它。同样,如果一个或多个目标发送了确认信号,控制器将不会收到不确认信号。广播寻址的含义总是在第二个字节中指定(参见图16)。
有两种情况需要考虑:
-
当最低有效位B为“零”时。
-
当最低有效位B为“一”时。
当位B为“零”时,第二个字节具有以下定义:
-
0000 0110 (06h): 通过硬件重置并写入目标地址的可编程部分。当接收到这个2字节序列时,所有设计为响应广播寻址的设备都会重置并接收它们的可编程地址的部分。必须采取预防措施,确保设备在供电后不会拉低SDA或SCL线,因为这些低电平会阻塞总线。 -
0000 0100 (04h): 通过硬件写入目标地址的可编程部分。与上述情况相同,但设备不会重置。 -
0000 0000 (00h): 不允许将此代码用作第二个字节。
编程过程的序列已在适当的设备数据手册中发布。剩余的代码尚未确定,设备必须忽略它们。
当位B为“1”时,这个2字节序列是一个“硬件寻址”。这意味着这个序列是由硬件控制器设备(如键盘扫描器)传输的,该设备可以被编程为传输所需的目标地址。由于硬件控制器事先不知道消息应传输到哪个设备,它只能生成这个硬件寻址和自己的地址 – 用于识别自己给系统(参见图17)。
第二个字节中剩余的七位包含了硬件控制器的地址。这个地址被连接到总线上的智能设备(例如微控制器)所识别,然后接受来自硬件控制器的信息。如果硬件控制器也可以作为目标设备,则目标地址与控制器地址相同。
在某些系统中,另一种选择是在系统复位后将硬件控制器发射器设置为目标接收器模式。通过这种方式,系统配置控制器可以告诉硬件控制器发射器(现在处于目标接收器模式)要将数据发送到哪个地址(参见图18)。在这个编程过程之后,硬件控制器保持在控制器发射器模式。
1.12 软件复位(Software reset)
在进行广播寻址(0000 0000)之后,发送0000 0110(06h)作为第二个字节会导致软件复位。这个功能是可选的,并不是所有设备都会对这个命令作出响应。当接收到这个2字节序列时,所有设计为响应广播调用地址的设备都会重置并接收它们的可编程地址的部分。必须采取预防措施,确保设备在供电后不会拉低SDA或SCL线,因为这些低电平会阻塞总线。
1.13 起始字节(STATE byte)
微控制器可以通过两种方式连接到I2C总线。具有片上硬件I2C总线接口的微控制器可以被编程为只接受总线请求中断。当设备没有这样的接口时,它必须通过软件不断监视总线。显然,微控制器监视或轮询总线的次数越多,它能够执行其预定功能的时间就越少。因此,快速硬件设备和依赖软件轮询的相对较慢的微控制器之间存在速度差异。
在这种情况下,数据传输可以以比正常情况更长的起始过程开始(参见图19)。起始过程包括:
-
起始条件(S) -
起始字节(0000 0001) -
确认时钟脉冲(ACK) -
重复的起始条件(Sr)。
在一个需要总线访问的控制器发送起始条件S之后,起始字节(0000 0001)被发送。另一个微控制器可以以较低的采样速率对SDA线进行采样,直到检测到起始字节中的七个零之一。在检测到SDA线上的低电平后,微控制器可以切换到较高的采样速率以找到重复的起始条件Sr,然后用于同步。
硬件接收器在接收到重复的起始条件Sr后进行复位,因此忽略起始字节。
在起始字节之后生成与确认相关的时钟脉冲。这仅是为了符合总线上使用的字节处理格式。没有设备被允许对起始字节进行确认。
1.14 总线清除(Bus clear)
在极少数情况下,如果时钟(SCL)保持低电平,首选的操作是使用硬件复位信号重置总线,如果您的I2C设备具有硬件复位输入的话。如果I2C设备没有硬件复位输入,则循环给设备供电以激活强制性的内部上电复位(POR)电路。
如果数据线(SDA)保持低电平,控制器应发送九个时钟脉冲。在这九个时钟脉冲之内,保持总线低电平的设备应该会在某个时刻释放总线。如果没有释放,则使用硬件复位或循环给设备供电来清除总线。
1.15 设备ID(Device ID)
设备ID字段(参见图20)是一个可选的只读3字节(24位)的字段,提供以下信息:
-
十二位制造商名称,每个制造商唯一(例如,NXP) -
九位部件标识,由制造商分配(例如,PCA9698) -
三位芯片版本,由制造商分配(例如,RevX)
设备ID是只读的,固定在设备中,并可以按以下方式访问:
-
起始条件 -
控制器发送保留的设备ID I2C总线地址,后跟R/W位设置为“0”(写入):“1111 1000”。 -
控制器发送目标设备的I2C总线目标地址。LSB是一个“不关心”的值。只有一个设备必须对这个字节进行响应(具有I2C总线目标地址的设备)。 -
控制器发送重新起始条件。
注意:停止条件后跟启动条件会重置目标状态机,无法执行设备ID读取。此外,停止条件或重新起始条件后跟对另一个目标设备的访问会重置目标状态机,无法执行设备ID读取。 -
控制器发送保留的设备ID I2C总线地址,后跟R/W位设置为“1”(读取):“1111 1001”。 -
可以进行设备ID读取,从制造商的12位(第一个字节 + 第二个字节的四个最高有效位)开始,然后是九位部件标识(第二个字节的四个最低有效位 + 第三个字节的五个最高有效位),最后是三位芯片版本(第三个字节的三个最低有效位)。 -
控制器通过NACK方式结束读取序列,从而重置目标设备状态机,并允许控制器发送停止条件。
注意:通过发送NACK可以随时停止设备ID的读取。
如果控制器在第三个字节后继续ACK字节,目标设备将回滚到第一个字节,并持续发送设备ID序列,直到检测到NACK为止。
表5.已分配的制造商ID(manufacturer IDs)
11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Company |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NXP Semiconductors |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | NXP Semiconductors (reserved) |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | NXP Semiconductors (reserved) |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | NXP Semiconductors (reserved) |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | Ramtron International |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | Analog Devices |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | STMicroelectronics |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | ON Semiconductor |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | Sprintek Corporation |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | ESPROS Photonics AG |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | Fujitsu Semiconductor |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | Flir |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | O2Micro |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | Atmel |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | DIODES Incorporated |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | Pericom |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | Marvell Semiconductor Inc |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | ForteMedia |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | Snaju LLC |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | Intel |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | Pericom |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | Arctic Sand Technologies |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | Micron Technology |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | Semtech Corporation |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | IDT |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | TT Electronics |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | Alien Technology |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | LAPIS semiconductor |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | Qorvo |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | Wuxi Chipown Micro-electronics limited (Chipown) |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | KOA CORPORATION |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | Prevo Technologies, Inc. |
二. I2C总线通信协议的其他用途
I2C总线被用作多种系统架构的通信协议。除了基本的I2C规范,这些架构还添加了命令集和应用特定的扩展。
一般来说,像I/O扩展器这样的简单I2C总线设备可以在任何一种架构中使用,因为协议和物理接口是相同的。
2.1 CBUS兼容性(CBUS compatibility)
CBUS接收器可以连接到标准模式的I2C总线。但是,此时必须连接第三条总线DLEN,并省略应答位。通常情况下,I2C传输是由8位字节组成的序列;而CBUS兼容设备具有不同的格式。
在混合总线结构中,I2C总线设备不能对CBUS消息作出响应。因此,已经保留了一个特殊的CBUS地址(0000 001X),没有任何I2C总线兼容设备会对其作出响应。在传输CBUS地址之后,DLEN线可以被激活,并发送CBUS格式的传输。在停止条件之后,所有设备都准备好接收数据。
控制器-发送器可以在发送CBUS地址后发送CBUS格式。传输通过停止条件结束,所有设备都能识别到。
备注:如果已知CBUS配置,并且不预计扩展CBUS兼容设备,设计人员可以根据所使用设备的特定要求调整保持时间。
2.2 系统管理总线(SMBus – System Management Bus)
SMBus使用I2C硬件和I2C硬件寻址,但添加了第二级软件用于构建特殊系统。特别是,其规范包括一种地址解析协议,可以进行动态地址分配。
硬件和软件的动态重新配置允许总线设备进行“热插拔”,并立即使用,而无需重新启动系统。这些设备会被自动识别并分配唯一的地址。这个优势使得插拔即可用的用户界面成为可能。在这两个协议中,对于系统主机和系统中的其他设备(可以是控制器或目标)之间有一个非常有用的区别。
SMBus目前在大多数个人电脑中被用作系统管理总线。它是由英特尔和其他公司于1995年开发的,修改了一些I2C的电气和软件特性,以更好地与便携设备的电源预算快速减少相适应。
SMBus还有一个“高功率”版本2.0,其中包括一个4mA的汇流电流,除非将上拉电阻器尺寸调整为I2C总线电平,否则无法由I2C芯片驱动。
2.2.1 I2C/SMBus兼容性(I2C/SMBus compliancy)
SMBus和I2C协议基本上是相同的:SMBus控制器能够在协议级别上控制I2C设备,反之亦然。SMBus时钟的定义范围是10 kHz到100 kHz,而I2C的范围可以是0 Hz到100 kHz、0 Hz到400 kHz、0 Hz到1 MHz和0 Hz到3.4 MHz,具体取决于模式。这意味着,运行在低于10 kHz的I2C总线不符合SMBus的兼容性要求,因为SMBus设备可能会超时。
逻辑电平也略有不同:SMBus的TTL电平为:低电平=0.8 V,高电平=2.1 V,而I2C的CMOS电平为VDD的30%/70%。如果VDD > 3.0 V,这不是一个问题。如果I2C设备低于3.0 V,则可能会出现问题,可能逻辑高/低电平不能被正确识别。
2.2.2 超时功能(Time-out feature)
SMBus具有超时功能,如果通信时间过长,它会重置设备。这解释了为什么最小时钟频率为10 kHz,以防止总线锁死。
I2C可以是一个”DC”总线,这意味着当控制器正在访问目标设备时,目标设备可以拉伸控制器时钟以执行某些例程。这通知控制器目标设备正在忙碌,但不想丢失通信。目标设备将在任务完成后允许继续进行。在I2C总线协议中,对于这种延迟的时间没有限制,而对于SMBus系统,它将被限制在35ms内。
SMBus协议假设如果某个操作耗时过长,则意味着总线上存在问题,所有设备必须重置以清除这种模式。然后,目标设备不被允许将时钟保持在低电平太长时间。
2.2.3 SMBus 1.0和SMBus 2.0之间的差异(Differences between SMBus 1.0 and SMBus 2.0)
SMBus规范定义了两类电气特性:低功率和高功率。第一类最初在SMBus 1.0和1.1规范中定义,主要用于智能电池,但也可用于其他低功率设备。
2.0版本引入了一组替代的高功率电气特性。当需要更高的驱动能力时,例如在PCI插卡上的SMBus设备以及将这些卡片连接到PCI连接器之间和系统板上的SMBus设备时,这个类别是合适的。
设备可以由总线的VDD或另一个电源VBus(例如智能电池)供电,并且只要它们符合其类别的SMBus电气规范,它们就可以互操作。
NXP设备具有比SMBus 1.0更高的电气特性。主要区别在于电流汇流能力,其中VOL = 0.4 V。
-
SMBus低功率 = 350 μA -
SMBus高功率 = 4 mA -
I2C总线 = 3 mA
如果将上拉电阻器调整为3 mA,SMBus “高功率”设备和I2C总线设备将可以一起工作。
欲了解更多信息,请参考:http://www.smbus.org/。
2.3 电源管理总线(PMBus – Power Management Bus)
PMBus是通过SMBus在电源转换器和系统主机之间进行通信的标准方式,以提供对电源转换器更智能控制的能力。PMBus规范定义了一套标准的设备命令,以使来自多个来源的设备具有相同的功能。PMBus设备使用SMBus版本1.1以及扩展进行传输。
欲了解更多信息,请参考:https://pmbus.org/。
2.4 智能平台管理接口(IPMI)(Intelligent Platform Management Interface)
智能平台管理接口(IPMI)定义了一种标准化的、抽象的、基于消息的接口,用于智能平台管理硬件。IPMI还定义了描述平台管理设备及其特性的标准记录。通过监控温度、电压、风扇和机箱入侵等参数,IPMI提高了系统的可靠性。
IPMI提供了一般的系统管理功能,如自动警报、自动系统关机和重启、远程重启和电源控制。智能平台管理硬件的标准化接口有助于预测和早期监测硬件故障,并诊断硬件问题。
这种标准化的总线和协议用于在机箱内扩展管理控制、监控和事件传递:
-
基于I2C -
多控制器 -
简单的请求/响应协议 -
使用IPMI命令集 -
支持非IPMI设备 -
物理上是I2C,但只写(控制器能力设备);不需要热插拔 -
允许基板管理控制器(BMC)接受来自系统中其他管理控制器的IPMI请求消息 -
允许总线上的非智能设备和管理控制器 -
BMC作为控制器,使系统软件能够访问IPMB。
硬件实现与软件实现相互隔离,因此可以添加新的传感器和事件而无需进行任何软件更改。
欲了解更多信息,请参考:https://www.intel.com/content/www/us/en/products/docs/servers/ipmi/ipmi-home.html。
2.5 先进电信计算架构(ATCA)(Advanced Telecom Computing Architecture)
先进电信计算架构(ATCA)是Compact PCI(cPCI)的后续产品,提供了一个标准化的形态因子,具有更大的卡片面积、更大的间距和更大的电源供应,用于先进的机架式电信硬件。它包括一种容错方案,用于通过I2C总线在板间进行热管理的通信。
先进电信计算架构(ATCA)得到了100多家公司的支持,包括英特尔、朗讯和摩托罗拉等大型参与者。
对于符合ATCA的风扇控制,有两种一般的符合方法:第一种是智能FRU(可更换单元),意味着风扇控制将直接连接到IPMB(智能平台管理总线);第二种是托管或非智能FRU。
其中一个要求是包含硬件和软件来管理双I2C总线。这需要一个板载隔离电源来为电路供电,一个带有上升时间加速器和3态能力的缓冲双I2C总线。I2C控制器必须能够支持多控制器的双I2C总线,并处理协议中概述的标准风扇命令集。此外,还需要板载温度报告、托盘能力报告、风扇关闭能力和非易失性存储。
欲了解更多信息,请参考:https://www.picmg.org/openstandards/advancedtca/。
2.6 显示数据通道(DDC)(Display Data Channel)
显示数据通道(DDC)允许显示器或显示设备向主机提供有关其身份和功能的信息。DDC版本2的规范要求符合I2C总线标准模式规范。它允许显示设备与主机之间进行双向通信,从而控制显示器功能(例如图像显示方式)以及与连接到I2C总线的其他设备进行通信。
更多信息,请参考:https://vesa.org/。
三. 与I2C协议兼容/类似的协议
总结与I2C协议兼容/类似的协议如下:
3.1 SCCB
参考:OmniVision Serial Camera Control Bus (SCCB) Functional Specification V2.2
SCCB( Serial Camera Control Bus,串行摄像头控制总线),是由OV( OmniVision的简称)公司定义和发展的串行总线, 该总线控制着摄像头大部分的功能, 包括图像数据格式、分辨率以及图像处理参数等。 OV公司为了减少传感器引脚的封装, 现在SCCB总线大多采用两线式接口总线。
SCCB与I2C的不同只在于以下三点:
-
SCCB的应答位称为X,表示“don’t care”,而I2C应答位称为ACK。
-
SCCB只能单次读,而I2C除了单次读还支持连续读。
-
SCCB读操作中间有stop,而I2C读操作中间可以有stop也可以不需要stop,具体表现如下
SCCB读:start_1 + phase_1 + phase_2 + stop_1 + start_2 + phase_3 + phase_4 + stop_2
I2C读: start_1 + phase_1 + phase_2 + + start_2 + phase_3 + phase_4 + stop_2
简单来说就是,SCCB不需要应答,只能单次读
。
可以将SCCB看成简化版I2C。
四. 我关于I2C协议的总结
前两章是规范第三章的中文翻译,本章将依据自身理解和实际应用介绍I2C协议的主要内容。
-
SCL高电平期间,SDA上数据必须保持稳定,也就是说SDA的数据变化必须在SCL低电平时发生
-
传输起始条件(S)定义为当SCL为高电平时,SDA上数据由高到低的变化
-
传输停止条件(P)定义为当SCL为高电平时,SDA上数据由低到高的变化
-
重复的START(Sr)意为在一个起始条件后接着再发一个起始条件,总线就一直处于繁忙状态
-
SDA上的数据必须是8位的,从MSB开始传输
-
时钟拉伸,如果目标设备,没有准备好接收数据,则可以主动拉低SCL,这时发主机就无法拉高SCL,传输就此暂停,直到目标设备准备好接收,放弃对SCL的拉低,这时主机就可以拉高SCL,传输继续
-
应答,主机发送完8bit后,第9bit为留给从机的应答位,此时SCL线仍由主机驱动,而SDA线由从机驱动,主机在SCL的高电平期间检测到SDA低电平表示应答,高电平表示不应答
-
时钟同步(仅针对多控制器系统),SCL上的时钟同步通过SCL的线与来实现,当总线上任意一个设备拉低SCL时,SCL就将保持低电平,所以SCL的低电平持续时间由最长的SCL低电平器件决定
-
仲裁(仅针对多控制器系统),当控制器第一次尝试发送高电平,但检测到SDA电平为低电平时,控制器知道自己输掉了仲裁,并关闭其SDA输出驱动器
-
目标地址和读/写位,7位地址 + 读写位 构成一个字节
-
目前(20241105)还未出现支持10位地址的I2C器件,未来大概率也不会出现,所以不必关心10位地址
五. 分享
分享:
I2C规范文件——UM10204(I2C-bus specification and user manual) Rev. 7.0.pdf 。
SCCB规范——SCCBSpec_AN.pdf。
欢迎大家关注我的公众号:徐晓康的博客,回复以下四位数字获取。
0268
建议复制过去不会码错字
如果本文对你有所帮助,欢迎点赞、转发、收藏、评论让更多人看到,赞赏支持就更好了。
如果对文章内容有疑问,请务必清楚描述问题,留言评论或私信告知我,我看到会回复。
徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。