社区
嵌入开发(WinCE)
帖子详情
i2c读问题--两次结果不一样
qhsjcyc
2008-06-15 11:39:09
大家好,我这边有个芯片接在i2c总线上,我用i2c读写接口向从设备某块区域写数据,然后读出,看有没有写进去。
但奇怪的是第一次读出来是对的,再读一次就不对,再读一次又是对的.....。
总个情况就是:
第一次读结果是对的
第二次读结果是错的
第三次读结果是对的
第四次读结果是错的
..............
请问大家这是怎么回事? 有没有人遇到这种情况,帮忙分析一下
...全文
2010
10
打赏
收藏
i2c读问题--两次结果不一样
大家好,我这边有个芯片接在i2c总线上,我用i2c读写接口向从设备某块区域写数据,然后读出,看有没有写进去。 但奇怪的是第一次读出来是对的,再读一次就不对,再读一次又是对的.....。 总个情况就是: 第一次读结果是对的 第二次读结果是错的 第三次读结果是对的 第四次读结果是错的 .............. 请问大家这是怎么回事? 有没有人遇到这种情况,帮忙分析一下
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
kidhuang
2008-06-25
打赏
举报
回复
通常都是因为时序问题~硬件很麻烦的~~不像软件那样可以自己虚拟一下时序或者接口改动~小弟也在头痛这个i2c的问题
ly_liuyang
2008-06-24
打赏
举报
回复
I2C的时序要求并不严格的~
简单点,如果你有泰克DPO3000/4000的示波器就能直接在示波器上看到I2C的全部过程和数据(机器具备数据流分析记忆功能,特好用的)
没这个新设备(便宜型号的都8万多一台,贵一个字,不过绝对是嵌入式开发的好东东,叫你Boss买台来用啦~呵呵)~那就用传统的示波器慢慢看~一个词"效率低下"
shuiyan
2008-06-16
打赏
举报
回复
其实,用一个双通道示波器抓波形解决问题会最快了。以SCL为触发源,以SDA为追加。
1. 成功通讯的一次波形,从IIC的START开始,到STOP结束。
2. 错误通讯的一次波形,从IIC的START开始,到STOP结束。
3. 两个波形图片进行对比,肯定能看出差异的。
yangb2014#
2008-06-16
打赏
举报
回复
1、循环读某一个寄存器,用示波器看波形;
2、上电不做任何配置,很多寄存器都是有默认值的,看读出来对不对,有什么规律;
slyzhang
2008-06-15
打赏
举报
回复
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、再不行就找芯片技术支持工程师,一般这里不同的芯片有一些“诀窍”,特别是国内的公司。
sandmangu
2008-06-15
打赏
举报
回复
用示波器抓一下波形吧 这种情况看软件代码意义不大 还是从硬件入手比较容易
shuiyan
2008-06-15
打赏
举报
回复
读出错的这次,每次错的都一样吗?
读代码及调用此函数的代码发一下。
还有,试过用示波器或者逻辑分析仪抓过波形看过吗?其实,只要一个双通道的示波器就行了。
qhsjcyc
2008-06-15
打赏
举报
回复
请各位高人再帮忙解释一个这是怎么回事?
qhsjcyc
2008-06-15
打赏
举报
回复
谢谢楼上的朋友的回复,
我试了读写芯片中供读写测试的区域,那个是正常的,所以i2c读写接口是没问题的,别的地方也没有改动数值。
只是不太明白为什么读出的数据会成这样的规律变化:读一次对的,再读一次就是错的,再读一次又是对的,.......然后成这样规律
载舟之水
2008-06-15
打赏
举报
回复
这很正常,要么就是i2c读写的代码有问题,要么就是这个芯片会自己改动或被别的地方改动了数值。
一般验证的话,可以试试看读那些只读的地方,比如芯片版本号之类的,来验证代码问题。
I2C
总线协议详解
I2C
总线协议1、
I2C
简介2、
I2C
协议3、
I2C
协议有关术语3.1、起始位3.2、停止位3.3、数据传输3.4、应答信号3.5、
I2C
写时序3.6、
I2C
读
时序3.7、
I2C
多字节
读
写时序 1、
I2C
简介
I2C
是很常见的一种总线协议,
I2C
是 NXP 公司设计的,
I2C
使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲的时候 SCL 和 SDA 处于高电平。
I2C
总线标准模式下速度
个人总结之
I2C
总线协议
1.what is
I2C
? 简单讲就是用来传输数据的两根线:一根数据线(SDA)一根时钟线(SCL) 2.
I2C
怎么传输的? (1)基本过程: 1.主机发出开始信号 2.主机接着发出一字节的从机地址信息,其中最低位为
读
写控制码(1为
读
、0为写) 高七位为从机器件地址 3.从机发出认可信号 4.主机开始发送信号,每发完一字节后,从机发出认可
“假
读
“操作在
I2C
接收流程中的原因
I2C
协议规定主机接收第一个数据字节前需要发送ACK/NACK。假
读
操作对应着第一个ACK周期的完成,为后续真实数据接收建立正确的时序。NXP
I2C
控制器在接收模式下,必须通过
读
取I2DR寄存器来触发SCL时钟生成。第一次
读
取不会获取有效数据,但会启动总线时钟。写入接收模式后,IIF标志位(I2SR[1])可能处于置位状态。通过假
读
可以清除该标志,确保后续状态检测的准确性。中不需要假
读
,因为发送方向的操作通过写入I2DR寄存器直接触发数据传输。而接收方向需要先通过假
读
建立时钟同步。
STC89C52RC
I2C
多字节
读
AT24C02
问题
今天用51单片机驱动AT24C02,
I2C
是用I/O口模拟的,出现了个
问题
:
I2C
多字节
读
取24C02时,只有
读
出的第一个数正确,后面的都为0。找了一天终于定位到
问题
,
问题
在于我的__
i2c
_sendOneByte函数一开始没有把SDA拉高,因为
I2C
总线是“线与”关系,当主机将SDA拉低时,从机不能将SDA拉高,而我的
I2C
读
函数应该将SDA的控制权交给从机,所以主机应该主动释放SDA(即将SD...
cc2541 硬件
i2c
读
AT24CM01
之前一直
读
不出数据,设备地址对了,宏定义添加了,但就是
读
不出数据,调试这个花了我一天半的时间!不能忍:检查自己确实没有错误后,唯一一个需要注意的地方就是,写函数后不能立即调用
读
函数,因为在写需要一定的时候,如果还没写完就去
读
那就会
读
取失败。
嵌入开发(WinCE)
19,523
社区成员
41,565
社区内容
发帖
与我相关
我的任务
嵌入开发(WinCE)
硬件/嵌入开发 嵌入开发(WinCE)
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章