最近在使用CAN通信的时候需要用到广播的方式,以前都是点对点的通信方式,两者有一些差别,现将使用方式分享一下。7 K8 R0 v: J" d1 A 应用场景: 现有5台设备,每台设备都有一个ID,点对点通信就是任意两台设备之间都可以通信,实现数据交换,广播方式就是任意一台设备发送数据,所有设备都可以接收到数据。8 C. ?$ e, d" g( N2 E. ~$ d s: g 在点对点通信中,由于每个ID都不相同,任意一台向其中一个ID发送数据时,其他ID不相同的设备直接过滤掉了数据,所以不是该ID的设备是收不到数据的,那么在点对点通信的同时还想发送广播信息怎么办呢?8 V }' S6 ?8 R% m) R/ ], F CAN通信对ID的过滤主要是设置过滤器,STM32的CAN过滤器有两种方式,一种是屏蔽位模式,一种是标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。广播通信采用屏蔽位模式,每一个设备使用屏蔽位其中的一位作为当前ID,并且只对其中一位进行必须匹配,其他为不用关心,这样就可以实现点对点通信和广播通信。当需要点对点通信时直接发送设备ID即可,当需要广播通信时,其中一台设备要向其余几台设备同时发送,那么将其余几台的ID相或以后作为目标ID,直接发送即可。3 R& s% d+ t" V6 M 配置方式如下: CAN_FilterInitStructure.CAN_FilterNumber = 0; //选择CAN过滤器0; s' C( ?. V H. l7 [- m( f CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //初始化为屏蔽模式 CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //选择过滤器为32位+ l5 Z1 s8 {, T( ?& t, N+ U [) S+ k3 `+ _- ] 9 [# ?9 z m2 C9 l2 P CAN_FilterInitStructure.CAN_FilterIdHigh = 0; //高16位 置0 CAN_FilterInitStructure.CAN_FilterIdLow = ID << 3; //过滤器标识号低16位, B9 {$ y3 V. y) {% \; U. @* `: J! F* t CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0; //高16位不关心 CAN_FilterInitStructure.CAN_FilterMaskIdLow = ID << 3; //只对当前为必须关心9 y" c4 {$ J3 ?0 p( M, q ' ~" a, T0 g6 B* w+ Y' L 2 h+ J6 J4 S" `! f- r 该方法中ID的范围不是任意设置的,必须按位设置,设计中选用其中6位作为ID滤波,也即网络中最多6台设备,如果想增加更多设备,就需要增加更多ID位,最多不超过32位,这是最大劣势。 # H" v6 P7 S) n8 p& w 现在有5台设备,各设备ID分别是1<<0 , 1<<1 , 1<<2 , 1<<3, 1<<4, 1<<5。 广播地址是0x1f。& J5 G, l- f# k8 C. f3 A, q C: F 将以地址0x1f发送数据时,5台设备将同时接收到数据。3 j- N' x4 s* v. F/ W0 D/ N 9 h8 f# A/ w- W3 e: ?# x( l4 F# F' z. a |
canå ¥é¨æç¨.pdf
下载1.82 MB, 下载次数: 32
可以这么说
下载错了。还合计你这个是个人所写文章呢