打印
[CAN-bus/DeviceNet]

CAN总线通信遇到的问题:

[复制链接]
4570|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
王敬|  楼主 | 2008-12-15 12:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
lnskngdc| | 2008-12-15 17:29 | 只看该作者

应用层

个人认为是应用层的问题
你在中断里处理什么?是否在此耽误时间太多?导致接收报文个数减少?
吞吐量是多少?(每秒发送多少帧)
用can卡或分析仪定时1秒发送一次报文试试看

使用特权

评论回复
板凳
王敬|  楼主 | 2008-12-16 08:58 | 只看该作者

2楼

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

使用特权

评论回复
地板
lnskngdc| | 2008-12-16 09:18 | 只看该作者

注意波特率

“我原来是用定时器定时发送的,每毫秒发40个字节,这样单工情况下是没有问题的。”

CAN总线:500k的情况下,每帧带8字节数据,发送出一帧CAN报文所需要的时间大概是0.2ms左右,也就是说若想每秒钟发送40字节,你要在500k的波特率情况下才能达到。不知道你是如何实现320k就能发送40字节的。
另外:LPC2378如何设置CAN的单工或双工通讯?我没有用过,请赐教。

使用特权

评论回复
5
王敬|  楼主 | 2008-12-16 13:02 | 只看该作者

回4楼

CAN的波特率我初始化的为1000Kb/s,难道这种情况还发不了40字节每毫秒,我做过实验,发了12个小时,没有掉包;这是一块板子发,一快板子收;
另外,两块板子都发都收,这不是双工模式吗?

使用特权

评论回复
6
lnskngdc| | 2008-12-16 13:56 | 只看该作者

5

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

使用特权

评论回复
7
王敬|  楼主 | 2008-12-16 16:55 | 只看该作者

回6楼

我同意你的说法:“CAN总线是差分电平,总线上同时只能存在一帧报文,在发送的过程中是收不到其他节点的报文的,只有1号发送完毕,2号才能发送。跟传统意义上的双工不同。”,它是双向的,而不是双工。

使用2个LPC2378CPU进行CAN总线通信实验,单工情况下速率可以达到320Kb/s,无掉包;跟3楼 我原来是用定时器定时发送的,每毫秒发40个字节,这两个是一个实验;

发送和接收缓冲区是大小为4000的循环队列,且不是同一个。接收是在中断中进行的,里面做的只是把接收数据寄存器的数据放到接收循环队列里面。

使用特权

评论回复
8
王敬|  楼主 | 2008-12-16 17:14 | 只看该作者

另外

我把总线错误中断,仲裁丢失中断打开后,检测到出现总线错误,错误代码的意思为 “其它错误,接收端错误,应答slot”。我从网上看到当优先级一样时,而又都检测到总线空闲,会发生总线错误。

后来我又把两断的ID设成不一样的,分别为0x8888888  0x0888888,并设置模式寄存器的优先级位为0(根据ID标示符的大小来决定优先级),这样我测试就不会出现总线错误中断,但出现了一次总线仲裁中断0x01 意思为“仲裁在标示符的第2位丢失”,这是什么意思啊?

用这种方法测试每毫秒发8个字节,也会出现丢包,但有一端是正确的。我认为是总线仲裁丢失,导致发送端的包丢失,是这样吗?

总线仲裁中断后,程序上应该怎样处理?

使用特权

评论回复
9
xhtxzxw| | 2008-12-16 20:20 | 只看该作者

呵呵

整个思路似乎还在传统的串行通信那里啊!

任何时候,总线上最多只能有一家处于发送状态.发送最大的一帧(8个字节数据)本身要占用一百多个"位时间",具体需要的时间还要看是用的基本格式,还是扩展格式.总之是一百多个位时间.在发送过程中还要做总线竞争,仲裁失败了,就得等待下一次竞争机会,竞争总线也需要一些时间,这样算起来,如果使用扩展帧格式,发送8个字节平均大约需要160个"位时间"吧.

在LZ的网络里,使用320Kbps的速率, 位时间就是1/320毫秒, 发送一个最大的扩展数据帧(8个数据字节)大约需要160*1/320毫秒,相当于16个字节/毫秒.
用500Kbps的速率的话, 就是(500/320)*16 = 25字节/毫秒.
如果只是一家发,没有总线竞争,而且使用基本帧格式,每个帧大约花费120个左右的位时间,依然还是500Kbps的速率, 160/120*25=32字节/毫秒

现在是两个接点的网络,很都事就出来了!
首先假定两家优先级相同,那就竞争吧,仲裁花费的时间就多了!大量的时间花费在仲裁上,速度肯定就上不去了,两家的传输速度都高不了.

如果两家的优先级不同,那么优先级高的接点抢到总线的机会就多一些.极端情况下(比如永远不停地有数据要发送),优先级低的接点大多数时候只能干瞪眼了!这是由CAN协议本身的约定限制死了的:我的优先级高,我刚刚发完一帧,我又发现还有数据要发送,我就赶快检测总线,发现它是空闲的,你的优先级低,也几乎同时发现总线是空闲的,那么好了,咱俩通过往总线上发送ID做仲裁!没的说,我的ID小,我仲裁胜出了,你就呆一边去吧,这一帧发完了,后面咱俩继续,还是我赢!所以你就只能一直干瞪眼了!

注意上面一句话:我又发现还有数据要发送,我就赶快检测总线.....

我"发现...."是要花费时间的,在这段时间之中,总线很可能就变空闲了,你前面一直赢不了我,所以,你有时间早早的"发现......",当我现在正在"发现...."的时候,你就开始使用总线了,当我终于"发现了....",再来看总线,总线已经不空闲了,于是,你终于也能赢得总线了!而我,虽然优先级比你高,可我来晚了,只好等了.

有一些CAN器件采用所谓"硬件发送缓冲区",当缓冲区中有多帧数据需要发送时,一旦当前一帧发送完毕,几乎不需要时间判断发送缓冲区是否为空,就可以立即竞争总线,相对来说就很容易出现高优先级的接点过分多的占用总线的情况了.


使用特权

评论回复
10
王敬|  楼主 | 2008-12-17 00:28 | 只看该作者

谢谢9楼啊

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

使用特权

评论回复
11
xhtxzxw| | 2008-12-17 21:50 | 只看该作者

嘿嘿

完全自动的

使用特权

评论回复
12
王敬|  楼主 | 2008-12-18 18:32 | 只看该作者

谢谢 大家

终于可以了,呵呵,现在两边同时发,600字节每30ms也就是160Kb/s,测了一晚上没有掉包,谢谢大家了。两边都是160Kb/s,那么总线的速度是不是320Kb/s?
   另外设置ID的值,没有什么要求吧?只要都是扩展标示符就可以了吧。

使用特权

评论回复
13
littlef| | 2008-12-18 19:43 | 只看该作者

请问12楼

   “使用2个LPC2378CPU进行CAN总线通信实验”,看来你在进行两个CAN之间的通信,我也正在做两个CAN 之间的通信,我想问一下,你的通信是如何具体实现的啊?是不是用通信线直接将两个CAN收发器的接口连接起来,还是还有什么其他的辅助电路?还有,通信线可不可以用实验室的那种细导线代替啊,还是得专门买通信线啊?
   我是在校学生,现在正在做两个CAN之间通信的实验,刚入门,遇到不少问题,希望不吝赐教!
    谢谢啊

使用特权

评论回复
14
王敬|  楼主 | 2008-12-19 12:39 | 只看该作者

回13楼

随便用什么线都可以,连接时要收发器的CANL相连,CANH相连。就 可以了,对了还需要终端电阻。

使用特权

评论回复
15
王敬|  楼主 | 2008-12-19 12:45 | 只看该作者

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

谢谢各位!

使用特权

评论回复
16
littlef| | 2008-12-19 12:49 | 只看该作者

继续请教啊

    需要终端电阻?是不是两端都接上120欧姆的电阻,然后将两个CAN节点挂在上啊?
    两个CAN之间的通信,除了波特率设置一致外,是不是还要设置同步啊,如何实现呢,是编程呢,还是他会自动同步?

使用特权

评论回复
17
王敬|  楼主 | 2008-12-19 14:56 | 只看该作者

回16

有一端接电阻就可以了。
同步?不用设置。自动的。

使用特权

评论回复
18
shq1119| | 2009-1-8 14:51 | 只看该作者

r

学习下

使用特权

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

本版积分规则

47

主题

122

帖子

0

粉丝