打印

各位好,我使用PIC的IIC从模式,我发现不稳定

[复制链接]
5748|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MIKEZHONG|  楼主 | 2011-11-8 18:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 MIKEZHONG 于 2011-11-8 18:41 编辑

各位好,请教各位

我使用一个PIC16F1937为主,3个PIC16F723为从机,工作时由主机发送命令和数据给3个从机。

主机使用的是软件模拟的IIC,从机是19F723自带的硬件7位从模式。

现在发现的问题是:产品工作一些时间后(10几分钟,或者按键乱按一通后,按键时会发命令),个别从机失控了,再怎么发命令都不听使唤。

我想从机是否存在异常的复位机制,比如说打个比方,当主机发送一个地址写后,数据发送两BIT,余下的不发(模拟干扰情况),从机此时收不到停止信号,而后主机发第二个命令,从机还能正常识别吗?从机会不会进入异常,而导致后续的命令均无**常接收呢? 按我的上面产生的问题的情况是会出现这种情况。

那从机会不会有一个超时从模式复位的功能,就算漏了一个命令,至少下一个要能正常接收。

急请教!
沙发
asspeed| | 2011-11-8 19:46 | 只看该作者
异常处理机制要由用户代码自行实现。

使用特权

评论回复
板凳
MIKEZHONG|  楼主 | 2011-11-8 20:03 | 只看该作者
Asspeed,您好,现在的问题是,当其中之一从机接收失败后,无论主机怎么发命令都不能正确接收到,

如果说只是一次失败,后续能正常接收,那都好办,我都可以像EEPROM一样,写进去后再读出来核对。问题是从机失败一次后,后面怎么给它命令都不能识别,一直没有应签位出现。

使用特权

评论回复
地板
MIKEZHONG|  楼主 | 2011-11-8 20:34 | 只看该作者
我再看了一下I2C规范对从机的要求,其中就有一条?原文不会插图,我就抄到这来。

.....
4. 兼容I2C总线的器件在接收到起始或重复起始条件时必须复位它们的总线逻辑,甚至在这些起始条件没有按照正确的格式放置,它们也都期望发送从机地址。......

难道PIC的从模式还会没有这个功能?

使用特权

评论回复
5
MIKEZHONG|  楼主 | 2011-11-8 20:58 | 只看该作者
哎,仔细看了一下张明峰老师的书,无意中发现个书的错误,问题倒还是没有解决,因为我一般看书,英文规格书个人看不习惯。

第316页, SSPSTAT的S位:

1:表示有收到起始位,但书中的写反了。 1和0的差别,差得远喽。

使用特权

评论回复
6
yewuyi| | 2011-11-9 08:41 | 只看该作者
我再看了一下I2C规范对从机的要求,其中就有一条?原文不会插图,我就抄到这来。

.....
4. 兼容I2C总线的器件在接收到起始或重复起始条件时必须复位它们的总线逻辑,甚至在这些起始条件没有按照正确的格式放置,它 ...
MIKEZHONG 发表于 2011-11-8 20:34


当SDA被从机中的某一个拉死到低电平时,通信往往就会进行不下去,主机发送的任何SDA命令都将被挂死,此时要么是主机定时复位一下所有从机,要么是从机自己进行超时释放SDA,看你的选择了,多数人都是在这个挂死SDA上摔了跟头。

使用特权

评论回复
7
xaq79| | 2011-11-9 09:01 | 只看该作者
完全按照IIC规格要求,肯定不会出错,用示波器抓波形看看

使用特权

评论回复
8
MIKEZHONG|  楼主 | 2011-11-9 11:49 | 只看该作者
yewuyi版主您好,

你说的这个,我觉得是很有道理,也有可能是这个问题,因为它不是每次或经常出现,只是偶尔出现,这种情况像XAQ79兄弟的方法看波形很难得到答案。

主机定时复位总线,要怎样复位总线呢?

谢谢。

使用特权

评论回复
9
yewuyi| | 2011-11-9 12:06 | 只看该作者
yewuyi版主您好,

你说的这个,我觉得是很有道理,也有可能是这个问题,因为它不是每次或经常出现,只是偶尔出现,这种情况像XAQ79兄弟的方法看波形很难得到答案。

主机定时复位总线,要怎样复位总线呢?

谢谢。 ...
MIKEZHONG 发表于 2011-11-9 11:49


百度:IIC总线锁死,看看是否找到你要的答案

使用特权

评论回复
10
MIKEZHONG|  楼主 | 2011-11-9 16:57 | 只看该作者
yewuyi版主,您好,
我在网上搜了很多,看了很多,大体上就是说用SCL线发9个CLK脉冲来解锁。这个容易办到。

我的思路是:因为我要传送的命令和数据并不多,我采取每送命令和数据一次后就将从机中的数据读回来比较,如果是一样就算OK,如果不一样,再检查是否SDA线或SCL线一直为低,如果是则发9个脉冲(或者可不可以说如果检测到发出和读回的不一样,直接就发9个CLK来解锁)。

这样应能基本上做到百分这百通讯成功,不会出现从机不按主机命令行事的问题了。

请大家发表意见。

使用特权

评论回复
11
xaq79| | 2011-11-9 17:20 | 只看该作者
叶版6楼说的很清楚了,仔细研读,
自己加些抗干扰措施肯定就OK了,这个很有必要的,

使用特权

评论回复
12
ledmary| | 2011-11-9 17:24 | 只看该作者
深奥的技术,看不懂的路过。压力很大

使用特权

评论回复
13
xinxi| | 2011-11-9 17:30 | 只看该作者
我觉得 你现在找出错后的复位方法,还不如找怎么会出错,然后解决他,等到所有工作都正常了,再考虑万一 极端情况下出错 要怎么去复位。

使用特权

评论回复
14
MIKEZHONG|  楼主 | 2011-11-9 21:40 | 只看该作者
本帖最后由 MIKEZHONG 于 2011-11-9 21:41 编辑

我现在把主机的模拟的I2C的方式速度降低了10倍,测试200次无误动作,频率约为10K,之前测试100次约有8次不行,速度为100K,

看来速度不能太快了。像高铁一样,速度太快了不行。看来道理都是相通的。

使用特权

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

本版积分规则

51

主题

250

帖子

1

粉丝