[I2C]I2C通信协议详解(一)

您所在的位置:网站首页 IIC总线协议的寻址 [I2C]I2C通信协议详解(一)

[I2C]I2C通信协议详解(一)

2023-08-23 22:16| 来源: 网络整理| 查看: 265

[I2C]I2C通信协议详解(一) --- 什么是I2C

       摘要:内部集成电路()I2C(Inter-Integrated Circuit)总线是一种两线串行接口,最初由菲利普斯公司开发,用于消费产品。 它是一种双向总线,可在任何 IC 工艺(NMOS、CMOS、双极)中轻松实现,并允许简单的 IC 间通信。 通过使用串行数据线 (SDA)、串行时钟线 (SCL) 和公共地线来承载所有通信,可以最大限度地减少连接。 I2C 已获得广泛认可,甚至已作为 I2C 子集的系统管理总线 (SMBus) 的原型。它是由Philips(飞利浦)公司,现NXP(恩智浦)半导体开发的一种简单的双向两线制总线协议标准。I2C的基本参数:

       I2C协议可以工作在以下5种速率模式下,不同的器件可能支持不同的速率(bps:bit/s,即SCL的频率)。其中超快模式是单向数据传输,通常用于LED、LCD等不需要应答的器件,和正常的I2C操作时序类似,但是只进行写数据,不需要考虑ACK应答信号。

标准模式(Standard):100kbps快速模式(Fast):400kbps快速模式+(Fast-Plus):1Mbps高速模式(High-speed):3.4Mbps超快模式(Ultra-Fast):5Mbps(单向传输)

       I2C协议最基础的4种信号,分别是:起始、停止、应答和非应答信号。SCL处于高电平时,SDA由高到低变化,这种信号是起始信号。SCL处于高电平,SDA由低到高变化,这种信号是停止信号。数据的采样发生在SCL高电平期间,除了起始和停止信号,在数据传输期间,SCL为高电平时,SDA必须保持稳定,不允许改变,在SCL低电平时才可以进行变化。

       I2C最大的一个特点就是有完善的应答机制,从机接收到主机的数据时,会回复一个应答信号来通知主机表示“我收到了”。应答信号出现在1个字节传输完成之后,即第9个SCL时钟周期内,此时主机需要释放SDA总线,把总线控制权交给从机,由于上拉电阻的作用,此时总线为高电平,如果从机正确的收到了主机发来的数据,会把SDA拉低,表示应答响应。

一、设计

       I2C 通信协议遵循主/从层次结构,其中主设备定义为为总线提供时钟、寻址从设备以及向从设备中的寄存器写入或读取数据的设备。 从设备是仅在主设备通过其唯一地址询问时才做出响应的设备。 因此,必须避免从站之间的地址重复。 从站从不启动数据传输。

       I2C 总线仅使用两条双向线,串行数据线 (SDA) 和串行时钟线 (SCL)。 I2C 兼容设备通过集电极开路或漏极开路引脚连接到总线,这些引脚将线路拉低。 当I2C没有数据传输时,总线处于HIGH状态空闲; 线被被动拉高。

       通过拉低和释放高来切换线路来进行传输。 位在时钟下降沿计时。 标准数据传输速率为 100kbits/s,而快速模式传输速率为 400kbits/s。

       I2C 总线可以支持多个设备,包括 SLAVE 和 MASTER,唯一的限制是总线上的电容 (400pF) 和地址空间(128 个唯一地址),因为添加了更多设备。

二、数据传输协议

       I2C 数据包以 8 位字节排列,包括从机地址、寄存器号和要传输的数据。 总线上的传输是读操作或写操作。 读写协议建立在一系列子协议之上,例如开始和停止条件、重复的起始位、地址字节、数据传输位和确认/不确认位。

三、开始与结束条件

       顾名思义,开始条件总是在传输开始时出现,并由主设备启动。 这样做是为了唤醒总线上空闲的 SLAVE 设备。 这是 SCL 为高电平时允许 SDA 线改变状态的两次之一。 为了表示开始条件,SDA 线从高状态转换为低状态,而 SCL 为高。

       与开始条件类似,停止条件发生在数据传输结束时,也是由 MASTER 生成的。 这表示传输结束,是一个命令告诉从设备它们应该回到空闲状态,释放 SDA 线并且不再在总线上发送任何数据。 这是在 SCL 为高电平时允许 SDA 线更改状态的第二个实例。 SDA 线从低电平转换到高电平状态,而 SCL 为高电平,表示停止条件。

       在所有其他条件下,SDA 线仅在 SCL 线为低电平时更改状态。

四、重复启动

       在传输期间可以重复开始条件,而无需首先以停止条件终止。 这是一种特殊情况,称为重复启动,用于更改数据传输方向、重复传输尝试、同步多个 IC,甚至控制串行存储器。

五、地址字节

       从机地址以 8 位字节格式发送,MSB 在前,但最后一位表示事务是读取还是写入从机。实际上,高 7 位构成从地址,而第 8 位用作 READ/WRITE# 命令位。因此,有一个由 128 个唯一地址组成的地址空间,用于寻址多达 128 个从站。很多时候。

       例如,在启动条件之后,MASTER 发送一个地址字节,该地址字节对应于总线上 SLAVE 设备的唯一地址。总线上的每个设备都有自己的固定地址或编程地址。 I2C 总线上的 SLAVE 通过主动监听发送的第一个字节的前 7 位来响应启动命令。如果前 7 位与 SLAVE 设备的地址匹配,则继续读取地址字节的第 8 位(READ/WRITE# 位)。所有其他 SLAVE 设备忽略事务的其余部分。 READ/WRITE# 位中的低电平表示 MASTER 将向寻址的 SLAVE 设备写入数据,而对于高电平,MASTER 将从 SLAVE 设备读取数据。一旦地址字节已被相应的 SLAVE 读取,它将通过在相邻时钟高电平脉冲周期内将 SDA 拉低来发送确认位来确认此传输,然后根据 READ 承担从机发送器或从机接收器的角色/WRITE# 位已发送。

       从这一点开始,除非发送停止位,否则 SLAVE 假定由于它已经被寻址,所有通信都指向它。

六、Acknowledge and Not Acknowledge Bits (ACK/NACK)

       作为反馈的一种形式,在每个字节传输之后,接收设备发送一个确认或不确认位。 接收器通过在 SCL 高电平期间将 SDA 线保持为低电平来生成一个确认位,而当接收器离开 SDA 线被动拉高且不以任何方式响应时,将生成一个非确认位。 这一事实意味着,为了响应地址字节,所有不匹配的 SLAVE 都会通过不响应来发送 Not Acknowledge 位。

       ACK 用于表示一个字节(地址或数据)已成功传输和接收,并且传输可以继续到下一个字节传输、停止条件或重复开始(图 4)。 接收端通常使用 NACK 来指示数据传输中某处是否发生错误。 这用于向发送设备发出信号以立即终止传输或通过发送重复开始来进行另一次尝试。

       MASTER 还将在它想要从 SLAVE 读取的传输的最后一个字节之后发送 NACK,以指示 SLAVE 应该停止传输。 

       非应答信号可能是主机产生也可能是从机产生,产生非应答信号的情况主要有以下几种:

I2C总线上没有主机所指定地址的从机设备从机正在执行一些操作,处于忙状态,还没有准备好与主机通讯主机发送的一些控制命令,从机不支持主机接收从机数据时,主机产生非应答信号,通知从机数据传输结束,不要再发数据了

七、数据位

       数据位(SDA)对实际传输数据进行编码,以 8 位字节格式传输,从 MSB 开始,每个位与时钟信号(SCL)同步。 传输中的字节数没有限制,但每个字节后面必须有一个由数据接收者生成的确认。

       对于位传输,SDA 线上的数据必须在高时钟周期内保持稳定。 只有当时钟信号为低电平时,才允许数据线有一个高电平或低电平的跳变。 因此,接收器在 SCL 为高电平时读取数据线上的数据位,而发送器在 SCL 为低电平时断言每个新数据位。

八、命令字节

       当写入或读取 SLAVE 中的特定寄存器时,主机必须首先通过在 SLAVE 被寻址后写入寄存器地址来指向特定寄存器。 虽然寄存器地址可以被认为是一个数据字节,但为了避免混淆,它通常被归类为命令字节。 例如,请参见图 6 和图 7。

九、写入设备

       图 6 显示了一个 MASTER 发送器寻址并将数据写入一个 7 位地址的 SLAVE 接收器。 发送的第一位是启动通信的 START 位。 地址字节跟随在随后的时钟脉冲上。 此时,总线上的所有 SLAVE 设备都在侦听它们的设备地址,该地址构成地址字节的前 7 位。 找到地址匹配的 SLAVE 设备继续侦听最后一位(READ/WRITE# 位)以了解主设备是要从从设备读取还是向其写入。 所有其他 SLAVE 设备通过发送 NACK 来忽略进一步的通信,根据定义,这不会做任何事情。

       响应识别其地址和写入命令,被寻址设备通过发送确认位 (ACK) 作为对主设备的响应,即总线上存在具有正确地址的从设备并等待进一步通信。 MASTER 然后通过以字节格式发送数据来继续数据传输。 如果 MASTER 正在写入 SLAVE 设备中的特定寄存器,则它会在发送数据之前写入相应的命令字节。 在每个字节传输之后,SLAVE 通过发送 ACK 进行响应。 一旦 MASTER 完成传输所有数据,它会通过发送 STOP 条件终止传输。 

十、从设备读取数据

       图 7 显示了一个 MASTER 寻址一个 SLAVE 并尝试从中读取数据。 传输由 MASTER 再次以 START 条件启动,之后在后续时钟脉冲上传输地址。 寻址设备通过读取 READ/WRITE 位继续侦听传输,并以确认位响应。 一旦 SLAVE 发送确认,它就接管 SDA 的控制并向 MASTER 发送数据。 为响应每个发送的字节,MASTER 发送一个确认位。 当 MASTER 不再想要接收数据时,它会在它希望接收的最后一个字节之后以 NACK 响应,然后恢复对总线的控制并发送 STOP 条件以结束传输。

       请注意,虽然 SDA 线的控制从 MASTER 传递到 SLAVE 并返回,但 SCL 线始终在控制 MASTER,即数据始终由 MASTER 输入和输出。

十一、10 bit地址传输

       随着IIC设备日益增多,7位的从机地址逐渐不能满足使用,于是从机地址从7位扩充到了10位。7位和10位地址的设备可以共存于同一个I2C总线系统互不冲突,展现了良好的兼容性。   10-bit 地址的I2C设备需要 2-Byte 来传输从设备地址信息,所以采用了这样的设计:第一个字节为 1111 0 + 地址高两位(第10、9bit) + 读写控制位,第二个字节为从设备地址低8位,除此之外与7-bit设备相同。因为 “1111 0xx” 为 IIC 中特地保留的16个特殊指令地址中的一个,所以7-bit设备不会响应该首字节的呼叫,只有10-bit设备会响应,从而实现良好兼容。

10-bit 设备的写,10-bit设备的写过程如下图示例,除地址部分外与7-bit相同。

10-bit 设备的读,需注意的是,第二次通信过程无需再次发送第2Byte地址

十二、结合传输协议

       可以组合不同变体的读取和写入协议来执行一些复杂的 I2C 事务。 MASTER 可以写入,然后从同一个从设备读取,或者在单个 I2C 事务中提供一个新地址以与不同的 SLAVE 设备通信,数据可能会改变方向,使得正在写入的设备现在正在读取数据。所有这些都是通过使用重复启动位来完成的。

       例如,可以命令作为能量监视器的 LTC2946 从特定寄存器输出数据。这需要 I2C 事务首先寻址 LTC2946,发送命令字节(包含要读取的特定寄存器地址的数据字节),执行重复启动,再次发送器件地址并设置 READ 位,然后读出数据。在这个事务中,首先主控器写入 LTC2946,告诉它它想从哪个寄存器读取数据,然后当主控器执行重复启动并在从地址字节中设置 READ 位时,数据的方向流发生了变化。图 8 摘自 LTC2946 数据表,显示了这种通用协议。

 上表中:

S = Start BitP = Stop BitR = Read BitW\ = Write BitA = AcknowledgeA\ = Not Acknowledge

       图 9 显示了在 LTC2946 中写入寄存器的示例。 在启动条件之后,发送设备地址,然后将命令字节写入从机(注意 READ/WRITE# 位)。 一旦从机确认,数据将写入从机。 

       同样,图 10 展示了一个示例,其中主设备写入两个不同的从设备。 

十三、未涉及的内容

       还有其他 I2C 协议,例如快速命令、扩展地址模式、仲裁、多主机和时钟延长,我们在本文中没有涉及。 这些主题超出了本博文的讨论范围,并且不需要开始与支持 I2C 的 LTC 设备进行通信。 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3