Generated by Foxit PDF Creator . Foxit Software

http://www.foxitsoftware.com For evaluation only.

CAN标识符、过滤器、屏蔽器之间的关系


【问】

看了好多遍数据,也没搞明白 CAN的标识符、 CAN接收过滤器和 CAN接收屏蔽器之间有什么关系,
单独看都明白,一旦联系起来就胡涂了。在一个主控制器对多点通讯网络中,它们各自如何配置,主机要
想发信息给所有的从机,和主机想发信息给某个特定的从机,应该怎么配置这几个寄存器呢?
【回答】

CAN节点通过标识符来识别 CAN帧是不是自己想要的 ,识别方法就是通过滤波屏蔽寄存器的设置来完
成,接收滤波寄存器设置了标识符每位的值 ,接收屏蔽寄存器一般有相同的数量匹配接收滤波寄存器 ,规定接
收滤波寄存器标识符每一位的值是否需要进行匹配 ,比如芯片设置有 6个接收滤波寄存器和 6个接收屏蔽寄
存器,从总线上接收 CAN帧,然后依次将收到的 CAN帧标识符与 6对接收滤波和屏蔽寄存器进行匹配 ,符合
某对接收滤波和屏蔽寄存器要求了 ,就停止匹配 ,将数据接收到对应的缓冲区中 .

例如:设置某接收滤波寄存器 00000000001(11位),接收屏蔽寄存器 11111111101(11位),则该对
组合会拒绝接收 00000000011和 00000000001之外所有的标识符对应的 CAN帧,因为屏蔽器规定第二位
(为 0)以外的所有标识符位要严格匹配(与滤波器值一致),第二位的滤波器值和收到的 CAN标识符第
二位值是否一致都可以。

不同的芯片滤波屏蔽寄存器的运行方式不太一致 ,至少我用过的 AT90CAN128和MCP2515差别就很大 ,
不过原理都一样。
【问】

初学 CAN的朋友应该都会遇到我这样的问题,我的理解是,一个节点向网络中发送一条信息,所有
的节点都能收到,收到后每个节点将收到的标识符自行与自己的比较,符合的才接收,过滤器和屏蔽器决
定标识符中哪些位参与比较,也就是说有些位可以不参与比较就直接接收,这很有用,比如, 11位的标识
符不可能都用来标识下位机号,你一个网络不可能连接那么多节点, 11位的标识符有点浪费,我们可以将
最高 3位用来表示所发送的数据类型,在接收点设置滤波器和屏蔽器只比较节点号部分,先将数据接收下
来,在将最高 3位拿来判断是什么数据,我的试验结果是 RXB0SIDH会被发送端的 TXB0SIDH修改,判
断RXB0SIDH的最高三位即可知道接收的数据类型,以上是我这几天的学习结果,希望大家共同讨论。
【回答】

非常正确!!!!

如果不做这个硬件滤波,也可以使用软件来解析地址,决定是否需要处理收到的报文,不过这就会增
加CPU的开销,所以,合理的设定硬件的 mask & filter,可以节省很多 CPU时间。

李清林整理


Generated by Foxit PDF Creator . Foxit Software

http://www.foxitsoftware.com For evaluation only.

CAN发送问题


【问】

两个 CAN节点通信。
。。一方发送,一方接收。发送方如果没有收到接收方的应答。
。。、一直就会处于发送
状态。。程序会死在那里。。跳不出来。。。不知道是不是这样。

如何跳出来。。谢谢。
【回答】

n你自己可以设置一个等待时间,自开始发送起,等待时间到了以后,取消发送。
n你可以置起发送位后,不需要等待是否发送成功,去干其它事,程序就不会死在这里了。
【问】
应答是 CAN的底层协议吗?置起发送位后。发送方的CAN控制器自身是不是要等待接收方的控制器的
应答。。就是我问的 CAN的应答机制。是不是它的底层协议。。
。。如果收不到应答,CAN就会死在那里??
问题已经解决。我在每次发完后,,再对CAN进行下软件复位。
【回答】
一般的做法是:

n填好数据,置起发送位;
n去做其它事,到要发送下一笔前,来检查上一次是否已经发送完;
n如果上一笔没有发送完,则决定如何处理:取消发送,或是等待。
李清林整理


Generated by Foxit PDF Creator . Foxit Software

http://www.foxitsoftware.com For evaluation only.

超过八个字节如何发送


【问】

现在需要一起发送超过八个字节的数据。。但是 SJA1000的一次最多只能发送八个字节的数据。如何能
一次发送超过八个字节的数据
【回答】

采用分段 /重組協議
【问】
能具体一点吗?
【回答】
由发送发拆开,在接收方重组

李清林整理


Generated by Foxit PDF Creator . Foxit Software

http://www.foxitsoftware.com For evaluation only.

的几个概念,请高手澄清

can

【问】

1、主动错误

2、被动错误

3、位定时

请解释它们的概念和作用;看了不少资料,还是比较模糊,知道的就劳驾了。
【回答】

我就知道的说明如下:

我们说检测到错误,都是针对某一个节点。

1、主动错误 (Error active):当报文在网络上传输时,接受节点检测网络上有错误产生,而不是自己产生的
错误时,就认为是主动错误,这时,节点会发出连续的 6个显性位,连续的 6个显性位会在网络上产生填充
错误,导致网络上所有的节点都会收到此错误,从而将当前正在传送的报文丢掉。

2、被动错误 (Error passive):节点检测到自己出现了错误,而不是网络上的错误,这为被动错误。此时,
节点会发出连续的 6个隐性位,同样产生填充错误,但此错误帧不会影响网络上其它的节点接收数据,除非
此节点为发送报文的节点。

3、关于位定时,可以参考 DND的一篇专门介绍的文章:

http://www.dndev.com/cgi-bin/postpaper.pl?Class=2&ID=56

李清林整理


Generated by Foxit PDF Creator . Foxit Software

http://www.foxitsoftware.com For evaluation only.

上位机的 ID怎么定


【问】
现在我想要用 PLC(上位机)控制 5台变频器(下位机),关于上位机的 ID我不知道怎么定义,因为采

用CAN是标准帧格式, 11位ID这样规定的下位机发送 ID:
1000 0000 002--》PLC读取下位机 1的信息
1000 0000 003-》PLC读取下位机 2信息
1000 0000 004-》PLC读取下位机 3信息
1000 0000 005-》PLC读取下位机 4信息
1000 0000 006-》PLC读取下位机 5信息
我就是不明白:
1、下位机怎么向上位机发送信息,它又不会自己主动发,是靠 PLC先发送指令给下位机,下位机再用相

同的 ID把自己的数据传上去吗?
2、上位机的 ID可怎么定义啊? CAN总线在传输时,节点受到的是数据,这节点 11位标识符不能作为数

据吧?
如果 PLC的ID定义为 1000 0000 002(举例),那其它的下位机发送的信息它怎么收的到呢?
如果屏蔽掉最后一位,不做比较,凡是 1000 0000 00X的节点发过来的信息照单全收,它又如何知道是哪

个节点发过来的信息呢?
万请各位大哥帮我解答一下!谢谢

【问】
又比如,如果 PLC发送 ID为0000 0000 002,则表示 PLC向下位机发送消息。这又是如何实现的呢?
如果下位机向上位机发送数据是先靠上位机发出指令通知,那下位机的 ID到底是 0000 0000 002 还是

1000 0000 002呢(以本系统中下位机 1为例)?
真是搞糊涂了啊!
【问】

主机(上位机)如果是无条件滤波方式下,任意节点都可以向主机发送信息,主机也可以接收任意一节
点发出的信息,是不是主机接收到某一从机(如 0000 0000 003)发出的信息后,主机的标识符也会变成发送
节点的标识符( 0000 0000 003)?
【回答】

对于单主站来说,以你这个简单的协议为例,主机不需要 ID,只需要分配好从站的 ID就可以了。
另外,ID应该由两部分构成,功能码 +站地址。
再以你的例子为例,你可以认为前四码 1000为功能码, 1000表示读从站数据,而中间四码 0000暂不定

李清林整理


Generated by Foxit PDF Creator . Foxit Software

http://www.foxitsoftware.com For evaluation only.

义其意义,而最后三码 001,002等即表示从站的站地址。

那主机发送 1000 0000 0001就表示要读取从站 1的数据,当然你同时必须要定义回复的报文结构,比如
定义前四码为 0100即表示回传数据,那如果从站 1收到主站的读取报文,就会回传一个 0100 0000 001的报
文,表示响应主机的请求。

当然,你还可以定义更多的功能码。

在单主站系统中,你可以不需要定义主站的站地址,因为所有的从站都不会去处理响应的报文,只有主
站会处理。
【回答】

标识符不一定等于节点地址的,节点地址体现在网络中只是一个能够被其它节点识别的标志,在 CAN帧
中有体现就行了。在你这个网络环境里从节点需要这个标志被主节点识别是哪个变频器,主节点 PLC需要这
个标志被变频器识别么,反过来说变频器需要知道谁给我发的命令么?它只要知道这个命令是发给我的,我
返回能够标识自己的数据就可以了,这个过程中变频器只需要知道自己的标识信息就可以了。

举个例子:公司规定员工要写周工作报告,老总需要么?
【问】

呵呵,我真惭愧,两位版主也真有耐心帮我解答。

我接触 CAN才两星期,确实很多都不懂,比较弱,问的问题也很弱,不好意思,辛苦两位版主了。原来
单主站,不需要设置主站 ID,在实际应用中,其 ID被设置为无条件接收所有 ID的请求,即验收滤波位都被
屏蔽了,对吗?

可是我还是有 2点不明白,即,

1、从站发消息给主站,一定是要主站先发命令给他吗?从机能否自己主动发送信息给主站?如果从站可
以主动发,那主站怎么辨别是哪个从机发送的呢?

2、对从机来说,其 ID到底设置成什么呢?如果 PLC发送 0000 0000 0002给变频器 1,他可以收到, PLC
发送 1000 0000 002给他,他照样可以收到,那他的 ID怎么设置?是否前 8位都不做滤波?只对后 3位进行
滤波?

3,从站怎么知道 PLC是发送消息给他还是 PLC要读取他的信息呢?即他怎么知道这 11位标识符的最高
位是 1还是 0?难道是 PLC发送完成后,从机 1读自己的标识符,看最高位是 1 还是 0?标识符也可以作为
数据传输吗?
【回答】

1.不一定,可以,从站把自己的地址信息在帧里体现出来,主站接收到这帧信息不就知道是谁发的了么。
2.设置前几位(比如低三位做地址,高 8位做功能码),地址信息滤波,功能嘛部分放行。
3.在功能码中体现,比如发消息用 0000 0000 001(高位 —低位),读信息用 1000 0000 001(假设低 3位做地
址,高 8位做功能码);标识符是可以读到的, PLC发送完成后,从机 1读自己收到的消息帧的标识符,看最
李清林整理


Generated by Foxit PDF Creator . Foxit Software

http://www.foxitsoftware.com For evaluation only.

高为是 1就说明是主机要读我的信息;标识符是一条 CAN帧必不可少的组成部分,其内容当然可以包含你要
传输的数据信息,不过标识符嘛,一般都作为帧标识信息来用。
【问】

^_^,这下明白了,之前我一直以为 CAN总线传输数据,标识符只是用来鉴别地址,接收节点收到的只
有那 8个字节数据,标识符做完地址鉴别后就没有用了,原来节点接收数据后,标识符也可以像数据一样读
出来!!这下就知道主机到底是要干嘛了!

呵呵呵呵!谢谢!!

李清林整理


Generated by Foxit PDF Creator . Foxit Software

http://www.foxitsoftware.com For evaluation only.

AT90CAN128芯片 MOB邮箱的作用


【问】

Mob0 ——Mob14多个 Mob的作用是什么啊?

而且分了优先级,按什么标准给 Mob分级呢?

我看到大多程序只用两个 Mob0和Mob1,其余 Mob2——Mob14都没有用啊,这些 Mob大部分情况下都
闲置着,没有多大用啊?
【回答】

这是 CPU提供给用户的多个 MessageObject,就像是硬件缓冲区,简单的通讯只用到两个就可以,一个收,
一个发,但复杂的通讯就可能用到多个,尤其是当通讯数据包很密集,而 CPU处理不过来的时候,就要用到
多个缓冲区来先存储收到的报文,再慢慢处理。还有一种情况,就是可以设置多个缓冲区为接收,但每个缓
冲区设置不同的 filter & mask,这样进入各个缓冲区的报文就会按用户的想法分类,免去许多软件解包判断的
麻烦,也可以从硬件滤掉很多不相关的报文,以节省 CPU的处理时间。
【回答】

Mob0-Mob14相当于多个收发缓冲区,根据收发需要设置对应的控制寄存器使用, 15个缓冲区都可以用,
优先级只是个规则一般情况下只是为了防止逻辑冲突,对用户而言可以忽视它。
【回答】

写 CAN部分代码时一定注意 ,在进入 CAN中断首先要缓存 CANPAGE寄存 ,退出中断前一定要恢复
CANPAGE寄存器,否则,有可能正在执行 CAN寄存器操作时进入 CAN中断修改了 CANPAGE寄存器 ,再从中断
出来可就不一定是先前要访问的寄存器了 ,还有需要注意的是 ,在读写 CAN帧数据的寄存器时 ,数据指针是自动
加一的 .

李清林整理


Generated by Foxit PDF Creator . Foxit Software

http://www.foxitsoftware.com For evaluation only.

李清林整理