I2C(IIC)的仲裁、时钟同步和时钟扩展

这篇具有很好参考价值的文章主要介绍了I2C(IIC)的仲裁、时钟同步和时钟扩展。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

I2C(IIC)的仲裁、时钟同步和时钟扩展

注意,CSDN以及博客园上有大量抄袭和以讹传讹的情况,注意鉴别。

本文参考了Philip的I2C specification以及wiki pedia,并且通过实践验证。

阅读本文要求你已经对i2c的协议有基本的了解。我们将会着重介绍多主机模式(multi-master)下的仲裁(arbitration),仲裁时不同主机之间的时钟同步(clock synchronization),以及从机(slave)动态调整通信速率的措施时钟扩展(clock stretching)

仲裁

发生仲裁的前提是,一条总线上挂载了多个主机,并且这些主机都支持多主机模式,即每一个主机都可以实时监测SDA以及SCL的情况,从而通过start和stop位来确定总线的情况(被占用还是空闲)。当多个主机检测到当前总线处于空闲状态时(这里以2个主机为例),可能会同时发出启动标志位(发出的时间间隔很短,因此无法检测到其他节点产生的电平变化,误认为总线是空闲的),这时候仲裁机制开始生效。

总线归属权的仲裁是通过SDA线完成的。由于I2C的总线设计是线与(wired-AND),因此低电平是显性电平。只要有一个节点将SDA拉低,那么整条总线都会拉至低电平。在两个主机都认为总线空闲并开始通信之后,当遇到第一个两者发送的不同的位时,会决出总线的归属者。

直接举例。设主机1将向address为0b10100111的从机发送数据,主机2将向addres为0x10101000的从机发送数据。两者都占有总线并同时向SDA写入数据。注意I2C发送的顺序是MSB->LSB(先发送高位)。两者的前四位数据相同,而当发送进行到第五个时钟周期时,master1的第五位为0,而master2的第五位为1,此时根据线与特性,SDA总线的电平会被master1拉低。master2会检测到自己要发送的电平和总线的实际电平不符,从而获知有其他主机正在发送,随之停止后续的发送,让出总线的归属权。

若两主机向相同的地址写入数据,那么仲裁过程将继续,直到在后续的数据位中决出总线的归属权(仍然是通过上述的方法)。

P.S. 仲裁不能发生在start和stop段,否则行为是未定义的。即倘若两个主机向相同的地址写入相同的数据,那么并不能决出总线的归属权。在这时,一个主机发出stop结束通信,而另一个主机则发出restart开始新的通信,这时候的行为就是未定义的。详见I2C-bus specification and user manual的第十二页:

i2c,clock stretch波形,了解嵌入式开发和RoboMaster电控组,单片机,网络,嵌入式硬件,iic i2c,总线

I2C的仲裁是通过采样SDA完成的,因此不会破坏数据的有效性,通信不会停止,也不会有数据帧丢失。但是I2C不具有主机优先级的设定,因为总线的归属权是根据主机发送的数据确定的,因此无法提前为每个主机设定发送或接收的优先级。

时钟同步

时钟同步只会在仲裁时发生。SCL是由主机产生的时钟信号,用于和从机确定数据发送和采样的时间点。倘若处在仲裁期间,会有多个主机同时发送往SCL上发送时钟信号。两个主机配置的通信速率可能不同,因此时钟频率必然不同;即使配置了相同的通信速率,两者开始发送数据的时间也不同。此时时钟信号具体如何确定就要通过clock synchronization的机制。

在总线空闲的时候,SCL被上拉电阻拉高。开始通信后,主机的时钟信号接入SCL中。如下图所示,有两个主机(时钟信号分别为CLK1和CLK2)都认为主机空闲,因此开始将时钟信号输入SCL。同步分为以下五个阶段:

  1. CLK1率先变为低电平,由于线与特性CLK2也变成低电平。
  2. 但是CLK2的低电平时间更长(时钟周期更长,CLK1的周期更短),即使主机1内部的CLK1已经变成高电平,SCL的实际电平仍然和CLK2保持一致。此时,主机1将会检测到这一情况,并从此时开始计数(计算低电平持续的时间,即下图中的wait state,稍后用)
  3. CLK2迎来高电平之后,主机1内部的wait state结束,因为两者都为高,因此SCL总线进入高电平,两个主机内部都会开始对高电平持续的时间进行计数。
  4. 随后,CLK1会比CLK2先回到低电平(此时CLK1的周期仍然比CLK2更短)。
    i2c,clock stretch波形,了解嵌入式开发和RoboMaster电控组,单片机,网络,嵌入式硬件,iic i2c,总线
虚线框表示CLK2原本的波形
  1. 现在,CLK1以及获得了需要延长的低电平时间,CLK2也获得了需要减短的高电平时间(都是通过刚才的计数获得的),两个主机会根据之前的计数重新调整自己的时钟周期,从而完成时钟同步。

例如,在时钟同步之前,主机1的速度为400kbit/s(fast mode),主机2的速度为100kbit/s(standard mode),同步之后,速度都会变为100kbit/s。如果两者的通信速率本就相同,但也会因为CLK的开始时间不一样而出现错位,这同样会通过时钟同步而矫正。

其他的教程中常出现一句话叫:“同步之后的时钟,低电平的时间取决于低电平最长的CLK,高电平时间取决于高电平时间最短的CLK”,描述的实际上就是I2C总线的线与特性。通过线与的特性以及I2C对SCL的持续检测(采样),我们就可以实现时钟同步了。

关于时钟同步的原始描述,可以参见I2C-bus specification and user manual的第11页。

时钟扩展

和其他常见的通信方式相比,I2C可以动态地调整总线的通信速率,这是通过时钟扩展(clock stretchign)完成的。

同样,时钟扩展需要I2C的硬件支持,其主机和从机都需要相关的硬件才可以实现这一功能。

虽然我们已经设定了I2C的通信速率(如标准模式,快速模式,高速模式等),但支持时钟扩展的I2C硬件可以根据情况动态改变通信速率。时钟扩展是由从机发起的。如从机正在处理其他任务无暇接收数据,或上一次收到的数据还没来得及写入或转移到其他地方时,就可以在收到一个byte的数据之后主动将SCL拉低(此时尚未发送ACK给主机),主机会检测到SCL的变化,进入等待状态(wait state),此时主机便会停止数据的发送,直到检测到SCL被释放(I2C的两条总线都是接了上拉电阻,默认为高电平,因此称回到高电平为“释放”)并收到释放之后的ACK信号。文章来源地址https://www.toymoban.com/news/detail-780121.html

到了这里,关于I2C(IIC)的仲裁、时钟同步和时钟扩展的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • USB转SPI USB转IIC 串口转SPI串口转IIC SPI I2C模块

            一款支持USB转SPI、USB转I2C、USB转GPIO、USB转PWM、USB转ADC的模块。提供上位机工具,开发协议。 资料下载, 链接:https://pan.baidu.com/s/1sw3RCMwjhrMO4qzUBq9bjA     提取码:qzjp         串口转多协议模组为了客户调试一些功能简单化,目前有串口转GPIO、串口转PWM、串口

    2024年01月18日
    浏览(43)
  • 什么是I2C,I2C怎么用,从实例波形分析I2C读写

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 今天分享的主题是I2C通信。接下来从I2C是什么,怎么用,以及以时钟外设读写作为实例进行分析。 I2C(Inter-Integrated Circuit) ,也可以叫IIC、I2C,译作集成电路总线,是 两线式串行通信总线 ,用于设备

    2024年01月19日
    浏览(57)
  • I2C知识大全系列四 —— I2C驱动之Linux下的I2C

    Linux 系统定义了 I2C 驱动体系结构。在 Linux 系统中, I2C 驱动由三部分组成,即 I2C 核心 、 I2C 总线驱动 和 I2C 设备驱动 。这三部分相互协作,形成了非常通用、可适应性很强的 I2C 框架。 I2C核心 I2C 核心提供了 I2C 总线驱动 和 设备驱动 的 注册 、 注销方法 , I2C 通信方法

    2024年02月07日
    浏览(56)
  • I2C总线 | I2C总线介绍

    目录 I2C 总线 | I2C 总线介绍 I2C 总线介绍 I2C有如下特点: I2C 总线术语 I2C 总线位传输 IIC总线数据传输 1.字节格式 2.应答响应 IIC 总线寻址方式 1.7位寻址 2.10位寻址 快速和高速模式 1.快速模式 2.高速模式 I2C ( Inter - Intergrated Circuit )总线(也称 IIC 或 I2C )是由 PHILIPS 公司开发

    2024年02月04日
    浏览(53)
  • 【STM32 CubeMX】I2C层次结构、I2C协议

    在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,广泛应用于连接各种外设和传感器。理解I2C的层次结构、协议和硬件结构对于STM32微控制器的开发至关重要。通过STM32 CubeMX提供的图形化配置工具,我们能够更轻松地理解和配置I2C通信,同时深入了解

    2024年02月22日
    浏览(76)
  • 【I2C 通信的工作原理是什么?Arduino 和 I2C 教程】

    在本教程中,我们将了解 I2C 通信协议的工作原理,我们还将使用 Arduino 板和使用该协议的传感器制作一个实际示例。您可以观看以下视频或阅读下面的书面教程。 I2C通信总线非常流行,并被许多电子设备广泛使用,因为它可以很容易地在许多需要主设备与多个从设备甚至多

    2024年02月05日
    浏览(36)
  • I2C用法和MSP430F5299上的I2C

    1. 二线传输; 2. 无中心主机; 3. 软件寻址; 4. 应答式数据传输过程; 5. 节点可带点接入或撤出; 6. IIC的SCL和SDA都需要接上拉电阻,保证空闲状态的稳定性; 由主机发出起始信号和停止信号。 起始信号: 当SCL保持为高电平时,SDA产生一个下降沿,则代表起始信号; 停止信

    2024年02月13日
    浏览(48)
  • STM32F103基于标准库+I2C SSD1306仿数码管RTC时钟显示

    ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取。 🍁对于文中所提供的相关资源链接将作不定期更换。 📺显示效果: 🌿工程基于正点原子标准库3.5版本RTC例程作为模板。 🌿使用IIC SSD1306 OLED 双色屏幕软件IIC驱动显示。 ⛳时钟说明

    2023年04月22日
    浏览(45)
  • 由I2C data信号低电平不到0,再思考I2C及GPIO

    最近做项目测试时发现I2C data信号低电平不能完全到0电平,如下图 量测到低电平最大值150mV左右,检查SOC及负载端SPEC,低电平最大值都是VIL max =0.35VDD 对于1.8V的IO 电平,这个电压是0.35x1.8=0.63V 显然150mV630mV,不影响逻辑判断,因此从项目的角度考虑,此问题并不影响项目,可以

    2023年04月24日
    浏览(43)
  • 【WCH】CH32F203基于内部RTC+I2C SSD1306 OLED时钟和温度显示

    📌相关篇《【WCH】CH32F203基于内部RTC时钟+I2C SSD1306 OLED显示》 📺显示效果: ✨主要是在其基础 上增加温度显示,温度数据来源于DS18B20,更换了OLED驱动显示字体相关内容。 🔰仅作为功能演示,内部RTC精度不高,长时间运行需要依赖第三方数据校准才行。 🔖代码是从STM32工

    2023年04月26日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包