打印

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

[复制链接]
1803|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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吗?。

使用特权

评论回复
5
pandatp09|  楼主 | 2014-6-6 11:59 | 只看该作者
lanmp 发表于 2014-6-6 11:22
0x00是I2C的广播地址,一般单片机都默认不响应广播消息的。

是的,不响应就好了,问题是发送0x00时,所有从机都响应了,很奇怪。

使用特权

评论回复
6
yewuyi| | 2014-6-6 13:02 | 只看该作者
撤掉多数从器件,只留一个从器件,然后检查从器件的代码有无问题

主器件发送后,从器件肯定都是会接受的,但接受后要和自己的地址比较,地址一致的从器件返回应答。

使用特权

评论回复
7
lanmp| | 2014-6-6 13:34 | 只看该作者
“发现初始屏幕时,会有很多时候发送0x00数据”
这些数据不是你的程序发的?为什么很吃惊的样子?

使用特权

评论回复
8
pandatp09|  楼主 | 2014-6-6 14:25 | 只看该作者
yewuyi 发表于 2014-6-6 13:02
撤掉多数从器件,只留一个从器件,然后检查从器件的代码有无问题

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

是的,这一步也尝试过了,就只留一个从机也是这样。从机I2C是中断方式,地址设置为0x02,正常来说总线上地址是0x02从机才会响应中断,但是总线上有0x00的数据,从机也进入中断了,而且中断标志也是I2C的中断,不是别的中断。

使用特权

评论回复
9
pandatp09|  楼主 | 2014-6-6 14:30 | 只看该作者
lanmp 发表于 2014-6-6 13:34
“发现初始屏幕时,会有很多时候发送0x00数据”
这些数据不是你的程序发的?为什么很吃惊的样子? ...

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

从机地址是0x02,中断方式接收数据。总线上的地址和从机地址相符,单片机才会进入中断,但是发送0x00时候,从机的单片机也响应了,奇怪的是从机地址并不是0x00,但不知道为什么也会响应。

使用特权

评论回复
10
yewuyi| | 2014-6-6 15:11 | 只看该作者
pandatp09 发表于 2014-6-6 14:30
可能是我没说清楚吧,我的意思是“发现初始屏幕时,会有很多时候发送0x00数据,且从机(MCU从机)响应了 ...

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

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

只能是代码有问题了啊!!!

使用特权

评论回复
11
gxliu08| | 2014-6-7 09:41 | 只看该作者
I2C搞定了吗?到底什么原因造成?

使用特权

评论回复
12
伊泽瑞拉| | 2014-6-7 10:07 | 只看该作者
         i2c这东西感觉特别容易出问题   多研究研究吧     

使用特权

评论回复
13
pandatp09|  楼主 | 2014-6-12 11:16 | 只看该作者
gxliu08 发表于 2014-6-7 09:41
I2C搞定了吗?到底什么原因造成?

可能是软件问题吧,但是目前还是没找到什么头绪,想暂时通过多路I2C缓冲切换来缓解。

使用特权

评论回复
14
pandatp09|  楼主 | 2014-6-12 11:17 | 只看该作者
yewuyi 发表于 2014-6-6 15:11
你奇怪,别人不是更奇怪吗?

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

按这样说应该是软件的问题了,但是目前还是没啥头绪,暂时想通过I2C缓冲切换解决,先结贴吧。

使用特权

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

本版积分规则

1

主题

8

帖子

1

粉丝