首页 STM32 CAN接收过滤和发送图文详解

STM32 CAN接收过滤和发送图文详解

举报
开通vip

STM32 CAN接收过滤和发送图文详解 STM32STM32STM32STM32 CANCANCANCAN接收过滤和发送分析 通过对 CANBUS 协议的理解,我们知道:CAN 总线上的节点接收或发送数据都是以帧为单 位的!!!CAN 协议规定了好几种帧类型,但是对于我们应用来说,只有数据帧和远程帧可 以通过软件编程来控制。(其他几种帧都是由 CAN 控制器硬件实现的,我们想管也管不了)。 而数据帧和远程帧最大的区别在于:远程帧没有数据域。数据帧分为标准数据帧和扩展数据 帧,它们之间最大的区别在于:标识符(ID)长度不同(标准帧为 11位,扩展帧为 ...

STM32 CAN接收过滤和发送图文详解
STM32STM32STM32STM32 CANCANCANCAN接收过滤和发送分析 通过对 CANBUS 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 的理解,我们知道:CAN 总线上的节点接收或发送数据都是以帧为单 位的!!!CAN 协议规定了好几种帧类型,但是对于我们应用来说,只有数据帧和远程帧可 以通过软件编程来控制。(其他几种帧都是由 CAN 控制器硬件实现的,我们想管也管不了)。 而数据帧和远程帧最大的区别在于:远程帧没有数据域。数据帧分为标准数据帧和扩展数据 帧,它们之间最大的区别在于:标识符(ID)长度不同(标准帧为 11位,扩展帧为 29 位)。 为了能更好地理解下面的内容,让我们先来回忆一下标准数据帧是什么样子的: 我们首先来看发送: 前面已经强调了 CAN 总线上的节点接收或者发送数据都是以帧为单位。假如我们要发送一个字节的 数据:0x5A,是不是像串口发送数据那样,直接把 0x5A 写入发送缓冲寄存器,然后发送就可以了呢? NO!刚才已经强调了,CAN总线上的数据都是以帧为单位的!!!我们必须按照帧的格式填充它!TNND, 这么复杂?没关系,ST 库函数已经提供了一个结构,我们只需要填充该结构就可以了。我们来看一下 这个结构的样子: typedef struct { uint32_t StdId; //标准帧 ID,如果您要发送扩展帧。可以不管它 uint32_t ExtId; //扩展帧 ID,如果您要发送标准帧。可以不管它 uint8_t IDE; //您是想发送标准帧还是扩展帧? uint8_t RTR; //您是想发送数据帧还是远程帧? uint8_t DLC; // 您想发送数据的长度。 uint8_t Data[8]; //您想要发送的数据。 } CanTxMsg; StdIdStdIdStdIdStdId StdId用来设定标准标识符。它的取值范围为 0到 0x7FF。 ExtIdExtIdExtIdExtId ExtId用来设定扩展标识符。它的取值范围为 0到 0x1FFFFFFF。 IDEIDEIDEIDE IDE用来设定消息标识符的类型。 IDEIDEIDEIDE值 IDEIDEIDEIDE 描述 CAN_Id_Standard 使用标准标识符 CAN_Id_Extended 使用扩展标识符 北极星电子:http://shop100838061.taobao.com/http://shop100838061.taobao.com/http://shop100838061.taobao.com/http://shop100838061.taobao.com/ 提供 USBCAN/PCICAN/CANUSBCAN/PCICAN/CANUSBCAN/PCICAN/CANUSBCAN/PCICAN/CAN协议分析仪等 CANCANCANCAN BUSBUSBUSBUS相关产品 RTRRTRRTRRTR RTR用来设定待传输消息的帧类型。它可以设置为数据帧或者远程帧。 RTRRTRRTRRTR值 RTRRTRRTRRTR 描述 CAN_RTR_Data 数据帧 CAN_RTR_Remote 远程帧 DLCDLCDLCDLC DLC用来设定待传输消息的帧长度。它的取值范围是 0到 0x8。 Data[8]Data[8]Data[8]Data[8] Data[8]包含了待传输数据,它的取值范围为 0到 0xFF。 先声明一个 CanTxMsg类型的变量,然后按照自己具体的需要,填充此结构变量就可 以发送了(帧结构中其他没有填充的部分由硬件自动完成)。 强调:这里的 StdIdStdIdStdIdStdId 或者 ExtIdExtIdExtIdExtId 是根据自己的实际需要设置的!我们先抛开它们所 代表的实际意义,认为它们存在的目的是为了“进攻”。((((发送出去让别人过滤)))) 接下来,我们来看接收,第一个问题就是它是怎样接收的?------过滤!!!无数的初学 者都倒在了这里。 STM32参考手册中提到:bxCAN控制器为应用程序提供了 14 个位宽可变的、可配置的过 滤器组(13~0)。(互联型有 28 个)。每个过滤器组的位宽都可以独立配置。可以配置成 16 位或者 32位。过滤器组还可配置为屏蔽位模式或标识符列表模式。TNND,看起来好像很复杂! 先来理解一句话:共有14个过滤器组,每个过滤器组xxxx由2222个32323232位寄存器,CAN_FxRCAN_FxRCAN_FxRCAN_FxR1111和 CAN_FxRCAN_FxRCAN_FxRCAN_FxR2222组成。 搞定一个过滤器组,其他的都可以以此类推。 我们先来看 1个 32位过滤器-标示符屏蔽的情况 CAN_FxRCAN_FxRCAN_FxRCAN_FxR1111作 IDIDIDID,CAN_FxRCAN_FxRCAN_FxRCAN_FxR2222作屏蔽: 先看图: 这里的 ID是什么意思?难道就是前面所说的发送数据帧里面的 ID?NO!这里的 ID和自己发 送的帧里面的 ID没有一点关系。完全是两个东西,在硬件上属于不同的寄存器。强调:这 里的 IDIDIDID也是根据自己的实际需要设置的!我们先抛开它们所代表的实际意义,认为它 们存在的目的是为了“防守”。((((过滤别人发送过来的帧的 ID)ID)ID)ID) 这里的屏蔽是什么意思?这里的屏蔽和 ID共同配合完成过滤。 这里的映像是什么意思?映像的意思就是假定收到的帧的 ID信息。 下面举个例子,一切都会一目了然: 北极星电子:http://shop100838061.taobao.com/http://shop100838061.taobao.com/http://shop100838061.taobao.com/http://shop100838061.taobao.com/ 提供 USBCAN/PCICAN/CANUSBCAN/PCICAN/CANUSBCAN/PCICAN/CANUSBCAN/PCICAN/CAN协议分析仪等 CANCANCANCAN BUSBUSBUSBUS相关产品 1:假如我们只想收到别人发过来的 ID为 0x317的标准数据帧: 0X317 二进制位:011 0001 0111 那么可以这样设置: CAN_FxR1:0110 0010 111X XXXX XXXX XXXX XXXX X00X (ID) CAN_FxR2:1111 1111 1110 0000 0000 0000 0000 0110 (屏蔽) 这里是我们设置的想要收到的数据帧的 ID。 这里为 1的位,意味着收到的数据帧中相应的 ID位必须和设置的 ID位一样(必须匹 配)。 2:假如我们想收到别人发过来的 ID为 0x310到 0x317的标准数据帧: 那么可以这样设置: CAN_FxR1:0110 0010 xxxX XXXX XXXX XXXX XXXX X00X (ID) CAN_FxR2:1111 1111 0000 0000 0000 0000 0000 0110 (屏蔽) 这里的红色 xxx就代表 000到 111的任意组合。 这里为 0的位,意味着收到的数据帧中的相应位的 ID不一定非要与设置的 ID一样(不 用关心)。 这里红色部分表明必须是标准数据帧。 3:假如我们想收到别人发过来的 ID为 0x000到 0x7FF的标准数据帧: 那么可以这样设置: CAN_FxR1:xxxx xxxx xxxX XXXX XXXX XXXX XXXX X00X (ID) CAN_FxR2:0000 0000 0000 0000 0000 0000 0000 0110 (屏蔽) 接下来看 2个 32位过滤器-标识符列表模式,CAN_FxRCAN_FxRCAN_FxRCAN_FxR1111和 CAN_FxRCAN_FxRCAN_FxRCAN_FxR2222都作为 ID.ID.ID.ID. 这种情况就很简单了。只有收到的帧的 ID必须和 CAN_FxR1或者 CAN_FxR2完全一 样才接收。这样的话,就只能接收两种不同的 ID。 举个例子: 如果我们把 CAN_FxR1和 CAN_FxR2设置为下面的样子。 CAN_FxR1:0110 0010 1110 0000 0000 0000 0000 0000 (ID) CAN_FxR2:0000 0001 1110 0000 0000 0000 0000 0000 (ID) 这样的话,就只能过滤出 ID为 0x317(与 CAN_FxR1必须一样)和 0x00F(与 CAN_FxR2必须一样)两 北极星电子:http://shop100838061.taobao.com/http://shop100838061.taobao.com/http://shop100838061.taobao.com/http://shop100838061.taobao.com/ 提供 USBCAN/PCICAN/CANUSBCAN/PCICAN/CANUSBCAN/PCICAN/CANUSBCAN/PCICAN/CAN协议分析仪等 CANCANCANCAN BUSBUSBUSBUS相关产品 种标准数据帧了。 以上是 32位模式下标识符屏蔽模式和标识符列表模式下的设置方法。 在 16位模式下,只不过把两个 32位寄存器拆成了 4个 16位的而已,原理和 32位模式下是一 样的。就不赘述了。 接收数据是通过指向CanCanCanCanRRRRxMsgxMsgxMsgxMsg 结构体变量的指针传递的。直接调用 CAN_Receive 即可轻松 完成。 typedef struct { uint32_t StdId; uint32_t ExtId; uint8_t IDE; uint8_t RTR; uint8_t DLC; uint8_t Data[8]; uint8_t FMI; } CanRxMsg; CanRxMsg结构与 CanTxMsg差不多。只是多了一个 FMI域。 FMIFMIFMIFMI FMI设定为消息将要通过的过滤器索引,这些消息存储于邮箱中。该参数取值范围 0到 0xFF。 -------------------------------------------------------------- 北极星电子 CANBUS周边产品介绍:欢迎大家咨询了解。 PCI8510:基于 PCI总线的 PC CAN接口卡。CAN控制器为 SJA1000.工业级。收发速度达 8000 帧/秒以上。 USBCAN:基于 USB总线的 PC CAN接口卡。CAN控制器为 SJA1000或者 STM32。并有一路或者两 路 CAN通道。工业级。接收速度可达 7500帧/秒。 CANBUS协议分析仪:基于 USB总线的 CAN协议分析仪。可解析 CANOpen J1939 DeviceNet 协议。 以及常规的 CAN 数据分析。 北极星电子:http://shop100838061.taobao.com/http://shop100838061.taobao.com/http://shop100838061.taobao.com/http://shop100838061.taobao.com/ 提供 USBCAN/PCICAN/CANUSBCAN/PCICAN/CANUSBCAN/PCICAN/CANUSBCAN/PCICAN/CAN协议分析仪等 CANCANCANCAN BUSBUSBUSBUS相关产品 北极星电子:http://shop100838061.taobao.com/http://shop100838061.taobao.com/http://shop100838061.taobao.com/http://shop100838061.taobao.com/ 提供 USBCAN/PCICAN/CANUSBCAN/PCICAN/CANUSBCAN/PCICAN/CANUSBCAN/PCICAN/CAN协议分析仪等 CANCANCANCAN BUSBUSBUSBUS相关产品
本文档为【STM32 CAN接收过滤和发送图文详解】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_278677
暂无简介~
格式:pdf
大小:1MB
软件:PDF阅读器
页数:5
分类:互联网
上传时间:2012-12-31
浏览量:456