"); //-->
本篇文章为转载的,非常感谢这篇文章的作者,在调试程序的时候给了我很多的启发,谢谢。
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的最高三位即可知道接收的数据类型。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。