[PIC®/AVR®/dsPIC®产品] pic16f886的i2c通信问题请教!!

[复制链接]
4757|34
 楼主| 涵潇舒雅 发表于 2013-10-23 09:48 | 显示全部楼层
NE5532 发表于 2013-10-23 09:25
数据发送完成马上就能读到ACK?然后一个while死循环?ACK的反馈有这么快回来?你是不是该等到ACK了以后再判 ...

这也是我的疑问,读取ACK是不是需要延时一段时间? 还有就是从机怎么知道主机发送的数据是最后一位?
另外我现在发送启动条件之后,就判断 总线冲突标志位BCLIF,发现发送总线冲突,看数据手册也没有找到总线冲突之后怎么解决?求指教
NE5532 发表于 2013-10-23 10:07 | 显示全部楼层
主机发送最后一位这个不用你操心,硬件会自己去接收8个bit的,但是I2C总线上的速度远慢于单片机执行速度,所以怀疑ACK根本还没收完你就去检测了,然后因为没有检测到ACK,就当机了。

第一个原因,是你没有仔细去看数据手册,特别是ACK部分没有看懂,再看。
第二个原因,是程序里不要出现死循环,出了问题,要去处理问题,而不是一死了之。
 楼主| 涵潇舒雅 发表于 2013-10-23 10:26 | 显示全部楼层
NE5532 发表于 2013-10-23 10:07
主机发送最后一位这个不用你操心,硬件会自己去接收8个bit的,但是I2C总线上的速度远慢于单片机执行速度, ...

BCLIF置位,就是总线冲突了吧,如果是这样的话,那么还能正常的通信吗?如果不能需要怎么去解决这个总线冲突呢?
直接死循环肯定不行,我目前只是为了方便调试,看看那里出的问题,非常感激您的耐心回答!!
gurong60 发表于 2013-10-23 11:07 | 显示全部楼层
建议先卸载这个仿真软件,你这个问题是你没有仔细看手册,手册说的很清楚,要判断中断标志位,且需要软件清零,虽然没用用中断但也要判断中断标志位,按照手册上的发送和接收的1.2.3.4.5。。。一条一条来
NE5532 发表于 2013-10-23 11:08 | 显示全部楼层
涵潇舒雅 发表于 2013-10-23 10:26
BCLIF置位,就是总线冲突了吧,如果是这样的话,那么还能正常的通信吗?如果不能需要怎么去解决这个总线 ...

你的问题根本不是总线冲突,而是没有按要求做。我猜你是因为过早地读取了ACK标志,读到了不正确应答位,被硬件理解成了总线冲突。
 楼主| 涵潇舒雅 发表于 2013-10-23 13:50 | 显示全部楼层
gurong60 发表于 2013-10-23 11:07
建议先卸载这个仿真软件,你这个问题是你没有仔细看手册,手册说的很清楚,要判断中断标志位,且需要软件清 ...
  1. void write_iic(uchar add,uchar p)
  2. {
  3.         uchar i;
  4.         SSPIF=0;
  5.         SEN=1;
  6.         while(!SSPIF);
  7.         SSPIF=0;
  8.         SSPBUF=add&0xfe;//add是从机的地址
  9.         while(!SSPIF);
  10.         SSPIF=0;        //等待ACK
  11.         SSPBUF=p;
  12.         while(!SSPIF);
  13.         SSPIF=0;         
  14.         PEN=1;
  15.         while(!SSPIF);
  16.         SSPIF=0;
  17. }
这个样子行吗? 我看你的帖子就是那样写的我才试了试,不管有没有收到应答,第9个脉冲的时候,总会把SSPIF置位!?
 楼主| 涵潇舒雅 发表于 2013-10-23 14:54 | 显示全部楼层
NE5532 发表于 2013-10-23 11:08
你的问题根本不是总线冲突,而是没有按要求做。我猜你是因为过早地读取了ACK标志,读到了不正确应答位, ...

这是我检测的SCL波形   
这是我的SDA的数据,我数据和我发送的数据进行对比了一下,发现很正确,这不是就是发送没问题了?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
NE5532 发表于 2013-10-23 15:00 | 显示全部楼层
涵潇舒雅 发表于 2013-10-23 14:54
这是我检测的SCL波形   
这是我的SDA的数据,我数据和我发送的数据进行对比了一下,发现很正确,这不是 ...

时钟的个数是对的,9个,但是看不清有没有应答,用示波器的双踪来打,两个波形上下稍微错开一点就看清楚了。
 楼主| 涵潇舒雅 发表于 2013-10-23 16:06 | 显示全部楼层
NE5532 发表于 2013-10-23 15:00
时钟的个数是对的,9个,但是看不清有没有应答,用示波器的双踪来打,两个波形上下稍微错开一点就看清楚 ...

我现在能调通了,我不知道啥原因,有可能我以前没有共地的原因吧!!版主非常感谢你,现在心情很愉悦!!!!谢谢
gurong60 发表于 2013-10-23 16:45 | 显示全部楼层
涵潇舒雅 发表于 2013-10-23 16:06
我现在能调通了,我不知道啥原因,有可能我以前没有共地的原因吧!!版主非常感谢你,现在心情很愉悦!! ...

没找到原因你也值得高兴?还是把原因找出来的好
 楼主| 涵潇舒雅 发表于 2013-10-23 16:49 | 显示全部楼层
gurong60 发表于 2013-10-23 16:45
没找到原因你也值得高兴?还是把原因找出来的好

出来结果,就看到希望了,目前感觉就是因为之间没有共地的原因吧!!!!程序还是那个程序,再修改程序看看、、
NE5532 发表于 2013-10-23 17:18 | 显示全部楼层
不共地肯定是低级错误,但是楼主还需要仔细确认其他地方是正确的,这种程序是底层,一但有漏洞,后面会出现奇奇怪怪的问题滴。
理工大小薛 发表于 2013-10-23 20:53 | 显示全部楼层
不共地是很低级的错误,开始学习应该更细心些
 楼主| 涵潇舒雅 发表于 2013-10-24 08:03 | 显示全部楼层
NE5532 发表于 2013-10-23 17:18
不共地肯定是低级错误,但是楼主还需要仔细确认其他地方是正确的,这种程序是底层,一但有漏洞,后面会出现 ...

恩,后续测试我会注意点的,要是找的问题我再共享出来!!!3Q
 楼主| 涵潇舒雅 发表于 2013-10-24 08:04 | 显示全部楼层
理工大小薛 发表于 2013-10-23 20:53
不共地是很低级的错误,开始学习应该更细心些

恩,有点急功近利了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部