发新帖我要提问
12
返回列表
打印
[PIC®/AVR®/dsPIC®产品]

pic16f886的i2c通信问题请教!!

[复制链接]
楼主: 涵潇舒雅
手机看帖
扫描二维码
随时随地手机跟帖
21
涵潇舒雅|  楼主 | 2013-10-23 09:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
NE5532 发表于 2013-10-23 09:25
数据发送完成马上就能读到ACK?然后一个while死循环?ACK的反馈有这么快回来?你是不是该等到ACK了以后再判 ...

这也是我的疑问,读取ACK是不是需要延时一段时间? 还有就是从机怎么知道主机发送的数据是最后一位?
另外我现在发送启动条件之后,就判断 总线冲突标志位BCLIF,发现发送总线冲突,看数据手册也没有找到总线冲突之后怎么解决?求指教

使用特权

评论回复
22
NE5532| | 2013-10-23 10:07 | 只看该作者
主机发送最后一位这个不用你操心,硬件会自己去接收8个bit的,但是I2C总线上的速度远慢于单片机执行速度,所以怀疑ACK根本还没收完你就去检测了,然后因为没有检测到ACK,就当机了。

第一个原因,是你没有仔细去看数据手册,特别是ACK部分没有看懂,再看。
第二个原因,是程序里不要出现死循环,出了问题,要去处理问题,而不是一死了之。

使用特权

评论回复
23
涵潇舒雅|  楼主 | 2013-10-23 10:26 | 只看该作者
NE5532 发表于 2013-10-23 10:07
主机发送最后一位这个不用你操心,硬件会自己去接收8个bit的,但是I2C总线上的速度远慢于单片机执行速度, ...

BCLIF置位,就是总线冲突了吧,如果是这样的话,那么还能正常的通信吗?如果不能需要怎么去解决这个总线冲突呢?
直接死循环肯定不行,我目前只是为了方便调试,看看那里出的问题,非常感激您的耐心回答!!

使用特权

评论回复
24
gurong60| | 2013-10-23 11:07 | 只看该作者
建议先卸载这个仿真软件,你这个问题是你没有仔细看手册,手册说的很清楚,要判断中断标志位,且需要软件清零,虽然没用用中断但也要判断中断标志位,按照手册上的发送和接收的1.2.3.4.5。。。一条一条来

使用特权

评论回复
25
NE5532| | 2013-10-23 11:08 | 只看该作者
涵潇舒雅 发表于 2013-10-23 10:26
BCLIF置位,就是总线冲突了吧,如果是这样的话,那么还能正常的通信吗?如果不能需要怎么去解决这个总线 ...

你的问题根本不是总线冲突,而是没有按要求做。我猜你是因为过早地读取了ACK标志,读到了不正确应答位,被硬件理解成了总线冲突。

使用特权

评论回复
26
涵潇舒雅|  楼主 | 2013-10-23 13:50 | 只看该作者
gurong60 发表于 2013-10-23 11:07
建议先卸载这个仿真软件,你这个问题是你没有仔细看手册,手册说的很清楚,要判断中断标志位,且需要软件清 ...
void write_iic(uchar add,uchar p)
{
        uchar i;
        SSPIF=0;
        SEN=1;
        while(!SSPIF);
        SSPIF=0;
        SSPBUF=add&0xfe;//add是从机的地址
        while(!SSPIF);
        SSPIF=0;        //等待ACK
        SSPBUF=p;
        while(!SSPIF);
        SSPIF=0;         
        PEN=1;
        while(!SSPIF);
        SSPIF=0;
}
这个样子行吗? 我看你的帖子就是那样写的我才试了试,不管有没有收到应答,第9个脉冲的时候,总会把SSPIF置位!?

使用特权

评论回复
27
涵潇舒雅|  楼主 | 2013-10-23 14:54 | 只看该作者
NE5532 发表于 2013-10-23 11:08
你的问题根本不是总线冲突,而是没有按要求做。我猜你是因为过早地读取了ACK标志,读到了不正确应答位, ...

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

使用特权

评论回复
28
NE5532| | 2013-10-23 15:00 | 只看该作者
涵潇舒雅 发表于 2013-10-23 14:54
这是我检测的SCL波形   
这是我的SDA的数据,我数据和我发送的数据进行对比了一下,发现很正确,这不是 ...

时钟的个数是对的,9个,但是看不清有没有应答,用示波器的双踪来打,两个波形上下稍微错开一点就看清楚了。

使用特权

评论回复
29
涵潇舒雅|  楼主 | 2013-10-23 16:06 | 只看该作者
NE5532 发表于 2013-10-23 15:00
时钟的个数是对的,9个,但是看不清有没有应答,用示波器的双踪来打,两个波形上下稍微错开一点就看清楚 ...

我现在能调通了,我不知道啥原因,有可能我以前没有共地的原因吧!!版主非常感谢你,现在心情很愉悦!!!!谢谢

使用特权

评论回复
30
gurong60| | 2013-10-23 16:45 | 只看该作者
涵潇舒雅 发表于 2013-10-23 16:06
我现在能调通了,我不知道啥原因,有可能我以前没有共地的原因吧!!版主非常感谢你,现在心情很愉悦!! ...

没找到原因你也值得高兴?还是把原因找出来的好

使用特权

评论回复
31
涵潇舒雅|  楼主 | 2013-10-23 16:49 | 只看该作者
gurong60 发表于 2013-10-23 16:45
没找到原因你也值得高兴?还是把原因找出来的好

出来结果,就看到希望了,目前感觉就是因为之间没有共地的原因吧!!!!程序还是那个程序,再修改程序看看、、

使用特权

评论回复
32
NE5532| | 2013-10-23 17:18 | 只看该作者
不共地肯定是低级错误,但是楼主还需要仔细确认其他地方是正确的,这种程序是底层,一但有漏洞,后面会出现奇奇怪怪的问题滴。

使用特权

评论回复
33
理工大小薛| | 2013-10-23 20:53 | 只看该作者
不共地是很低级的错误,开始学习应该更细心些

使用特权

评论回复
34
涵潇舒雅|  楼主 | 2013-10-24 08:03 | 只看该作者
NE5532 发表于 2013-10-23 17:18
不共地肯定是低级错误,但是楼主还需要仔细确认其他地方是正确的,这种程序是底层,一但有漏洞,后面会出现 ...

恩,后续测试我会注意点的,要是找的问题我再共享出来!!!3Q

使用特权

评论回复
35
涵潇舒雅|  楼主 | 2013-10-24 08:04 | 只看该作者
理工大小薛 发表于 2013-10-23 20:53
不共地是很低级的错误,开始学习应该更细心些

恩,有点急功近利了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则