彻底搞懂I2C总线(2)标准模式、快速模式下的I2C通信协议
通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同工作实现信息交换和资源共享,它们之间必须具有共同的语言。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。图1-11 术语定义。
本文摘自德力威尔王术平的系列I2C文章之2,全系列地址如下:
摘要
软硬件开发必读文档:本章节详细全面、通俗易懂地阐述了标准模式、快速模式以及快速增强模式下的I2C总线的连接方式、逻辑电平、空闲状态、数据有效性、启动停止条件、数据应答、时钟同步、总线仲裁、时钟延长、从机地址、保留地址、软件复位、启动字节、总线清除、设备ID等内容。
二. I2C总线的特点
图1-10 I2C总线应用示例
I2C具有如下特点:
①只需要两条总线:串行数据线(SDA)和串行时钟线(SCL)。
②连接到总线的每个设备都是可通过唯一地址进行软件寻址的,并且始终存在简单的控制器/目标关系;控制器可以作为控制器发送器或控制器接收器运行。
③这是一种真正的多控制器总线,包括冲突检测和仲裁,以防止两个或更多控制器同时启动数据传输时出现数据损坏。
④面向8位的串行双向数据传输速率在标准模式下最高可达100 kbit/s,在快速模式下最高可达400 kbit/s,在快速增强模式下最高可达1 Mbit/s,在高速模式下最高可达3.4 Mbit/s。
⑤串行、面向8位、单向数据传输,在超快速模式下最高可达5 Mbit/s。
⑥片内滤波可抑制总线数据线上的尖峰信号,以保持数据完整性。
⑦可以连接到同一总线的IC数量仅受最大总线电容的限制。在某些条件下(如简化SCL时钟频率、增加输出驱动力、增加缓冲器件、改进上拉电阻等),可以允许更大的电容。
⑧极低的电流消耗,高抗扰度,宽电源电压范围,宽工作温度范围。
⑨硬件的最简化,给芯片设计师减轻了节省输出引脚的压力,给芯片应用商带来了成本降低、空间减小、测试方便、易于升级等诸多好处,为芯片应用工程师的产品开发带来灵活多样的选择方案、方便快捷的调试手段、开发周期的缩短、开发效率的提高等好处。
三. I2C总线协议
3.1 什么是通信协议
通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同工作实现信息交换和资源共享,它们之间必须具有共同的语言。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。
3.2 标准模式、快速模式和快速模式增强版的I2C总线协议
3.2.1 协议概述
3.2.1.1 术语定义
图1-11 术语定义
3.2.1.2 I2C总线设备的主从角色分配和收发关系确定
设备之间使用串行数据(SDA)和串行时钟(SCL)两条总线来传输信息。每个设备(包括微控制器、LCD驱动器、存储器、键盘接口等)都有一个唯一的地址,可以作为发送器或接收器工作,具体取决于设备的功能。如LCD驱动器只可以作为接收器,而存储器既可以作为接收器也可以作为发送器。
在执行数据传输时,有的设备可以作为控制器(主机),有的设备可以作为目标(从机)。控制器是在总线上启动数据传输并产生时钟信号以允许传输的设备,此时,任何被寻址的设备都被视为目标。
I2C总线是一种多控制器总线,也就是在总线上可以连接多个控制器,这些控制器都可以发起对总线的控制,通过仲裁机制,同一个时刻,只能有一个控制器获得控制权,其他控制器轮流获取总线的控制权。一般来说,控制器由微控制器充当。
图1-12 使用两个微控制器的I2C总线配置示例
我们以图1-12所示的连接有两个单片机(微控制器)的I2C总线电路为例,来说明设备之间传输数据时,控制器(主机)与目标(从机)的关系以及发送器与接收器的关系(这些关系不是永久的,只是取决于当时数据传输的方向)。设备之间数据传输分为如下几种情况:
第一种情况:单片机和单片机之间传输数据(单片机是可收可发,可主可从的设备)
这种情况代表了主机和主机之间数据传输,由于数据传输时只能在主从之间进行,所以某个主机将转变为从机角色,根据传输需要主从角色可以互换。
(1)单片机A充当主机,单片机B充当从机的时候
①假设单片机A想要向单片机B发送信息:
单片机A(主机),寻址单片机B(从机);
单片机A(主机/发送器)向单片机B(从机/接收器)发送数据;
单片机A终止传输。
②如果单片机A想要从单片机B接收信息:
单片机A(主机)寻址单片机B(从机);
单片机A(主机/接收器)从单片机B(从机/发送器)接收数据;
单片机A终止传输。
(2)单片机B充当主机,单片机A充当从机的时候
①假设单片机B想要向单片机A发送信息:
单片机B(主机),寻址单片机A(从机);
单片机B(主机/发送器)向单片机A(从机/接收器)发送数据;
单片机B终止传输。
②如果单片机B想要从单片机A 接收信息:
单片机B (主机)寻址单片机A (从机);
单片机B(主机/接收器)从单片机A (从机/发送器)接收数据;
微控制器B终止传输。
第二种情况:单片机A和RAM之间传输数据(RAM是可收可发,只当从机的设备)
这种情况代表了主机和从机之间的数据传输,而且从机是可收可发的设备,这种情况主从角色是固定的,数据传输是双向的。
①假设单片A想要向ARM发送信息:
单片机A(主机),寻址RAM(从机);
单片机A(主机/发送器)向RAM(从机/接收器)发送数据;
单片机A终止传输。
②如果单片机A想要从RAM接收信息:
单片机A(控制器)寻址RAM(目标);
单片机A(主机/接收器)从RAM(目标/发送器)接收数据;
微控制器A终止传输。
第三种情况:单片机A和LCD之间传输数据(LCD是只能收,只能当从机的设备)
这种情况代表了主机和从机之间的数据传输,而且从机是只收不发的设备,这种情况主从角色是固定的,数据传输是单向的。
①假设单片A想要向LCD发送信息:
单片机A(主机),寻址LCD(从机);
单片机A(主机/发送器)向LCD(从机/接收器)发送数据;
单片机A终止传输。
②如果单片机A想要从LCD接收信息:
无法实现。因为LCD只收不发的设备。
3.2.1.3 I2C总线多主机控制权竞争冲突解决方法
将多个单片机连接到I2C总线,就可能有多个主机同时尝试启动数据传输。为了避免这种事件可能引起的混乱,就需要制定了一个仲裁程序。该程序依赖于所有I2C接口到I2C总线的线与连接。
如果两个或多个主机试图将信息放到总线上,当另一个主机产生“0”时,第一个产生“1”的控制器将失去仲裁。仲裁期间的时钟信号是控制器使用以下各项生成的时钟的同步组合与SCL线的线与连接(有关仲裁的更多详细信息,请参见Section 3.1.8仲裁章节)。
时钟信号的作用?
I2C总线上时钟信号的产生总是控制器设备的责任;当在总线上传输数据时,每个控制器产生自己的时钟信号。来自一个控制器的总线时钟信号只能在它们被一个按住时钟线的慢速目标设备或仲裁发生时被另一个控制器拉伸时被改变。
I2C总线规范的规定需要强制配置开始条件、停止条件、应答、7位从机地址。
3.2.2 SDA和SCL信号线
3.2.2.1 SDA和SCL总线要接上拉电阻或电流源
SDA和SCL都是双向线路,将所有设备的SDA线全部连在一起构成SDA总线,将所有设备的SCL线全部连在一起构成SCL总线,工作地线GND共用,每个设备都可以通过SDA和SCL线,向外传输信号(高低电平)或者从外面接收信号(高低电平),这些互连设备中至少需要一个主机(参考图1-13)。
图1-13 I2C总线SDA和SCL信号连接示例
SDA和SCL信号线上,必须通过电流源或上拉电阻连接到正电源电压。因为I2C设备内部输出电路已设计成开漏(OD)输出或开集电极(OC)输出(如图1-14),所以要在总线上外接上拉电阻或电流源,用来给总线上提供高电平。
如图1-14 I2C设备内部输入、输出结构
3.2.2.2 为什么I2C接口内部是OD(OC)输出
I2C设备内部为什么要设计成OD或OC结构,而不设计成推挽结构呢?其目的是防止总线上进行“线与”时发生短路现象造成设备过热或损坏。因为如果设计成推挽结构(如图1-15),在SDA或SCL总线上,同一时刻某些设备输出高电平,某些设备输出低电平时,连接电源的上拉开关管和连接地的下拉开关管之间就会短路,导致开关功耗过大(如有限流保护)或者烧坏器件。对于单个主机(一主多从)应用,如果从机也没有延长时钟的功能,那么控制器(主机)的SCL输出可以设计为推挽驱动输出。
如图1-15推挽输出短路示意图
3.2.2.3 为什么I2C接口内部不集成上拉电阻
为什么不采用图1-15那样,把外部的上拉电阻集成到设备(芯片)内部去呢?上拉电阻集成到芯片内部,导致芯片结构复杂、芯片功耗增大以及无法兼容不同电源电压的设备(如图1-16)。
图1-16 内部集成上拉电阻无法兼容高电平信号
芯片内部不集成上拉电阻,共用外部的上拉电阻,其作用有三:①简化芯片内部电路;②减小芯片内部功耗;③不同电源供电的设备可以做到高电平信号兼容(如图1-17)。
图1-17 开漏输出外接上拉电阻可以兼容高电平信号
3.2.2.4 总线传输速率
I2C总线上的数据传输速率在标准模式下可达100 Kbit /s,在快速模式下可达400 Kbit /s,在快速模式增强版下高达1 Mbit/s,在高速模式下高达3.4 Mbit/s,在超快速模式下高达5 Mbit/s。总线上连接设备的数量受到总线电容的限制。
3.2.3 SDA和SCL信号线逻辑电平
连接到I2C总线的设备的有CMOS器件、NMOS器件、BIPOLAR器件等,其电源电压不尽相同,在SDA和SCL信号线上逻辑“0”(低)和逻辑“1”(高)的电平阈值也不是固定的,I2C规范做出如下二种规定:
①如果是传统器件,则输入电平是固定的(如图1-18):VIL≤1.5V,VIH≥3.0V。
图1-18 传统器件固定输入电平
②如果是新型器件,则输入电平取决于电源电压VDD(如图1-19):VIL≤0.3VDD,VIH≥0.7VDD。
图1-19 新器件输入电平为30%VDD和70%VDD
图1-17是对以上两种电平规定的具体应用。具体细节请参考电气规格相关章节。
3.2.4 I2C总线空闲状态
I2C总线有四种状态:空闲、启动、忙碌、停止。
当总线为空闲状态时,SDA和SCL两条线路一定都是高电平。但是SDA和SCL两条线路都是高电平时,并不一定是总线空闲状态,譬如总线正在传输数据“1”时,SDA和SCL都是高电平,但此时并不是总线空闲状态。所以,总线空闲状态不但要求SDA和SCL线要同时为高电平,而且还要求同时为高电平的保持时间不小于tBUF(tBUF:标准模式≥4.7us,快速模式≥1.3us,快速增强模式≥0.5us,超快模式≥80ns)。
图1-20 I2C总线的两种空闲状态
I2C总线有两种空闲状态(参考图1-20):
①第一种是设备第一次启动前的空闲状态, 其满足条件为:SDA和SCL同为高电平,且保持时间较长(此处官方没给出具体参数,但笔者认为不应小于第二种空闲状态高电平保持时间tBUF);
②第二种是设备停止总线后,再启动前的空闲状态,其满足条件为:SDA和SCL同为高电平,且保持时间≥tBUF(tBUF:标准模式≥4.7us,快速模式≥1.3us,快速增强模式≥0.5us,超快模式≥80ns)。
值得注意的是,I2C总线在工作中的热启动之前(SDA和SCL同为高电平)的状态,协议判定为忙碌状态而非空闲状态。
3.2.5 SDA信号线的数据有效性
SDA是串行数据线,此处的“数据”是“数据的传输地址、数据的处理命令、数据的真正内容”的统称。有些电路中的“数据”专指“数据的真正内容”。
在串行时钟SCL线的高电平期间,SDA线的“高电平”或者“低电平”状态必须保持稳定,此时SDA线上稳定的“高电平”或“低电平”就是有效数据“1”或者“0”。SDA线的“高电平”或者“低电平”状态地改变,只能在SCL线的低电平期间进行。串行时钟SCL线每产生一个高电平脉冲,串行数据SDA线就传输一位有效数据。SDA线在SCL线的低电平期间准备数据(改变电平),SDA数据准备完毕(电平改变结束并保持稳定)后,SCL线由低电平变为高电平并保持稳定,此时SDA线的稳定电平就是有效数据(参见图1-21)。
图1-21 SDA信号线数据有效性
设备的SDA接口线每次输出电平后,会立即回读SDA总线电平,用来判断自己的输出是否与总线一致。SCL线和SDA一样,也有这种回读判读机制。
3.2.6 启动和停止条件
所有的传输通信都是以起点(S)开始,以终点(P)结束(参见图1-22 )。当SCL为高电平时,SDA线上的高电平到低电平转换表示传输启动(Start)条件。当SCL为高电平时,SDA线上的低电平到高电平转换表示停止(Stop)条件。
图1-22 I2C总线启动和停止条件
启动和停止总是由主机发起。在启动发起之后,总线被认为是忙碌的。在停止发起之后的某个时间(≥tBUF),总线被认为是再次空闲的。
为便于理解,德力威尔王术平把启动分为两种启动(参考图1-20):
①冷启动(简称启动S),指的是总线处于空闲状态时主机发起的启动,包含主机通电后处于空闲状态时首次发起的启动和主机工作一段时间停止后处于空闲状态时发起的启动。
②热启动(简称重启Sr),指的是主机在连续工作时,不用停止总线而发起的重启。
简而概之,冷启动是停止条件发生后,总线“冷”下来处于空闲状态时,主机发起的启动;热启动是不用停止总线,主机在工作中重新发起的启动。
无论是启动(S)还是重启(Sr)后,总线都会保持忙碌。在这方面,启动(S)和重启 (Sr)条件在功能上是相同的。因此,I2C规范中,启动和重启条件都用通用术语S符号表示,除非有特别说明。
在软件编程时,要区分启动(S)前的空闲时间tBUF和重启(Sr)前的建立时间tSU;STA。
tBUF:标准模式≥4.7us,快速模式≥1.3us,快速增强模式≥0.5us,超快模式≥80ns。
tSU;STA:标准模式≥4.7us,快速模式≥0.6us,快速增强模式≥0.26us,高速模式≥160ns,超快模式≥50ns。
如果连接到总线的设备集成了I2C接口,则它们可以很容易地检测到启动和停止条件。如果没有这种I2C接口的微控制器,则必须在每个SCL时钟周期内,对SDA线路至少采样两次,以检测启动和停止条件。
3.2.7 字节传输格式
图1-23 I2C总线数据传输格式
如图1-23所示,总线启动后,串行数据SDA线上每次传输一个字节(8bit),每个字节后必须跟随一个应答位,可以连续传输多次。数据首先从最高有效位(MSB)开始。如果从机由于内部繁忙(如内部中断或处理其他事件),无法立即接收或发送下一个字节的数据,从机可以拉低并保持时钟线SCL,以迫使主机进入等待状态,直到从机做好接收或发送准备后,从机再释放时钟线SCL,并继续接收或发送数据。
3.2.8 应答(ACK)和不应答(NACK)
如图1-23所示,应答发生在每个字节之后。应答位是接收器向发送器发送的确认信号,告知该字节已成功接收,并且可以发送另一个字节。主机控制SCL线产生所有时钟脉冲,包括第9个应答时钟脉冲。
应答(ACK)信号定义如下:在第9个应答时钟脉冲SCL保持高电平期间,发送器释放SDA线(外部上拉使SDA变为高电平),接收器拉低SDA线并保持稳定。主机或从机收到ACK应答信号后,可以继续进行接下来的传输。
不应答(NACK)信号定义如下:在第9个应答时钟脉冲SCL保持高电平期间,发送器释放SDA线(外部上拉使SDA变为高电平),接收器也释放SDA线,并使SDA保持高电平稳定。主机接收到NACK信号后,可以发出一个停止信号来中止传输,或者发出一个重启信号开始新的传输。 从机接收到NACK信号后,自我结束本次发送,进入接收待机状态。导致NACK产生的条件有五个:
①总线上不存在带有发送地址的接收器,因此没有设备做出应答。
②接收器不能接收或发送,因为它正在执行一些实时功能,并且没有准备好开始与控制器通信。
③在传输过程中,接收器接收到它不理解的数据或命令。
④在传输过程中,接收器无法接收更多的数据字节。
⑤控制器-接收器必须向目标发送器发送传输结束的信号。
3.2.9 时钟同步
图1-24 I2C总线时钟同步
在空闲总线时,两个主机可以同时启动传输,必须有一种方法来决定由哪一个主机来控制总线并完成传输。这是通过时钟同步和仲裁两个步骤来完成的。在一主多从的系统中,不需要时钟同步和仲裁。
参考图1-24,使用设备的SCL接口和SCL总线之间的“线与”连接来执行时钟同步。主机一的SCL接口一旦检测到SCL总线上由高电平到低电平的转换时,主机一便拉低自己的SCL,并开始倒计数应有的SCL低电平保持时间,直到应有的低电平时间结束,便把SCL时钟拉到高电平状态。如果另一个主机二的SCL时钟仍然处于低电平周期内,则主机一的SCL时钟由低到高的转换不会改变SCL总线为低电平的状态,则主机一的SCL时钟进入高电平等待状态。因此,SCL总线被具有最长低电平周期的主机保持在低电平。
当所有相关的主机都已完成其低电平周期的计数时,SCL时钟总线被释放并变为高电平。主机SCL接口和SCL总线的状态之间保持一致,都为高电平。所有主机开始计算它们的高电平周期。第一个完成高电平周期的主机再次将SCL线拉低。
这样,就产生了同步的SCL总线时钟,其低周期由具有最长时钟低周期的主机确定,其高周期由具有最短时钟高周期的主机确定。
3.2.10 总线仲裁
设备的SDA接口线每次输出电平后,会立即回读SDA总线电平,用来判断自己的输出是否与总线一致。SCL线和SDA一样,也有这种回读判读机制。
仲裁协议用于多主机的系统中,单主机系统不需要仲裁。仲裁程序发生在主机之间,从机不涉及仲裁。只有当总线空闲时,主机才可以启动传输。两个主机同时发起启动后,总线需要对这两个主机进行仲裁,以确定最终由哪个主机控制总线并完成其传输。
仲裁由SCL线和SDA线一起配合来完成的,其分工如下:
SCL线负责时钟同步(参考图1-24):两个主机在空闲状态时,同时发起启动,然后各自根据自己的时序要求拉低SCL总线输出低电平,释放SCL总线输出高电平,根据前面章节介绍的SCK时钟同步机制实现时钟同步。
SDA线负责数据仲裁(参考图1-25):仲裁是在SDA线上一位一位地进行的。在每一位传输期间,当SCL为高电平时,每个主机各自判断自己SDA线输出的电平是否与SDA总线电平一致(回读判读机制),如果某主机发现输出电平和回读电平不一致,则该主机仲裁失败,失去对总线的控制权,随即关闭自己SDA输出驱动器,另一个主机赢得仲裁获取对总线的控制权,继续完成它的传输事务。这种仲裁过程可能需要进行很多位。
图1-25 I2C总线仲裁
在仲裁过程中,赢得仲裁的主机不会丢失任何信息,仲裁失败的主机可以继续产生时钟脉冲,直到其仲裁失败的字节结束,并且可以在总线空闲时重新发起仲裁。
如果一个主机也具有从机的功能,并且在寻址阶段仲裁失败,那么获胜的主机可能正在尝试寻址它。因此,失败的主机必须立即切换到其从机模式。
根据连接到总线的主机数量,以上的仲裁方式也适合更多主机的系统。
由于对I2C总线的控制完全由参与竞争的主机发送的地址和数据决定,所以总线上没有中央控制器,也没有任何优先级顺序。
当一个主机发送重启或停止信号时,而另一个主机仍在发送数据时,如果仲裁程序仍在进行中,则会出现未定义(异常)的状态。换句话说,以下组合会导致异常情况:
主机1发送重启信号,主机2发送数据位(所以重启前一定要判断重启建立时间tSU;STA)。
主机1发送停止信号,主机2发送数据位。
主机1发送重启信号,主机2发送停止信号。
3.2.11 时钟拉伸(Clock stretching)
在传输一个字节时,从机可能能够快速接收数据字节,但需要更多时间来存储接收到的字节或准备要传输的字节,如果基于以上原因无法立即进行下一个字节的传输时,那么从机在接收完一个字节并应答后,可以将SCL线(主机输出)的低电平继续拉低并保持,以强制主机进入等待状态,直到从机做好了传输下一个字节的准备(参见图1-26)。
图1-26 时钟拉伸
时钟拉伸通过将SCL线保持在低电平来暂停传输,直到SCL总线路再次被释放为高电平,这样可以实现高低速器件兼容。时钟拉伸是可选的,事实上,大多数从机设备不具有SCL驱动程序,因而具有拉伸时钟的功能。
3.2.12 7位从机地址和读/写位
图1-27 一个完整的数据传输示例
数据传输遵循图1-27中所示的格式。主机在启动后,发送从机地址,该地址为7位长度。后面第8位是数据传输方向位,逻辑“1”代表读(R),表示接下来的数据由从机发送给主机,逻辑“0”代表写(/W),表示接下来的数据由主机发生给从机(参考图1-28)。
图1-28 从机地址和读写位
如果主机和从机1通信后,希望再和从机2进行通信,一种方法是主机可以发起重启(热启动)并寻址从机2进行通信;另一种方法是主机也可以发起停止信号,总线停止后处于空闲状态时,主机再启动(冷启动)并寻址从机2进行通信。
在这种传输中,读/写格式的各种组合有很多种,具体如下:
①主机发送器向从机接收器发送信号。传输方向不变(参见图1-29),从机接收器确认每个字节。
图1-29 主机向从机发送信号
②主机在第一个字节后立即读取从机(参见图1-30)。在第一次应答(ACK)后,主机发送器变成主机接收器,从机接收器变成从机发送器。这里的第一应答仍然由从机产生。主机产生后续应答。停止信号由主机产生,主机在发起停止信号之前先给从机发送一个不应答(NACK)信号。
图1-30 从机向主机发送
③混合模式(如图1-31)在传输过程中改变方向时,启动信号和从机地址都会重复,但R/W位会反转。如果主机接收器要发送重启信号,它就在重启之前发送不应答(NACK)。
图1-31 主机发送或从机发送混合模式
注意事项:
①例如,可以使用混合模式来控制串行存储器。第一个数据字节必须写入内部存储器位置。重复起始条件和目标地址后,可以传输数据。存储器内部地址自增或自减,有芯片设计厂商决定。
②每个字节后面都有一个应答位,如序列中的A或/A块所示,用来应答或不应答发送器。
③I2C总线兼容设备必须在接收到开始或重复开始条件时重置它们的总线逻辑,以便接收主机发送的从机寻址地址,即使这些起始条件没有按照正确的格式定位。
④开始条件后紧跟停止条件(无效消息)是非法格式。然而,有许多设备被厂商设计成在这种条件下正常工作。
⑤连接到总线的每个设备都可以通过唯一的地址寻址。通常存在一个简单的主机/从机关系,但也可能有多个可以同时接收和响应的相同从机,例如在群组广播中。这种技术最适合使用PCA9546A等总线开关器件,其中所有四个通道都开启,同时配置相同的器件,但要知道不可能确定每个目标都应答,然后一次开启一个通道来回读每个器件。
⑥软件编程所需要的参数和时序,请参照相关参数表和时序图。
3.2.13 10位从机地址
大多数兼容I2C总线的从机设备具有7位从机地址编码,理论上可以在总线连接128个从机设备,为在同一总线上连接更多的从机设备,I2C规范增加了 10位地址编码的从机设备,理论上从机设备可以扩展到1024个。目前,10位寻址设备没有被广泛使用。具有7位和10位地址的设备可以连接到同一个I2C总线,可用于所有总线速度模式。
如图1-32所示,10位从机地址由启动(S)或重启(Sr)信号后的前两个字节构成:①第一个字节的前七位是组合1111 0XX,其中前五位(1111 0)是特殊规定且不可更改的;后两位(XX)是10位地址的两个最高有效位(MSB );第一个字节的第八位是决定信号方向的R/W位。②第二个字节是10位地址的低8位。
前面针对7位寻址设备描述的读/写格式的所有组合对于10位寻址也是适合的。这里举2个例子来进一步说明10位地址的用法:
①如图1-32,主机向具有10位从机地址的从机发送数据。传输方向不变。主机启动(热启动),发送第一个寻址字节,每个从机判读第一个寻址字节的第八位(R/W方向位)是否为0,如果为0,每个从机将第一个寻址字节的前七位(1111 0XX)与其自身地址进行比较,这时,前七位地址相同的从设备会同时产生应答(A1);接着主机发送第二个寻址字节(XXXX XXXX),所有从机将该地址(XXXX XXXX)的全部八位与它们自己的地址进行比较,但是只有一个从机找到匹配并产生应答(A2),找到匹配的从机继续保持被寻址状态,直到收到停止(P)或重启(Sr)信号。
图1-32 10位从机地址的主发从收模式
②如图1-33,主机从带有10位从机地址的从机读取数据。主机启动(热启动)后发送第一个寻址字节和第二个寻址字节后,只有一个从机被寻址。在重复的开始条件(Sr)之后,匹配的从机记得它以前被寻址过。然后,该从机检查重启(Sr冷启动)之后的主机第一个字地址节的前七位是否与自己的相同(此时无需第二个寻址字节),并测试第八个(R/W)位是否为1,如果前七位相同、第八位是1,从机认为它已经作为发送器被寻址,并产生应答A3。从机继续保持被寻址,直到收到停止(P)或重启(Sr)信号。由于重启(Sr)后的第一个寻址字节的第八位(R/W)是R(1),所以其他从机都不会被寻址。
图1-33 10位从机地址从发主收模式
3.2.14 特殊保留地址
一共有8个 特殊地址被保留,其特殊作用如下:
图1-34 特殊保留地址
X =不在乎;1 =高;0 =低电平。
这些特殊地址的分配由芯片设计制造厂商来决定。
备注:
[1]广播呼叫地址用于多种功能,包括软件复位。
[2]不允许任何器件在收到启动字节时做出应答。
[3]CBUS地址已被保留,以允许在同一系统中混合使用CBUS兼容和I2C总线兼容的设备。不允许I2C总线兼容设备在接收到该地址时做出响应。
[4]包含为不同总线格式保留的地址,以使I2C和其他协议能够混合使用。只有I2C总线兼容的设备可以使用这样的格式和协议来响应这个地址。
3.2.15 广播呼叫地址
广播呼叫地址(0000 0000)用于主机同时寻址连接到I2C总线的每个从机。
主机启动I2C总线后,第一字节首先发送广播呼叫地址(0000 0000),如果某些从机不需要被呼叫寻址,它可以通过不应答(NACK)来忽略这个地址。如果某些设备确实需要传输数据,它就发送应答(ACK)信号来确认这个地址并作为一个从机接收器。如果一个或多个从机做出应答响应,主机实际上并不知道有多少从机进行了应答。第二个字节及以后的字节由每个能够处理该数据的从机接收器接收并确认。不能处理这些字节的从机必须通过不应答(NACK)来忽略它(如图1-35)。
图1-35 广播呼叫地址格式
主机紧接着发送第二个字节,第二个字节是控制地址,是表示呼叫目的和含义的字节,其具体含义如下
1)第二字节第八位B=0时(如图1-35),含义如下:
①0000 0110 (06h):从机硬件复位和写数据到从机内部存储空间。从机接收到第一字节和本字节序列后,被寻址的所有从机复位,并接收主机接下来发送的数据,存入自己内部存储空间(内部存储空间地址具体规范由从机规格书给出)。注意,确保从机在刚开始施加电源电压后不会拉低SDA或SCL线,因为这些低电平会阻塞总线。
②0000 0100 (04h):写数据到从机内部存储空间。过程如上,但不会复位硬件。
③0000 0000 (00h):此代码不允许用作第二个字节。
④除了以上三个字节数据定义外,其余的字节数据定义官方尚未更新添加,设备必须忽略它们。具体的软件编程要求在相应的设备器件数据表中有详细规定。
2)第二字节第八位B=1时(如图1-36),含义如下:
图1-36 广播呼叫地址第二字节第八位B=1时的含义
当第二字节的第八位B=1时,前七位表示主机自己的地址,这种序列组合表示“硬件广播”。从机接收到第一字节和本字节序列后,被寻址的所有从机将第二字节的前七位标识备案为主机的地址。如果这个主机同时也具有从机的功能的话,则该主机可以转换到从机身份,其从机地址就是已备案的七位地址,该转换后的从机身份及从机地址受到其他主机的控制。
例如键盘,由于键盘扫描仪不知道连接的设备到底是谁,所以以主机的身份发送第一字节“00000000”和第二字节“xxxxxxx1”组合序列,发起硬件广播,被呼叫寻址的从机登记备案键盘的7位地址,然后身份互换,键盘转为从机,原来从机转换为主机,现在的主机把7位键盘的地址作为从机地址寻址键盘,从而控制键盘和从键盘获取键值,当然这些身份转换的设备要同时具备主机和从机的功能。
3.2.16 软件复位
在一个广播呼叫(0000 0000)之后,发送0000 0110 (06h)作为第二个字节会导致从机软件复位。此功能是可选的,并非所有设备都响应此命令。从机接收到上述2字节序列后,被寻址的所有从机复位,并接收主机接下来发送的数据,存入自己内部存储空间(内部存储空间地址具体规范由从机规格书给出)。注意,确保从机在刚开始施加电源电压后不会拉低SDA或SCL线,因为这些低电平会阻塞总线。
3.2.17 启动字节
单片机可以通过两种方式连接到I2C总线。第一种方式:单片机片上集成了I2C总线硬件接口,程序员可以配置内部I2C寄存器,单片机内部中断会自动响应I2C总线的请求,读写速度快。第二种方式:单片机片上没有集成了I2C总线硬件接口,它必须通过软件仿真模拟I2C的时序,持续监控总线。显然,单片机监控或轮询总线的次数越多,它执行预定功能所花费的时间就越少,CPU开销就大,响应速度就慢。
因此,有I2C硬件接口的快速设备和依赖于软件轮询的相对较慢的单片机之间存在速度差异。有这样一种使用场景,没有I2C接口的单片机为节约CPU开销,以低速方式轮询I2C总线,具有I2C总线接口的单片机发送启动字节(启动字节是专门满足设备慢速轮询而设计的握手同步的特殊字节序列),当收到启动字节的轮询单片机在收到接下来的重启(Sr)信号后,便开始提高通信速率,以响应高速器件的数据传输。也就是说,没有I2C总线接口的单片机,I2C总线上空闲时就以低速轮询的方式去监控总线,以节约CPU开销,当检测到I2C总线上有设备发送了启动字节,就以低速轮询的方式接收到了启动字节,随即提高自己的轮询速率,开始高速轮询响应来自高速设备的数据传输,在接收完数据并接收到停止信号后,又以低速轮询方式去检测总线。
启动字节程序就是高低速器件在数据传输之前可能会有一个比正常情况长得多的启动程序(参见图1-37)。启动字节程序包括::①开始条件;②一个起始字节(0000 0001);③不应答时钟脉冲(NACK);④重复起始条件(Sr)。
图1-37 启动字节程序
具有I2C硬件接口的单片机发送启动(S)信号后,再发送起始字节(0000 0001)。因此,另一个单片机可以以低采样速率对SDA线路进行采样,只要检测到起始字节中的七个“0”当中的一个“0”,该单片机就可以切换到更高的采样速率,在收到接下来的重启(Sr)信号后,然后就和高速单片机同步了。
在起始字节后有一个应答相关的时钟脉冲,但不允许任何器件应答(ACK),这只是为了符合总线上使用的字节处理格式罢了,从机不应答(NACK)即可。
3.2.18 总线清除
总线清除指的是清除总线被卡死在低电平的故障,使其恢复正常状态。
在极少数情况下, 如果SCL时钟总线被卡在低电平(长时间陷在低电平状态),对其正确的处理方式为:①如果您的I2C设备有硬件复位输入,那么首先使用硬件复位信号复位I2C总线。②如果I2C设备没有硬件复位输入,则重启电源供电以强制激活设备内部硬件上电复位(POR)电路,实施开机复位I2C总线状态机。
在极少数情况下,如果SDA数据总线被卡在低电平(长时间陷在低电平状态),对其正确的处理方式为:①主机应发送9个时钟脉冲,将SDA总线保持在低电平的设备应该会在这9个时钟周期内的某个时间将其释放。②如果9个时钟周期内没有释放,则使用硬件复位或重启电源复位来清除总线。
3.2.19 设备ID
在出厂前,芯片制造商将设备ID(身份编码)存储在芯片内部的只读存储空间,设备ID包含内容如下(如图1-38所示):
① 12位芯片制造商名称编码,每个制造商都是唯一的(例如“0000 0000 0000”代表恩智浦)。
② 9位芯片器件标识码,芯片制造商分配(例如AT24C02)。
③ 3位芯片版本,由制造商指定(例如RevX)
图1-38 设备ID域
设备ID是只读的,在设备中是硬连线的,可以通过以下方式访问(参考图1-39):
①主机发送启动(S)信号。
②主机发送设备ID(特殊保留的)地址 “1111 1000”,最后一位R/W位一定要为“0”,表示“写”操作;可能有多个从机应答。
③主机发送从机设备地址。此时,代表传输方向LSB位无关紧要,“0”或“1” 均可。只有一个从机设备必须应答该字节。
④主机发送重启(Sr)信号。注意:启动(S)信号会重置从机,并且无法执行设备ID读取。此外,停止(P)或重启(Sr)后访问另一个从机设备也会重置原来的从机,并且无法执行设备ID读取。
⑤主机发送设备ID(特殊保留的)地址 “1111 1001”,最后一位R/W位一定要为“1”,表示“读”操作。
⑥主机接收完设备ID第一个字节并应答,然后接收完设备ID第二字节并应答,最后接收设备ID第三个字节。注意:以上读取的三个字节就是设备ID,包含 12个制造商位(第一个字节+第二个字节的4个MSB)、9个器件标识位(第二个字节的4个LSB+第三个字节的5个MSB)、3个芯片版本位(第三个字节的3个LSB)。
⑦主机通过不应答最后一个字节来结束读取操作,从而重置从机状态机,从机转为等待主机发送停止(P)信号的状态。备注:主机通过发送NACK,可以随时停止读取设备ID的操作。如果主机在收到第三个字节后继续应答,从机就回滚到第一个字节,并继续重复发送设备ID序列,直到检测到NACK。
图1-39 设备ID域读操作
分配的芯片设备制造商ID编码如图1-40和如1-41所示:
图1-40 I2C设备制造商ID表
图1-40 I2C设备制造商ID表(续)
未完待续,请继续关注《彻底搞懂IIC总线(3)I2C总线电气规范和传输时序》。
本文由德力威尔王术平原创;转载、引用请注明出处,否则侵权。
本文参考资料:
①https://www.nxp.com/docs/en/user-guide/UM10204.pdf。
②https://www.nxp.com/docs/en/application-note/AN10216.pdf。
④NXP UM10204(I2C-bus specification and user manual Rev.7.0 -1 October 2021)。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)