5282|4

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

一直用IO口模拟I2C,这两天做msp430用到I2C却遇到问题,特来请教各位高手 [复制链接]

以前用IO口模拟I2C一直都没有出现问题,现在正在做的msp430板子却怎么都调试不出来。
现将所遇到的情况向各位汇报:
1、一开始是向24C04写地址,但是始终没有应答信号,用示波器观察,SDA信号电平在中间位置,所以判断信号为高,无应答


2、于是我怀疑上拉的缘故,去掉上拉20K电阻,发现还是没有解决问题,不过发送的第一个芯片地址(0xa0)倒是有了应答信号,后面发送的一个字节又出现了问题,没有应答信号。观察波形,应答时钟处SDA的电平有下降的趋势


3、再将管脚用20K电阻下来,这次发现读出了数据,以为数据对了,不过仔细一看,发现读出来的都是0x00。再看程序,发现写入数据的时候,还是没有写进去(没有写保护)。我分析,应该是24C04的SDA管脚始终输出低电平(因为下拉),只要将单片机的管脚设置为输入,就会读到低电平,于是我怀疑是不是芯片坏了。


4、拆芯片,换芯片,发现问题依旧。将拆下的芯片换到其他版次的板子上,发现芯片正常工作,不过电平还是有些奇怪。


至此,鄙人忙得精疲力尽,周末的第一天都用在这上面了,却怎么也不出结果,现将情况描述出来,希望万能的各位高手能够给小弟分析分析问题到底出在哪,鄙人不甚感激,谢谢!

[ 本帖最后由 sun723 于 2012-4-14 21:05 编辑 ]

最新回复

昨天用手机回帖居然乱码了…… 我是说一般我会定义几个宏,SET_SCL SET_SDA RESET_SCL RESET_SDA SCL_1 SDA_1 其中SET作用是置高,一般将管脚设置成带上拉的输入 RESET作用是置低,将管脚设置成输出低 SDA_1和SCL_1是判断语句,用法一般是if(SDA_1),意思几近于“if(SDA==1)”,只需要一个二值的真假作为结论就可以了,用于判断管脚电平。 RESET之后一般可以认为管脚立即变为低电平了,SET之后则还需要再次通过读取管脚电平判断是否已经将管脚置高,因为其他设备可能拉住总线使其电平不能即时生效。 任何设备都应该随时监控总线电平,因为总线电平是所有设备共同作用的结果,不是其中任何一个设备所能单独控制的。 满足以上条件之后,模拟I2C的程序编写就容易多了,直接参考时序图就可以了。不过需要注意一点,那就是弄清楚什么时序是主从哪一方发出的,搞清楚这个,I2C就能信手掂来了。  详情 回复 发表于 2015-6-13 12:56
 
点赞 关注

回复
举报

48

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

遇到同样的问题

我也用msp430的IO模拟I2C,发现总是收不到从设备的ACK信号,但是手边没示波器,没法深入调试,我估计应该是430的IO口的问题,但是去看datasheet没有怎么看明白,因为430的IO口电路看起来很复杂,一堆的门电路。

我的想法是等我验证好了从设备是好的时候,我就将SDA线一分为2,另外再用一个IO专门读取ACK(不过,还没仔细考虑会不会出问题),同时加两级反相器作缓冲器用,用反相器来对波形整下形

网上找的代码也是不行,(当然,可能网上的代码有问题)

想用51单片机来检测下从设备有没有坏,但是有没有51的硬件仿真器,搞得想做的事没有半点进展!


不知道LZ现在调出来了没?
 
 

回复

48

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
到现在只跳出来了ACK啊,说明写数据好像没设么问题了
但是读数据却怎么读都是0啊
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(中级)

4
 
一直模拟I2C,你很精通了吧。请问,在M4裸机上模拟I2C,引脚只管方向就好吗,用不用推挽开漏,数据线和时钟线配置一样吗?你的应答是怎么应答的啊,将数据线改为输入吗?

点评

昨天用手机回帖居然乱码了…… 我是说一般我会定义几个宏,SET_SCL SET_SDA RESET_SCL RESET_SDA SCL_1 SDA_1 其中SET作用是置高,一般将管脚设置成带上拉的输入 RESET作用是置低,将管脚设置成输出低 SDA_1和SC  详情 回复 发表于 2015-6-13 12:56
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

5
 
1301120345 发表于 2015-6-4 10:48
一直模拟I2C,你很精通了吧。请问,在M4裸机上模拟I2C,引脚只管方向就好吗,用不用推挽开漏,数据线和时钟线配置一样吗?你的应答是怎么应答的啊,将数据线改为输入吗?

昨天用手机回帖居然乱码了……
我是说一般我会定义几个宏,SET_SCL SET_SDA RESET_SCL RESET_SDA SCL_1 SDA_1
其中SET作用是置高,一般将管脚设置成带上拉的输入
RESET作用是置低,将管脚设置成输出低
SDA_1和SCL_1是判断语句,用法一般是if(SDA_1),意思几近于“if(SDA==1)”,只需要一个二值的真假作为结论就可以了,用于判断管脚电平。
RESET之后一般可以认为管脚立即变为低电平了,SET之后则还需要再次通过读取管脚电平判断是否已经将管脚置高,因为其他设备可能拉住总线使其电平不能即时生效。
任何设备都应该随时监控总线电平,因为总线电平是所有设备共同作用的结果,不是其中任何一个设备所能单独控制的。
满足以上条件之后,模拟I2C的程序编写就容易多了,直接参考时序图就可以了。不过需要注意一点,那就是弄清楚什么时序是主从哪一方发出的,搞清楚这个,I2C就能信手掂来了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表