I2C中的时钟同步与仲裁

2023-05-16

文章目录

  • 时钟同步和仲裁
    • 1.时钟同步
    • 2.仲裁
  • 时钟拉伸

系列文章 《I2C总线(1)–数据传输格式与7位地址读写》; 《I2C总线(2)–10位地址读写》; 《I2C总线(4)–高速模式》;
《I2C总线(5)–线与和上拉电阻》; 《I2C总线(6)–START BYTE》

时钟同步和仲裁

在单主设备中,不需要时钟同步和仲裁。而在多设备时,多个主设备可以同时在空闲的总线上开始发送数据,这时就需要仲裁决定哪一个来控制总线并完成它的数据传输,有时候也需要时钟同步来协同设备间的工作。而这正是通过时钟同步和仲裁来完成的。

1.时钟同步

有的时候,主机的速度快于从机的速度,或者从机需要处理其他事情而不能及时地从主机接收数据或者向主机发送数据。如果从设备希望主设备降低传输速率,可以通过将SCL主动拉低,延长SCL低电平时间的方法来通知主设备。当主设备下一次传输时发现SCL电平被拉低时,就进入等待,直到从设备完成操作并释放SCL线。这就要使用时钟同步来完成。

  • 时钟同步是通过连接到SCL总线的I2C接口“线与”实现
  • SCL线上的低电平时间是由时钟低电平最长的器件决定,SCL的高电平则是由高电平时间最短的期间决定
  • 时钟同步解决了I2C总线设备间的速度同步

时钟同步的过程:

  • 一旦主设备1的时钟拉低,就会把SCL总线拉低。当SCL总线从高拉低时,主设备将计数主设备时钟的低电位周期。
  • 主设备2检测到SCL线为低,也会立刻将CLK1拉低,不会等到CLK1的正常周期才拉低。
  • 如果此时另外一个主设备的时钟仍然是低电平的,此时SCL总线也同样的保持为低。在此期间,低周期比较短的主设备1将进入高电平状态等待。如图,主设备1提前进入高电平等待,主设备2继续保持低电平。
  • 当所有主设备的时钟都为高电平时,将会把SCL线拉高。也就是说时钟低电平周期较长的主设备2决定了SCL线为低的周期长度。
  • 所有的主设备时钟都拉高时,将对他们的高电平时钟计数,第一个结束时钟高电平周期的主设备将会把SCL线拉低。主设备2将SCL拉低后,主设备1检测到SCL线为低时,CLK1也立刻拉低。在这里插入图片描述

2.仲裁

仲裁和同步是一样的,只有在系统使用多个主设备时才需要,而从设备(slave)不参与仲裁程序。当然,只有在主线空闲的情况下,主设备才可以发起传输。两个主机可以在启动条件的最小保持时间内生成一个启动条件,从而在总线上生成一个有效的传输启动条件,然后仲裁程序决定哪一个主设备可以完成它的传输。

  • 谁先在SDA线上发送低电平,谁就掌握对总线的控制权
  • I2C总线的控制权完全取决于竞争主设备发送的地址和数据,因此没有中央主设备,总线上也没有任何优先级顺序。

仲裁的步骤:

  • 当两个master对同一个地址的slave进行传输时,多个master会都能进入数据周期,仲裁会单比特对单比特进行比较
  • SCL为高的每一个比特位期间每个主设备检查SDA线的电平是否与它所发送的相匹配。这个过程很可能需要比对很多位。
  • 如果传输的数据时完全相同的,则这个主设备可以完成地发送整个事务。
  • 当主设备发送的比特位与SDA线不匹配时,例如图中DATA1在SCL线的第三个周期,此时DATA1拉高,而DATA2W为低,DATA1和DATA2在线与后SDA为低,匹配不成功。当主设备1检测到一个与自身不相符的低电平,这时会关闭主设备1的SDA传输驱动,另一个主设备2会继续完成传输。
    在这里插入图片描述

时钟拉伸

​ 其实我觉得时钟拉伸就是完成时钟同步中的事,将主从设备间数据传输同步。时钟拉伸是通过保持SCL信号拉低来暂停事务的,期间传输不能继续,直到SCL信号再次被拉高。时钟拉伸需要设备包含SCL驱动程序,而大多数的从设备不包含SCL驱动程序,所以他们无法拉伸时钟。

​ 在字节传输级别,设备可能能够以较快地速度接受字节数据,但是需要更多的时间来存储接受到的字节或准备传输另一个字节。在字节发送ACK位之后,从设备可以拉低SCL总线,迫使主设备进入等待状态,直到设备准备好下一个字节的传输。

​ 在比特级别,无论是否为I2C总线提供有限的硬件,都可以通过延长每个时钟的低周期来降低总线时钟时钟的速度。

​ 注意:在高速模式下,这个通过拉伸时钟的握手功能只能在字节传输级别使用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

I2C中的时钟同步与仲裁 的相关文章

  • i2c总线最多可以挂多少个ic

    i2c总线最多可以挂多少个ic 有哪些因素决定 xff1f 1 由IIC地址决定 xff0c 8位地址 xff0c 减去1位广播地址 xff0c 是7位地址 xff0c 2 7 61 128 xff0c 但是地址0x00不用 xff0c 那
  • i2c信号的ACK与NACK

    nbsp nbsp nbsp nbsp nbsp nbsp nbsp 我们平时在调试I2C的时候可能很少去关注NACK信号 只知道如果Master发送数据 MSB先发 LSB后发 连续发送一个字节 8个bit 之后Slave会回复一个ACK
  • 基于I2C/SPI的温湿度采集与OLED显示

    一 I2c通讯协议 I2C通讯协议 Inter xff0d Integrated Circuit 引脚少 xff0c 硬件实现简单 xff0c 可扩展性强 xff0c 不需要USART CAN等通讯协议的外部收发设备 xff0c 现在被广泛
  • mtk6765上i2c-tools的使用

    1 下载i2c tools 从开源网站http dl lm sensors org i2c tools releases 下载i2c tools 几个版本都可以用 xff0c 可以选择下载i2c tools 4 3 xff12 到官网下载交
  • I2C slave address

    1 同一 I2C bus device 之 I2C slaver address 不可一样 2 检查 这些 devices 是否可以变更 I2C slaver address hardware pin control or software
  • I2C总线和SPI总线

    I2C串行总线一般有两根信号线 xff0c 一根是双向的数据线SDA xff0c 另一根是时钟线SCL I2C协议 2条双向串行线 xff0c 一条数据线SDA xff0c 一条时钟线SCL SDA传输数据是 大端传输 xff08 字节高位
  • I2C通讯协议介绍

    2019独角兽企业重金招聘Python工程师标准 gt gt gt I2C总线是PHLIPS公司在20世纪80年代推出的一种串行总线 具有引脚少 xff0c 硬件实现简单 xff0c 可扩展性强的优点 I2C总线的另一优点是支持多主控 xf
  • 通信方式梳理:GPIO,I2C,SPI,UART,USART,USB的区别

    GPIO xff0c I2C xff0c SPI xff0c UART xff0c USART xff0c USB的区别 1 简单区别 xff1a 1 xff09 GPIO xff08 General Purpose Input Outpu
  • STM32 I2C_OLED显示汉字及屏幕滚动

    STM32 I2C OLED显示汉字及屏幕滚动 文章目录 STM32 I2C OLED显示汉字及屏幕滚动一 I2C以及AHT20温湿度传感器介绍二 用0 96寸OLED屏幕显示数据1 OLED介绍2 样例测试 三 汉字编码原理编码排序A0A
  • I2C总线

    目录 1 硬件概述 1 1 常用器件 1 2 总线结构 1 3 工作原理 2 协议概述 2 1 传输格式 2 2 传输特点 2 3 读和写 2 4 时钟同步和总线仲裁 3 转换器概述 4 缓存器概述 1 硬件概述 1 1 常用器件
  • Arduino读取DHT11的温湿度显示在基于I2C的1602上

    背景摘要 又到了周末 xff0c B站的番还未更新 闲来无事 xff0c 搞搞吃灰已久的Arduino 南方的冬天真冷啊 xff0c 测测屋子里的温湿度怎么样 xff01 为了测量屋子里的温湿度 xff0c 就用简单大方的Arduino x
  • 【总线】I2C 通信协议

    目录 I2C 总线协议概述 参数总结 I2C 的工作原理 寻址 读 写位 数据帧 I2C数据传输的步骤 具有多个从机的单个主机 具有多个从机的多个主机 I2C的优缺点 优点 缺点 文章参考 I2C 总线协议概述 I2C 总线广泛应用在 OL
  • Linux下CH452数码管芯片驱动调试(GPIO模拟I2C)

    1 设备连接 主控板处理器为Cortex A5处理器 内核4 9 0 主控板和CH452引脚定义如下表1 1所示 表1 1 主控板和CH452引脚定义 序号 CH452引脚定义 主控板引脚定义 1 SDA PB29 2 SCL PB30 3
  • 找不到i2c注册宏?

    我正在 raspi 上开发 I2C 驱动程序 register I2C device static static const struct i2c board info rasp i2c devices mbed mbedID in the
  • 为什么我只收到第一个地址字节? (I2C协议)

    期望从机确认并返回数据 但它没有 这是我的协议 这是我的数据表 数据表提到 从机将通过首先发送 MSB 字节来应答 Byte0 和 byte1 包含 预测值 所有字节均由主机确认 Edit 源库 另外仅供参考 我使用的是 Arduino F
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • ADXL345 与 ESP32 I2C 垃圾值问题

    我已根据以下教程使用 I2C 接口将 ESP32 与 ADXL345 连接起来Tutorial http www esp32learning com code esp32 and adxl345 sensor example php 但是
  • Windows IoT 和 DS3231 RTC 时钟

    对于我的项目 我需要当前时间和日期 不幸的是 当 RP2 关闭时 它就会失去一切 接下来的事情是 我将没有互联网连接来使用 NTP 为此 我需要实现 DS3231 RTC 模块 所有设备的通信都通过 I2C 运行 Raspberry Ard
  • MCP23017 I2C 设备驱动程序探测函数未调用

    我正在使用以下 I2C GPIO设备驱动 https github com torvalds linux blob master drivers gpio gpio mcp23s08 c访问 MCP23017 GPIO 使用 insmod
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些

随机推荐