16F886在I2C从机模式的问题。

[复制链接]
 楼主| pandatp09 发表于 2014-6-6 08:46 | 显示全部楼层 |阅读模式
最近用MUC做I2C从机试验,主机也从机都是硬件I2C,遇到个奇怪问题,从机地址刚开始设定为0x00,但是实际使用是用不了的,没响应,不知道为什么。后来地址设定为0x02以上就好了,多个MCU从机没有问题,都可以通信。

后来在I2C总线上接了个屏,在初始化屏幕后,所有从机没响应了,写也写不了,读也读不了。刚开始以为是负载问题,但是如果我不初始化屏幕,所有从机都可以通信。后来用proteus模拟后,发现初始屏幕时,会有很多时候发送0x00数据,且从机响应了,和实际不一样的就,初始化屏幕代码发送完毕后,从机还是有响应。

问题就是,为什么发送0x00数据时,MCU从机会有响应?估计也是这个原因,实际使用的时候,初始化完屏幕后,从机都没反应了。
yewuyi 发表于 2014-6-6 09:17 | 显示全部楼层
这个问题,他人无法直接解答你,只能你自己一点点排除错误。

但有几个问题需要注意:
1、I2C的速度是有要求的
2、总线的从器件地址是有不能冲突的。
3、I2C的通信距离一般比较短
4、总线的上拉电阻要正确
5、协议代码要正确
lanmp 发表于 2014-6-6 11:22 | 显示全部楼层
0x00是I2C的广播地址,一般单片机都默认不响应广播消息的。
 楼主| pandatp09 发表于 2014-6-6 11:56 | 显示全部楼层
yewuyi 发表于 2014-6-6 09:17
这个问题,他人无法直接解答你,只能你自己一点点排除错误。

但有几个问题需要注意:

感谢大大回答,但是问题可能我没说清楚,您说的这几个问题肯定没有问题的。

1、I2C的速度是有要求的
  默认速度我设置是400K,也降低至100k测试过,也是一样的结果。
2、总线的从器件地址是有不能冲突的。
  地址没有冲突,现在从机有两片16f886,地址分别是0x02和0x04.
3、I2C的通信距离一般比较短  4、总线的上拉电阻要正确
  我的实验通信是板外通信,用了P82B96做板外发送接收缓冲,电阻配置也没有问题。
5、协议代码要正确
    代码协议也没有问题,如果只是和两片从机通信,读写都没有问题,一直连续工作都没问题。
    问题在于,如果我刻意发送地址和数据都为0x00时,多次循环后,从机都没法读写了。在仿真环境下,能得知I2C总线上数据为0x00时,从机有响应进入中断,但是我从机地址并没有设定为0x00,是0x02和0x04。
    但是如果我只连接一个从机,从机地址设置为0x00,从机反而是没响应,难道这是硬件BUG吗?。
 楼主| pandatp09 发表于 2014-6-6 11:59 | 显示全部楼层
lanmp 发表于 2014-6-6 11:22
0x00是I2C的广播地址,一般单片机都默认不响应广播消息的。

是的,不响应就好了,问题是发送0x00时,所有从机都响应了,很奇怪。
yewuyi 发表于 2014-6-6 13:02 | 显示全部楼层
撤掉多数从器件,只留一个从器件,然后检查从器件的代码有无问题

主器件发送后,从器件肯定都是会接受的,但接受后要和自己的地址比较,地址一致的从器件返回应答。
lanmp 发表于 2014-6-6 13:34 | 显示全部楼层
“发现初始屏幕时,会有很多时候发送0x00数据”
这些数据不是你的程序发的?为什么很吃惊的样子?
 楼主| pandatp09 发表于 2014-6-6 14:25 | 显示全部楼层
yewuyi 发表于 2014-6-6 13:02
撤掉多数从器件,只留一个从器件,然后检查从器件的代码有无问题

主器件发送后,从器件肯定都是会接受的, ...

是的,这一步也尝试过了,就只留一个从机也是这样。从机I2C是中断方式,地址设置为0x02,正常来说总线上地址是0x02从机才会响应中断,但是总线上有0x00的数据,从机也进入中断了,而且中断标志也是I2C的中断,不是别的中断。
 楼主| pandatp09 发表于 2014-6-6 14:30 | 显示全部楼层
lanmp 发表于 2014-6-6 13:34
“发现初始屏幕时,会有很多时候发送0x00数据”
这些数据不是你的程序发的?为什么很吃惊的样子? ...

可能是我没说清楚吧,我的意思是“发现初始屏幕时,会有很多时候发送0x00数据,且从机(MCU从机)响应了”

从机地址是0x02,中断方式接收数据。总线上的地址和从机地址相符,单片机才会进入中断,但是发送0x00时候,从机的单片机也响应了,奇怪的是从机地址并不是0x00,但不知道为什么也会响应。
yewuyi 发表于 2014-6-6 15:11 | 显示全部楼层
pandatp09 发表于 2014-6-6 14:30
可能是我没说清楚吧,我的意思是“发现初始屏幕时,会有很多时候发送0x00数据,且从机(MCU从机)响应了 ...

你奇怪,别人不是更奇怪吗?

如果你确定硬件没问题,现在又发生不该响应的从器件响应了,那说明啥?

只能是代码有问题了啊!!!
gxliu08 发表于 2014-6-7 09:41 | 显示全部楼层
I2C搞定了吗?到底什么原因造成?
伊泽瑞拉 发表于 2014-6-7 10:07 | 显示全部楼层
         i2c这东西感觉特别容易出问题   多研究研究吧     
 楼主| pandatp09 发表于 2014-6-12 11:16 | 显示全部楼层
gxliu08 发表于 2014-6-7 09:41
I2C搞定了吗?到底什么原因造成?

可能是软件问题吧,但是目前还是没找到什么头绪,想暂时通过多路I2C缓冲切换来缓解。
 楼主| pandatp09 发表于 2014-6-12 11:17 | 显示全部楼层
yewuyi 发表于 2014-6-6 15:11
你奇怪,别人不是更奇怪吗?

如果你确定硬件没问题,现在又发生不该响应的从器件响应了,那说明啥?

按这样说应该是软件的问题了,但是目前还是没啥头绪,暂时想通过I2C缓冲切换解决,先结贴吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

1

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

1

主题

8

帖子

1

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