打印
[CAN-bus/DeviceNet]

can总线研究历程与所遇问题

[复制链接]
4083|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hsongjiang|  楼主 | 2007-10-10 15:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我从老板那里接到CAN总线任务(用于某工程项目),该任务分为两部分:一部分是:从ADLINK公司买的PCI-7841,插在PC机上,作为上机位,主控中心。第二部分:是用51单片机+sja1000+6N137搞的三个节点。
  时间安排:
      第一部分:花了7天时间,利用PCI-7841提供的驱动,用vc搞了一个can总线发送、接收界面。
      第二部分:开始制板、写程序,花了10天时间,

大概20天时间,联机通信正常。也就是能正常接收数据和发送数据。比如我给老板演示:主机给板子一发送数据,板子一接收数据后,根据数据内容,由板子一发送给板子二数据,板子二再根据数据驱动它旁边的LED闪亮。本以为这样可以交差。
   但郁闷的事来了,老板要求再演示:板子一(发送id=0):周期5ms 00 到 7f的数据。板子二(发送id=1):以周期20ms同样发送00 到 7f的数据。板子三(发送id=3):接收id0和id1的数据。然后相加,再传到pc机上。(先pc机发送id=2的数据。板子一和板子二接收到数据后启动各自的定时器,然后周期发送数据)
   整个工程就这样,很简单,就是做不出来。
   问题现象:id0和id1发送应该在没隔20ms要冲突。冲突时他们相加的结果id3出错。它先是重发上一次相加的结果,紧接着发送现在的结果,大概过了几十桢后又正常了。如果首先发送时错位2.5ms。也就是认为保证其不发送冲突,就没问题。具体细节难以描述,请看附件pc机上接收到的数据。我在这个地方,郁闷了33天。大把的青春啊,郁闷,并且还没进展。具体程序我也贴出来,望斑竹、以及各位高手相助。
                                                              谢谢
          
相关链接:https://bbs.21ic.com/upfiles/img/200710/20071010154828978.rar

相关帖子

沙发
hsongjiang|  楼主 | 2007-10-10 15:52 | 只看该作者

貌似一次只能上传一个文件

使用特权

评论回复
板凳
hsongjiang|  楼主 | 2007-10-10 15:56 | 只看该作者

还来个文件

第一个文件是:pc机上接收到的数据,保存为.txt文件
第二个 板子三(id=3) keilc程序
现在这个是: 板子一和二 keilc程序 两个基本相同 只是定时器数值设立不同而已。
相关链接:https://bbs.21ic.com/upfiles/img/200710/2007101015563294.rar

使用特权

评论回复
地板
zlgCAN| | 2007-10-13 08:42 | 只看该作者

看了你的说法,建议检查总线上数据流量是否达到或超过警

     猜测可能过度地仲裁导致出现此类数据延迟现象。

使用特权

评论回复
5
wxj1952| | 2007-10-13 19:04 | 只看该作者

书上有现成的类似例子。

这么简单的要求!自己第一次做可能感觉很难,但是一看答案,“这么简单,我怎么就没想到?”

在《时间触发......》那本书上。如果要是会用Keil C上带的RTX51TNY,连书都不用看了。3个节点,先统一时钟,然后利用IVL间隔参数同步计时。PC机对节点的每个帧,都被节点用作网络时统信号.

使用特权

评论回复
6
wxj1952| | 2007-10-13 23:05 | 只看该作者

很简单

让ID:0数据帧从8888....开始发送,(每隔20ms)结果发现全部正常。
让ID:0数据帧从0~7~0~7循环发送,结果发现全部不正常。

结论:程序错误!

使用特权

评论回复
7
hsongjiang|  楼主 | 2007-10-22 14:59 | 只看该作者

问题还是没完全解决。

由于其他的事耽误了,CAN总线丢了十几天,现在GO ON。首先非常感谢zlgCAN和wxj1952 两位前辈的指点,你们的回应让我非常激动。我今天根据两位的各自提的意见做了几个实验。
1.“过度地仲裁”  我把发送id=3的节点变成可以接收所有id。但情况没有好转。
2.“数据流量是否达到或超过警戒线”不是很懂,500kps远在1Mps之下,应该没问题吧。
3.“让ID:0数据从88......全正常。让ID:...全不正常。”我也做了相关实验。发现id=0 和id=1 在pc机 都是从00~FF接收都数据啊,一点错都没有。
 具体情况还是:如果不要延时,也就是id=0 和id=1接收到pc机id=2的命令后都同时启动定时器。其中id=1以定时5ms发送数据,id=0以定时20ms发送。板子3同时接收id=0和id=1的数据,但只有接收到id=1,就相加两数然后发送id=3的数据。大概数据情况如:(三个节点都是单次发送方式,出错也不重发)
 .........................................
  ID:1   LENTH 8   DATA:0  0  0  0  0  0  0  0  
  ID:3   LENTH 8   DATA:0  0  0  0  0  0  0  0  
  ID:1   LENTH 8   DATA:1  1  1  1  1  1  1  1  
  ID:3   LENTH 8   DATA:1  1  1  1  1  1  1  1  
  ID:1   LENTH 8   DATA:2  2  2  2  2  2  2  2  
  ID:3   LENTH 8   DATA:2  2  2  2  2  2  2  2  
  ID:0   LENTH 8   DATA:0  0  0  0  0  0  0  0  
  ID:1   LENTH 8   DATA:3  3  3  3  3  3  3  3  
  ID:3   LENTH 8   DATA:2  2  2  2  2  2  2  2 //出错 多发一帧
  ID:3   LENTH 8   DATA:3  3  3  3  3  3  3  3  
  ID:1   LENTH 8   DATA:4  4  4  4  4  4  4  4  
  ID:3   LENTH 8   DATA:4  4  4  4  4  4  4  4  
  ID:1   LENTH 8   DATA:5  5  5  5  5  5  5  5  
  ID:3   LENTH 8   DATA:5  5  5  5  5  5  5  5  
  ID:1   LENTH 8   DATA:6  6  6  6  6  6  6  6  
  ID:3   LENTH 8   DATA:6  6  6  6  6  6  6  6  
  ID:0   LENTH 8   DATA:1  1  1  1  1  1  1  1  
  ID:1   LENTH 8   DATA:7  7  7  7  7  7  7  7  
  ID:3   LENTH 8   DATA:6  6  6  6  6  6  6  6   //出错 多发一帧

  ID:3   LENTH 8   DATA:7  7  7  7  7  7  7  7  //也没相加
  ID:1   LENTH 8   DATA:8  8  8  8  8  8  8  8  
  ID:3   LENTH 8   DATA:8  8  8  8  8  8  8  8 

一直到 ID=0 到了9 后才正常。
  ID:1   LENTH 8   DATA:24  24  24  24  24  24  24  24  
  ID:3   LENTH 8   DATA:24  24  24  24  24  24  24  24  
  ID:1   LENTH 8   DATA:25  25  25  25  25  25  25  25  
  ID:3   LENTH 8   DATA:25  25  25  25  25  25  25  25  
  ID:1   LENTH 8   DATA:26  26  26  26  26  26  26  26  
  ID:3   LENTH 8   DATA:26  26  26  26  26  26  26  26  
  ID:0   LENTH 8   DATA:9  9  9  9  9  9  9  9   //这个地方正常了,后面的都正常了(前面的好像id=0的数据,节点3一直没接收到 ) 
  ID:1   LENTH 8   DATA:27  27  27  27  27  27  27  27 
  ID:3   LENTH 8   DATA:30  30  30  30  30  30  30  30  
  ID:1   LENTH 8   DATA:28  28  28  28  28  28  28  28  
  ID:3   LENTH 8   DATA:31  31  31  31  31  31  31  31  
  ID:1   LENTH 8   DATA:29  29  29  29  29  29  29  29  
  ID:3   LENTH 8   DATA:32  32  32  32  32  32  32  32 
 
如果id=1延时17.5ms,也就是id=0 和id=1接收到pc机id=2的命令,id=0马上启动,而id=1延时17.5ms在启动定时器,这样避免冲突。
结果是:前面六百多帧都正常
 ID:0  LENTH 8  DATA: 0 0 0 0 0 0 0 0
 ID:1  LENTH 8  DATA: 0 0 0 0 0 0 0 0
 ID:3  LENTH 8  DATA: 0 0 0 0 0 0 0 0
 ID:1  LENTH 8   DATA: 1 1 1 1 1 1 1 1
 ID:3  LENTH 8   DATA: 1 1 1 1 1 1 1 1
 ID:1 LENTH 8   DATA: 2 2 2 2 2 2 2 2
 ID:3 LENTH 8   DATA: 2 2 2 2 2 2 2 2
 ID:1 LENTH 8   DATA: 3 3 3 3 3 3 3 3
 ID:3 LENTH 8   DATA: 3 3 3 3 3 3 3 3
 ID:0 LENTH 8   DATA: 1 1 1 1 1 1 1 1
 ID:1 LENTH 8   DATA: 4 4 4 4 4 4 4 4
 ID:3 LENTH 8   DATA: 5 5 5 5 5 5 5 5
...............................................
  ID:1   LENTH 8   DATA:27  27  27  27  27  27  27  27  
  ID:0   LENTH 8   DATA:4a  4a  4a  4a  4a  4a  4a  4a  
  ID:3   LENTH 8   DATA:71  71  71  71  71  71  71  71  
  ID:1   LENTH 8   DATA:28  28  28  28  28  28  28  28  
  ID:3   LENTH 8   DATA:72  72  72  72  72  72  72  72  
  ID:1   LENTH 8   DATA:29  29  29  29  29  29  29  29  
  ID:3   LENTH 8   DATA:73  73  73  73  73  73  73  73  
  ID:1  LENTH 8   DATA:2a  2a  2a  2a  2a  2a  2a  2a  
  ID:3   LENTH 8   DATA:74  74  74  74  74  74  74  74 //前面正常
  ID:1   LENTH 8   DATA:2b  2b  2b  2b  2b  2b  2b  2b  
  ID:0   LENTH 8   DATA:4b  4b  4b  4b  4b  4b  4b  4b  
  ID:3   LENTH 8   DATA:74  74  74  74  74  74  74  74  //跟上一帧数据一样了,出错
  ID:3   LENTH 8   DATA:77  77  77  77  77  77  77  77  
  ID:1   LENTH 8   DATA:2d  2d  2d  2d  2d  2d  2d  2d  
  ID:3   LENTH 8   DATA:78  78  78  78  78  78  78  78  
  ID:1   LENTH 8   DATA:2e  2e  2e  2e  2e  2e  2e  2e  
  ID:3   LENTH 8   DATA:79  79  79  79  79  79  79  79 
  ID:1   LENTH 8   DATA:2f  2f  2f  2f  2f  2f  2f  2f  
  ID:0   LENTH 8   DATA:4c  4c  4c  4c  4c  4c  4c  4c
  ID:3   LENTH 8   DATA:79  79  79  79  79  79  79  79  //跟上一帧数据一样了,出错;
  ID:1   LENTH 8   DATA:30  30  30  30  30  30  30  30  
  ID:3   LENTH 8   DATA:7c  7c  7c  7c  7c  7c  7c  7c 
 .................................

至于wxj1952说的时间同步问题,我还没去好好研究。我只想先知道,首先这里到底是那个地方错误,是同步问题吗?

使用特权

评论回复
8
hsongjiang|  楼主 | 2007-10-22 15:59 | 只看该作者

出错原因

 我硬件情况:51板上,采用的是20M的时钟频率。定时5ms,不能除尽,也就是多运行段时间应该有相移。

我自我推断: 肯定是发送Id=3的节点冲突机制没有解决,因为如上面的,当id=1向后延时17.5ms后再启动,也就是保证id=0 和Id=1不发生冲突, 让它运行1分多种,大概1万多帧,发现每过600百多帧出错然后正常。但是以我的理解,冲突/出错完全是硬件自动完成。 所以这个地方我真的不知道为什么?
欢迎大家给我提建议,在此先感谢了。

使用特权

评论回复
9
hsongjiang|  楼主 | 2007-10-22 20:32 | 只看该作者

水落石出

罪魁祸首:
   我在接收子程序了中多加了一条:if(StatusReg&0x10==0)然后才接收数据。删掉这条语句即可。 任务完毕!
                  
                                                  谢谢大家。
                                                  2007.10.22

使用特权

评论回复
10
jb123456| | 2007-11-18 00:26 | 只看该作者

CAN 问题

if(StatusReg&0x10==0)然后才接收数据。删掉这条语句即可。 任务完毕!
                  
这句应该有阿???

 我现正在调试CAN总线,用的是 89s52 SJA1000  82C250。2个板子互相发送接收。
有时候2者都工作正常,但是当1个板子,停止工作1段时间,在恢复工作,2者都不能工作。
从砖台寄存器看为 0x04 中断指示寄存器为 0x82,TCS !=1 总线出现错误。重新初始化只
能短时恢复接收Buffer (3次)但也不能正确发送数据。
为什么?
总线出错怎么恢复?
请教网上各位了!!!

使用特权

评论回复
11
cocorocky| | 2010-10-10 17:12 | 只看该作者
楼主,你的源程序还在吗?想学习下你的程序,不知方便?
xuxiaoqiang0807@163.com

使用特权

评论回复
12
ysc3107| | 2011-4-30 18:44 | 只看该作者
LZ的三节点源程序能给我发一个么?正在学习CAN,希望能得到一些帮助!ysc3107@163.com谢谢楼主了!

使用特权

评论回复
13
lvyunzeng| | 2011-5-6 10:48 | 只看该作者
楼主你好,最近在做CAN的入门学习,希望能得到您的技术资料,如果方便的话!

使用特权

评论回复
14
1021256354| | 2012-4-8 23:32 | 只看该作者
正在学习CAN,希望能得到一些帮助!z1021256354@163.com谢谢楼主了!

使用特权

评论回复
15
liuxinghua521| | 2012-6-4 10:23 | 只看该作者
刚开始接触CAN通信,虽然看的有点晕乎,还是学习了~~

使用特权

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

本版积分规则

2

主题

11

帖子

0

粉丝