结论: (即在模拟i2c主:在主设置SCL为高后,要超时判断SCL是否为高,再发后面的时序)

现象(如下图):

由于在发送读命令之后,即ACk之后,下面从设备需要准备数据时间,(大约10us,一个时钟的时间),此时还在I2C中断中,因此SCLK上是被拉低。由于主设备,并未检查该SCLK信号,导致下一个数据的第一个时钟信号被拉低,而不知道,而当做有效信号采样,结果导致数据采用出错;我们自己的主设备,采用硬件I2C,有判断总线是否占用和超时机制,故没有这个问题。

I2C的时钟可能被从设备拉低,从示波器看好像主少发了时钟(只有8个时钟,实际应该9个,最前面一个被从设备拉低了),实际是从设备拉低,这时候主设备最好检查时钟信号变高后,再发时钟信号脉冲!

(还在调试爱立信电源PMBUS问题:主发第九个时钟未检查总线,此时从设备把SCL拉低《此时从设备正在做相应数据处理,所以拉低总线》,导致ACK应答失败,从示波器看好像少发了第九时钟;方法发第九个时钟的时候检查SCL电平,发现它变高后,才发第九个时钟)

原因:通信中,从设备由于某种原因(数据处理或准备)拉低SCL时钟线(此时总线属于被占用状态),而主设备并未判断SCL的是否为高空闲,而继续通信,导致失败

解决方法:在通信中,要随时检查SCL电平,当它为低的时候,需要超时等待,等它为高时候,再发新的SCL信号

 (即在代码中,主设置SCL为高后,要超时判断SCL是否为高,再发后面的时序)

另:个人认为硬件i2c有总线占用和超时判断,相对于模拟i2c更好; 但硬件i2c容易出现死锁的问题

Clock Stretching--http://www.i2c-bus.org/clock-stretching/

In an I2C communication the master device determines the clock speed. Unlike RS232 the I2C bus provides an explicit clock signal which relieves master and slave from synchronizing exactly to a predefined baud rate.

However, there are situations where an I2C slave is not able to co-operate with the clock speed given by the master and needs to slow down a little. This is done by a mechanism referred to asclock stretching.

An I2C slave is allowed to hold down the clock if it needs to reduce the bus speed. The master on the other hand is required to read back the clock signal after releasing it to high state and wait until the line has actually gone high.

Bandwith

Clockstretching sounds a bit odd but is common practice. However the total bandwith of the shared bus might be significantly decreased. So, especially for I2C buses shared by multiple devices it is important to estimate the impacts of clock-stretching. So do not make the slowest I2C device dominate your bus performance

i2c的时钟延展问题相关推荐

  1. i2c的时钟延展问题(转)

    源:http://blog.csdn.net/zyboy2000/article/details/7636769 结论: (即在模拟i2c主:在主设置SCL为高后,要超时判断SCL是否为高,再发后面的 ...

  2. linux pcf8563开发文档,linux下的i2c与时钟芯片pcf8563通信

    2012/7/19 linux下的i2c与时钟芯片pcf8563通信 by: 韩大卫 @吉林师范大学 1,本程序增加了对星期寄存器(wday)的写操作. 2, 本程序将i2c-test 改为rtdat ...

  3. 模拟IIC的时钟延展问题(Clock Stretching)

    时钟拉伸(Clock stretching) clock stretching通过将SCL线拉低来暂停一个传输.直到释放SCL线为高电平,传输才继续进行.clock stretching是可选的,实际 ...

  4. linux pcf8563开发文档,Linux下i2c与时钟芯片PCF8563的通信

    Linux下的i2c驱动以及与时钟芯片PCF8563通信过程. 为更深入的了解linux下的i2c总线驱动以及通信原理,可以用一个用户程序模拟,这个程序,可以使用一个addr, 一个offset,对i ...

  5. Arduino I2C + DS1307实时时钟

    主要特性 DS1307是Maxim的串行.I2C实时时钟芯片.主要特性有: 工作电压:主电源电压4.5~5.5V,电池电压2.0~3.5V 功耗:电池供电.备份模式时<500nA 接口:I2C, ...

  6. STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  7. 【嵌入式Linux】嵌入式Linux应用开发基础知识之I2C应用编程和SMBus协议及AP3216C应用编程

    文章目录 前言 1.IIC协议和SMBUS协议 1.1.IIC协议 1.1.1.硬件框架 1.1.2.软件框架 1.1.3.读写数据格式 1.1.4.硬件结构--在硬件上是如何实现双向传输 1.2.S ...

  8. 最全是一次I2C总结

    博主将 I2C spec 文章总结为一篇,目录如下 I2C Introduction I2C Architecture I2C Transfer I2C Synchronization And Arb ...

  9. SENSIRION SCD30 二氧化碳传感器 I2C 通信参数及相关命令

    SENSIRION SCD30 二氧化碳传感器 I2C 地址: 0x61 I2C 通信速率: 100KHz 特别注意: SCD30 要求与其通信的 I2C Master 主机,必须支持 clock s ...

最新文章

  1. Elasticsearch Aggregation 多个字段分组统计 Java API实现
  2. Day01_JAVA语言基础第一天
  3. My FioriTest navigation from master page to detail page
  4. ASP.NET Core 3.0 使用gRPC
  5. 通州区机器人比赛活动总结_马驹桥镇中心小学在2017通州区青少年机器人竞赛中勇创佳绩...
  6. windows和linux加密u盘,linux挂载windows的各种格式U盘
  7. 服务器安装 accessdatabaseengine_.net IIS 服务器环境配置
  8. Uva 10306 e-Coins
  9. MacOS上 编译GMSSL
  10. 【Kaggle】Titanic - Machine Learning from Disaster
  11. 加载配置文件(xml文件,properties文件)demo
  12. java按键机nes模拟器_NES 模拟器开发教程 12 - 输入设备
  13. paper read - 01- 2004 - 语码转换之结构研究述评
  14. 椭圆一般方程(ABCDEF)转椭圆参数方程(长短轴,几何中心)
  15. Python glob()用法
  16. java使用佳博打印机打印标签
  17. html鼠标事件没反应,电脑鼠标点击当前页面没反应怎么办
  18. Oracle数据库逻辑备份与恢复(3)——数据泵(expdp、impdp)
  19. matlab 判定空值NaN
  20. 思科交换机配置单播MAC地址过滤

热门文章

  1. postgresql主从备份_基于PG12.2实现主从异步流复制及主从切换教程(下)
  2. Redis基础知识总结概述
  3. ubuntu 配置dns访问外网
  4. 实验三_166_张珍珍
  5. js将数组元素随机排序的方法
  6. 8天玩转并行开发——第八天 用VS性能向导解剖你的程序
  7. (转帖)数据库时代的终结
  8. Label中的自动换行
  9. 一点一滴培养你的领袖气质
  10. python3什么意思_python3中%d什么意思?