i2c读问题--两次结果不一样

海洋dz   2008-6-15 11:39 楼主
大家好,我这边有个芯片接在i2c总线上,我用i2c读写接口向从设备某块区域写数据,然后读出,看有没有写进去。
但奇怪的是第一次读出来是对的,再读一次就不对,再读一次又是对的.....。

总个情况就是:
第一次读结果是对的

第二次读结果是错的

第三次读结果是对的

第四次读结果是错的

..............


请问大家这是怎么回事? 有没有人遇到这种情况,帮忙分析一下

回复评论 (10)

这很正常,要么就是i2c读写的代码有问题,要么就是这个芯片会自己改动或被别的地方改动了数值。
一般验证的话,可以试试看读那些只读的地方,比如芯片版本号之类的,来验证代码问题。
点赞  2008-6-15 14:23
谢谢楼上的朋友的回复,

我试了读写芯片中供读写测试的区域,那个是正常的,所以i2c读写接口是没问题的,别的地方也没有改动数值。

只是不太明白为什么读出的数据会成这样的规律变化:读一次对的,再读一次就是错的,再读一次又是对的,.......然后成这样规律
点赞  2008-6-15 15:24
请各位高人再帮忙解释一个这是怎么回事?
点赞  2008-6-15 16:08
读出错的这次,每次错的都一样吗?
读代码及调用此函数的代码发一下。

还有,试过用示波器或者逻辑分析仪抓过波形看过吗?其实,只要一个双通道的示波器就行了。
点赞  2008-6-15 20:42
用示波器抓一下波形吧 这种情况看软件代码意义不大 还是从硬件入手比较容易
点赞  2008-6-15 21:32
4、5喽说的对 这些波形需要在示波器下看才能明白到底哪里出问题了。

我测试过几个I2c的片子,一般情况下 I2C 问题归结为以下几种:
1、datasheet 有明确的I2c的波形要求,明确说明不能有任何偏差。
  这种情况必须严格按照波形要求对照,  哪怕是3ns的误差都是不对的,建议将pdf 的波形放大几倍后看。
   问题是, 他们技术人员明确要求《严格照波形实现》,但IC的本身设计却和这个波形有误差。
  我遇到这个情况,前后搞了10几天,崩溃了都不对, 原因是 最后一个读到的数据 不需要发送ACK,而pdf上面明确有一个ACK波形。
  原因:pdf和实际的IC设计存在误差,国内外芯片厂家都经常发生这种问题
2、有些I2C 使用CLK的上升沿触发数据,有的需要在下降沿处理ACK  方向变化,这种也许是我没有明白 这数据线的方向变化到底在CLK低电平变呢 还是在CLK高电平变,(那位明确的话,请指点。) 不同的芯片也许对这个要求不同。

3、对多个I2c 的 芯片挂载在一起没有处理总线仲裁问题,也会导致开始、停止位没有明确实现的问题。
数据访问过程中,CLK线的释放可能会导致其他I2C设备占用资源。

解决办法:
1、优先使用示波器对波形是否正常。特别是开始、起始位、响应位。
2、对照pdf看是否有出入。
3、再不行就找芯片技术支持工程师,一般这里不同的芯片有一些“诀窍”,特别是国内的公司。
点赞  2008-6-15 23:07
1、循环读某一个寄存器,用示波器看波形;
2、上电不做任何配置,很多寄存器都是有默认值的,看读出来对不对,有什么规律;
点赞  2008-6-16 08:26
其实,用一个双通道示波器抓波形解决问题会最快了。以SCL为触发源,以SDA为追加。

1. 成功通讯的一次波形,从IIC的START开始,到STOP结束。
2. 错误通讯的一次波形,从IIC的START开始,到STOP结束。
3. 两个波形图片进行对比,肯定能看出差异的。
点赞  2008-6-16 09:03
I2C的时序要求并不严格的~
简单点,如果你有泰克DPO3000/4000的示波器就能直接在示波器上看到I2C的全部过程和数据(机器具备数据流分析记忆功能,特好用的)
没这个新设备(便宜型号的都8万多一台,贵一个字,不过绝对是嵌入式开发的好东东,叫你Boss买台来用啦~呵呵)~那就用传统的示波器慢慢看~一个词"效率低下"
点赞  2008-6-24 13:15
通常都是因为时序问题~硬件很麻烦的~~不像软件那样可以自己虚拟一下时序或者接口改动~小弟也在头痛这个i2c的问题
点赞  2008-6-25 15:57
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复