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时间。
李清林整理 1
Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.
CAN发送问题
【问】
两个CAN节点通信。。一方发送,一方接收。发送方如果没有收到接收方的应答。。、一直就会处于发送状态。。程序会死在那里。。跳不出来。。。不知道是不是这样。
如何跳出来。。谢谢。 【回答】
n n
你自己可以设置一个等待时间,自开始发送起,等待时间到了以后,取消发送。 你可以置起发送位后,不需要等待是否发送成功,去干其它事,程序就不会死在这里了。
【问】
应答是CAN的底层协议吗?置起发送位后。发送方的CAN控制器自身是不是要等待接收方 的控制器的应答。。就是我问的CAN的应答机制。是不是它的底层协议。。。如果收不到应答,CAN就会死在那里??
问题已经解决。我在每次发完后,,再对CAN进行下软件复位。 【回答】
一般的做法是:
n n n
填好数据,置起发送位;
去做其它事,到要发送下一笔前,来检查上一次是否已经发送完; 如果上一笔没有发送完,则决定如何处理:取消发送,或是等待。
李清林整理 2
Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.
超过八个字节如何发送
【问】
现在需要一起发送超过八个字节的 数据。。但是SJA1000的一次最多只能发送八个字节的数据。如何能一次发送超过八个字节的 数据 【回答】
采用分段/重組協議 【问】
能具体一点吗? 【回答】
由发送发拆开,在接收方重组
李清林整理 3
Generated by Foxit PDF Creator © Foxit Softwarehttp://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
李清林整理 4
Generated by Foxit PDF Creator © Foxit Softwarehttp://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暂不定
李清林整理 5
Generated by Foxit PDF Creator © Foxit Softwarehttp://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读自己收到的消息帧的标识符,看最
李清林整理 6
Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.
高为是1就说明是主机要读我的信息;标识符是一条CAN帧必不可少的组成部分,其内容当然可以包含你要传输的数据信息,不过标识符嘛,一般都作为帧标识信息来用。 【问】
^_^,这下明白了,之前我一直以为CAN总线传输数据,标识符只是用来鉴别地址,接收节点收到的只有那8个字节数据,标识符做完地址鉴别后就没有用了,原来节点接收数据后,标识符也可以像数据一样读出来!!这下就知道主机到底是要干嘛了!
呵呵呵呵!谢谢!!
李清林整理 7
Generated by Foxit PDF Creator © Foxit Softwarehttp://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帧数据的寄存器时,数据指针是自动加一的.
李清林整理 8
Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.
李清林整理 9
因篇幅问题不能全部显示,请点此查看更多更全内容