源:http://blog.csdn.net/zyboy2000/article/details/7636769

结论: (即在模拟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的时钟延展问题

    结论: (即在模拟i2c主:在主设置SCL为高后,要超时判断SCL是否为高,再发后面的时序) 现象(如下图): 由于在发送读命令之后,即ACk之后,下面从设备需要准备数据时间,(大约10us,一个时钟 ...

  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. ubuntu18.04 实现中文化 中文输入法
  2. Hyper-V 2节点集群高可用的限制
  3. php的常量和变量,php的常量和变量
  4. 新建idea加入的一句话,键值对
  5. 201503-4 网络延时 (本质是求树的最长路径)
  6. iOS 延迟1.5s 执行方法
  7. 二十一、文本情感分类二
  8. RAC IP 地址修改
  9. wpf 客户端【JDAgent桌面助手】开发详解(三) 瀑布流效果实现与UI虚拟化优化大数据显示...
  10. asp.net 读取mysql_ASP.NET连接数据库并获取数据
  11. 242.有效的字母异位词(力扣leetcode) 博主可答疑该问题
  12. 就算是一件小事也要做好——买土豆的故事
  13. 电动汽车结构原理基础知识
  14. 程序包解析错误解决办法
  15. Tesseract怎么识别中文
  16. chromium aura简介
  17. 鸿蒙系统是手机系统还是电脑系统,鸿蒙系统能兼容手机电脑和智能设备,这是怎样实现的?...
  18. 如何打造智能世界的数据底座?深耕华为云大数据,畅享价值最大化
  19. echarts自定义区域地图
  20. 学习Spring框架有这一篇就够了

热门文章

  1. python编程小游戏-python趣味入门——写几个常玩的游戏
  2. 错误:cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp”
  3. 3704对象关闭时_JVM 通过逃逸分析就能让对象在栈上分配?没那么简单!
  4. lua学习笔记之语句
  5. 重构-改善既有代码的设计读书笔记
  6. UVa12583 - Memory Overflow
  7. 题目1493:公约数
  8. 软件工程 第二周作业
  9. bzoj2333 [SCOI2011]棘手的操作(洛谷3273)
  10. 单元测试如何保证了易用的API