[CAN-bus/DeviceNet] CAN总线通信遇到的问题:

[复制链接]
 楼主| 王敬 发表于 2008-12-15 12:46 | 显示全部楼层 |阅读模式
使用2个LPC2378CPU进行CAN总线通信实验,单工情况下速率可以达到320Kb/s,无掉包;但是如果换成全双工模式时,就会掉包 而且很严重,只有当速率减到10Kb/s时 才好。但是全双工模式时 我检测发送正常,而接收的少,发送我使用的是查询,接受采用中断。请问 这个问题怎么解决呢?
lnskngdc 发表于 2008-12-15 17:29 | 显示全部楼层

应用层

个人认为是应用层的问题<br />你在中断里处理什么?是否在此耽误时间太多?导致接收报文个数减少?<br />吞吐量是多少?(每秒发送多少帧)<br />用can卡或分析仪定时1秒发送一次报文试试看<br />
 楼主| 王敬 发表于 2008-12-16 08:58 | 显示全部楼层

2楼

中断里做的就是把接收数据寄存器里的数据放到一个缓冲队列里。如果是中断的问题,那为什么单工的情况下可以呢?<br />我原来是用定时器定时发送的,每毫秒发40个字节,这样单工情况下是没有问题的。但是改成双工就会掉包;后来把速率减为10B/s也会掉。<br />后来我用串口来发,两个板子的串口分别接电脑,然后两板子用CAN总线连起来,串口波特率为115200b/s,我每隔10ms发10个字节,这样才不会掉包,速率在大一点就会掉,很郁闷啊。<br />公司没有CAN卡和分析仪;
lnskngdc 发表于 2008-12-16 09:18 | 显示全部楼层

注意波特率

“我原来是用定时器定时发送的,每毫秒发40个字节,这样单工情况下是没有问题的。”<br /><br />CAN总线:500k的情况下,每帧带8字节数据,发送出一帧CAN报文所需要的时间大概是0.2ms左右,也就是说若想每秒钟发送40字节,你要在500k的波特率情况下才能达到。不知道你是如何实现320k就能发送40字节的。<br />另外:LPC2378如何设置CAN的单工或双工通讯?我没有用过,请赐教。
 楼主| 王敬 发表于 2008-12-16 13:02 | 显示全部楼层

回4楼

CAN的波特率我初始化的为1000Kb/s,难道这种情况还发不了40字节每毫秒,我做过实验,发了12个小时,没有掉包;这是一块板子发,一快板子收;<br />另外,两块板子都发都收,这不是双工模式吗?
lnskngdc 发表于 2008-12-16 13:56 | 显示全部楼层

5

CAN总线是差分电平,总线上同时只能存在一帧报文,在发送的过程中是收不到其他节点的报文的,只有1号发送完毕,2号才能发送。跟传统意义上的双工不同。<br />另外,你在楼主位写道:“使用2个LPC2378CPU进行CAN总线通信实验,单工情况下速率可以达到320Kb/s,无掉包;”跟3楼“我原来是用定时器定时发送的,每毫秒发40个字节”说的不是同一个实验?<br />可以肯定的是你的程序代码应用层肯定存在问题:<br />1.接收报文所用的时间大于发送报文所用的时间<br />2.没有buffer或者buffer太浅,导致溢出<br />3.发送与接收用到相同的数组,待发送数据被接收的覆盖<br />4.缓冲区数组越界,导致报文计数变量丢失
 楼主| 王敬 发表于 2008-12-16 16:55 | 显示全部楼层

回6楼

我同意你的说法:“CAN总线是差分电平,总线上同时只能存在一帧报文,在发送的过程中是收不到其他节点的报文的,只有1号发送完毕,2号才能发送。跟传统意义上的双工不同。”,它是双向的,而不是双工。<br /><br />使用2个LPC2378CPU进行CAN总线通信实验,单工情况下速率可以达到320Kb/s,无掉包;跟3楼&nbsp;我原来是用定时器定时发送的,每毫秒发40个字节,这两个是一个实验;<br /><br />发送和接收缓冲区是大小为4000的循环队列,且不是同一个。接收是在中断中进行的,里面做的只是把接收数据寄存器的数据放到接收循环队列里面。
 楼主| 王敬 发表于 2008-12-16 17:14 | 显示全部楼层

另外

我把总线错误中断,仲裁丢失中断打开后,检测到出现总线错误,错误代码的意思为&nbsp;“其它错误,接收端错误,应答slot”。我从网上看到当优先级一样时,而又都检测到总线空闲,会发生总线错误。<br /><br />后来我又把两断的ID设成不一样的,分别为0x8888888&nbsp;&nbsp;0x0888888,并设置模式寄存器的优先级位为0(根据ID标示符的大小来决定优先级),这样我测试就不会出现总线错误中断,但出现了一次总线仲裁中断0x01&nbsp;意思为“仲裁在标示符的第2位丢失”,这是什么意思啊?<br /><br />用这种方法测试每毫秒发8个字节,也会出现丢包,但有一端是正确的。我认为是总线仲裁丢失,导致发送端的包丢失,是这样吗?<br /><br />总线仲裁中断后,程序上应该怎样处理?
xhtxzxw 发表于 2008-12-16 20:20 | 显示全部楼层

呵呵

整个思路似乎还在传统的串行通信那里啊!<br /><br />任何时候,总线上最多只能有一家处于发送状态.发送最大的一帧(8个字节数据)本身要占用一百多个&quot;位时间&quot;,具体需要的时间还要看是用的基本格式,还是扩展格式.总之是一百多个位时间.在发送过程中还要做总线竞争,仲裁失败了,就得等待下一次竞争机会,竞争总线也需要一些时间,这样算起来,如果使用扩展帧格式,发送8个字节平均大约需要160个&quot;位时间&quot;吧.<br /><br />在LZ的网络里,使用320Kbps的速率,&nbsp;位时间就是1/320毫秒,&nbsp;发送一个最大的扩展数据帧(8个数据字节)大约需要160*1/320毫秒,相当于16个字节/毫秒.<br />用500Kbps的速率的话,&nbsp;就是(500/320)*16&nbsp;=&nbsp;25字节/毫秒.<br />如果只是一家发,没有总线竞争,而且使用基本帧格式,每个帧大约花费120个左右的位时间,依然还是500Kbps的速率,&nbsp;160/120*25=32字节/毫秒<br /><br />现在是两个接点的网络,很都事就出来了!<br />首先假定两家优先级相同,那就竞争吧,仲裁花费的时间就多了!大量的时间花费在仲裁上,速度肯定就上不去了,两家的传输速度都高不了.<br /><br />如果两家的优先级不同,那么优先级高的接点抢到总线的机会就多一些.极端情况下(比如永远不停地有数据要发送),优先级低的接点大多数时候只能干瞪眼了!这是由CAN协议本身的约定限制死了的:我的优先级高,我刚刚发完一帧,我又发现还有数据要发送,我就赶快检测总线,发现它是空闲的,你的优先级低,也几乎同时发现总线是空闲的,那么好了,咱俩通过往总线上发送ID做仲裁!没的说,我的ID小,我仲裁胜出了,你就呆一边去吧,这一帧发完了,后面咱俩继续,还是我赢!所以你就只能一直干瞪眼了!<br /><br />注意上面一句话:我又发现还有数据要发送,我就赶快检测总线.....<br /><br />我&quot;发现....&quot;是要花费时间的,在这段时间之中,总线很可能就变空闲了,你前面一直赢不了我,所以,你有时间早早的&quot;发现......&quot;,当我现在正在&quot;发现....&quot;的时候,你就开始使用总线了,当我终于&quot;发现了....&quot;,再来看总线,总线已经不空闲了,于是,你终于也能赢得总线了!而我,虽然优先级比你高,可我来晚了,只好等了.<br /><br />有一些CAN器件采用所谓&quot;硬件发送缓冲区&quot;,当缓冲区中有多帧数据需要发送时,一旦当前一帧发送完毕,几乎不需要时间判断发送缓冲区是否为空,就可以立即竞争总线,相对来说就很容易出现高优先级的接点过分多的占用总线的情况了.<br /><br /><br />
 楼主| 王敬 发表于 2008-12-17 00:28 | 显示全部楼层

谢谢9楼啊

我CAN总线使用的波特率为1000Kbps,&nbsp;使用的是扩展帧格式,按楼主的算法<br />&quot;用500Kbps的速率的话,&nbsp;就是(500/320)*16&nbsp;=&nbsp;25字节/毫秒&quot;.&nbsp;可以达到50B/s.<br />使用不同的优先级,当两个站点都检测到总线空闲时,优先级高的先发,那优先级底的怎么处理呢?还是这帧信息就丢失了?还是总线以后会自动发这帧信息?还是需要出现总线仲裁中断是需要人为的写代码处理呢?<br />
xhtxzxw 发表于 2008-12-17 21:50 | 显示全部楼层

嘿嘿

完全自动的
 楼主| 王敬 发表于 2008-12-18 18:32 | 显示全部楼层

谢谢 大家

终于可以了,呵呵,现在两边同时发,600字节每30ms也就是160Kb/s,测了一晚上没有掉包,谢谢大家了。两边都是160Kb/s,那么总线的速度是不是320Kb/s?<br />&nbsp;&nbsp;&nbsp;另外设置ID的值,没有什么要求吧?只要都是扩展标示符就可以了吧。
littlef 发表于 2008-12-18 19:43 | 显示全部楼层

请问12楼

&nbsp;&nbsp;&nbsp;“使用2个LPC2378CPU进行CAN总线通信实验”,看来你在进行两个CAN之间的通信,我也正在做两个CAN&nbsp;之间的通信,我想问一下,你的通信是如何具体实现的啊?是不是用通信线直接将两个CAN收发器的接口连接起来,还是还有什么其他的辅助电路?还有,通信线可不可以用实验室的那种细导线代替啊,还是得专门买通信线啊?<br />&nbsp;&nbsp;&nbsp;我是在校学生,现在正在做两个CAN之间通信的实验,刚入门,遇到不少问题,希望不吝赐教!<br />&nbsp;&nbsp;&nbsp;&nbsp;谢谢啊
 楼主| 王敬 发表于 2008-12-19 12:39 | 显示全部楼层

回13楼

随便用什么线都可以,连接时要收发器的CANL相连,CANH相连。就&nbsp;可以了,对了还需要终端电阻。
 楼主| 王敬 发表于 2008-12-19 12:45 | 显示全部楼层

今天把滤波器也加上去了,太爽了

谢谢各位!
littlef 发表于 2008-12-19 12:49 | 显示全部楼层

继续请教啊

&nbsp;&nbsp;&nbsp;&nbsp;需要终端电阻?是不是两端都接上120欧姆的电阻,然后将两个CAN节点挂在上啊?<br />&nbsp;&nbsp;&nbsp;&nbsp;两个CAN之间的通信,除了波特率设置一致外,是不是还要设置同步啊,如何实现呢,是编程呢,还是他会自动同步?
 楼主| 王敬 发表于 2008-12-19 14:56 | 显示全部楼层

回16

有一端接电阻就可以了。<br />同步?不用设置。自动的。
shq1119 发表于 2009-1-8 14:51 | 显示全部楼层

r

学习下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

122

帖子

0

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