I2C 总线:固件实现细节

您所在的位置:网站首页 单片机i2c总线协议 I2C 总线:固件实现细节

I2C 总线:固件实现细节

#I2C 总线:固件实现细节| 来源: 网络整理| 查看: 265

I2C 总线:固件实现细节

出处:网络整理 发布于:2023-05-09 16:36:33

通过 I2C 通信的设备必须符合特定的事件序列。每个事件对应于控制时钟(SCL)和数据(SDA)线的某种方式;正如上面列出的“支持信息”文章中所讨论的,这两个信号是总线上的设备可以共享信息的方式。我们将一个通信序列称为“事务”;这个词比“传输”更合适,因为每个事务都涉及传输数据和接收数据,但在某些情况下,接收的数据是主机检测到的确认 (ACK) 或非确认 (NACK) 位。下面的时序图显示了一个典型的 I2C 事务。

请注意以下事项:

与时钟的逻辑高电平部分对应的虚线提醒我们逻辑高电平(对于 SCL 和 SDA)是“隐性”状态——换句话说,信号通过上拉电阻自然地上升到逻辑高电平. “显性”状态是逻辑低电平,因为只有当设备实际将其驱动为低电平时,信号才会为低电平。事务以“起始位”开始。每个 I2C 事务都必须以起始位开始,该位定义为 SDA 上的下降沿,而 SCL 为逻辑高电平。事务以“停止位”结束,定义为 SDA 上的上升沿,而 SCL 为逻辑高电平。I2C 事务必须以停止位结束;但是,如本文后面所述,在生成停止位之前可能会出现多个起始位。时钟高时数据有效,时钟低时改变状态;数字通信系统通常是边沿驱动的,因此实际上数据在时钟的上升沿读取并在时钟的下降沿更新。信息一个字节地交换,从有效位开始,每个字节后跟一个 ACK 或 NACK。您可能希望 ACK 由逻辑高指示,NACK 由逻辑低指示,但事实并非如此。ACK 为逻辑低电平,NACK 为逻辑高电平。这是必要的,因为高电平是隐性状态——如果从机不起作用,信号自然会上升到 NACK。同样,ACK(由显性逻辑低表示)只有在设备可操作并准备好继续事务时才能传输。

以下列表描述了上述交易中的事件顺序:

主机生成一个起始位来启动事务。主机发送对应于它要与之通信的从机的 7 位地址。个字节段的一位是读/写指示符。如果主机想从从机读取数据,则主机将此位设置为逻辑高电平,如果要向从机写入数据,则将此位设置为逻辑低电平。下一个字节是个数据字节。这来自主机或从机,具体取决于读/写位的状态。像往常一样,我们有 8 位数据,从有效位开始。数据字节后跟一个 ACK 或 NACK,如果这是一个读事务,则由主机生成,如果这是一个写事务,则由从机生成。ACK 和 NACK 可能表示不同的含义,具体取决于通信设备的固件或低级硬件设计。例如,主机可以使用 NACK 表示“这是一个数据字节”,或者如果从机知道要发送多少数据,它可以使用 ACK 来确认数据已成功接收。事务以主设备生成的停止位终止。多少字节?

每个事务都以相同的方式开始:起始位、地址、读/写、ACK/NACK。之后,可以从主机向从机或从机向主机发送任意数量的字节,每个字节后跟 ACK 或 NACK。NACK 可以用作“停止发送数据!”的一种方式。例如,主设备可能希望从从设备(例如温度传感器)接收连续的数据流;每个字节后面都会跟着 ACK,如果主机需要将注意力转移到其他事情上,它可以 NACK 从机并在它准备好时开始新的事务。

不停地开始

I2C 协议允许所谓的“重复启动”条件。当主机用一个起始位启动一个事务,然后在没有中间停止位的情况下通过另一个起始位启动一个新事务时,就会发生这种情况,如下所示:

只要单个主机需要执行两个或多个单独的事务,就可以使用此功能。但是,有一种情况重复启动条件特别好用:

假设您有一个从属设备,它将信息存储在一组寄存器中。您想要从寄存器地址 160,十六进制的 0xA0 中检索数据。I2C 协议不允许主机在单个事务中发送数据和接收数据。因此,您必须执行写入事务来指定寄存器地址,然后执行单独的读取事务来检索数据。但是,这种方法可能会导致问题,因为主机会释放总线在个事务结束时,因此另一个主控可以占用总线并阻止个主控获得它需要的数据。此外,第二个主机可能与同一个从机通信并指定不同的寄存器地址。. . 如果个主控然后在没有重新指定寄存器地址的情况下声明总线并读取数据,它将读取错误的数据!如果第二个主机然后尝试在其先写后读过程中执行读取事务,它也将以错误数据结束!这是等待发生的系统故障——幸运的是,重复启动条件可以通过启动第二个(读取)事务而不 释放总线来防止这种混乱:

当大师无法相处时

使 I2C 如此通用的部分原因是它支持多个主机。但正如上一节所展示的,高手并不总是能很好地相处。设备的 I2C 逻辑必须能够确定总线是否空闲;如果另一个主设备已占用总线,设备将等待当前事务结束,然后再启动自己的事务。但是当两个(或更多)master 试图同时发起一个事务时会发生什么?I2C 为这个令人厌烦的问题提供了一种有效且简单得惊人的解决方案。该过程称为“仲裁”,它依赖于 I2C 开漏总线配置的灵活性:如果一个主机试图将信号驱动为逻辑高电平而另一个尝试将信号驱动为逻辑低电平,则逻辑低主机将“获胜, ” 而且,

该图传达了 I2C 仲裁的基础;该过程发生如下:

两个主机都生成一个起始位并继续进行传输。如果大师们碰巧选择了相同的逻辑电平,则什么也不会发生。一旦主机尝试施加不同的逻辑电平,将信号拉低的主机就被宣布为赢家;失败者检测到逻辑不匹配并放弃其传输。

花点时间欣赏一下这种安排的简单性和有效性:

赢家继续传输而不中断——没有损坏的数据,没有驱动程序争用,不需要重新启动事务。从理论上讲,失败者可以在仲裁过程中监视从机地址,如果恰好是被寻址的从机,则实际上可以做出适当的响应。如果竞争的主机都向同一个从机请求数据,则仲裁过程不会不必要地中断任何一个事务——不会检测到不匹配,并且从机会将其数据输出到总线,以便多个主机可以接收它。结论

本文涵盖了影响固件或低级硬件设计的重要 I2C 细节。如果您的微控制器包含专用 I2C 或 SMBus 硬件,一些实现细节将自动处理。这很方便,但肯定不是无知的借口,因为您仍然需要至少了解一点(可能不止一点)I2C 的真正工作原理。此外,如果您发现自己被困在没有 I2C 外设的荒岛上,此处提供的信息将帮助您顺利设计仅固件(也称为“位碰撞”)I2C 例程。

关键词:I2C 总线

上一篇:接地环路简介

下一篇:CAN总线如果不加终端电阻会发生什么?

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

相关技术资料 CAN总线如果不加终端电阻会发生什么?2023/5/10 16:53:54 接地环路简介2023/5/5 15:39:57 接地简介:地球接地、公共接地、模拟接地和数字接地2023/4/26 16:14:45 如何计算高速 RS-485 收发器的功率损耗2023/4/25 15:48:25 CAN总线的8种常见故障及解决方法2023/4/13 15:45:55


【本文地址】


今日新闻


推荐新闻


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