STM32 CAN 发送和接收过滤原理
来源:互联网 发布:linux一键安装lamp 编辑:程序博客网 时间:2024/06/05 18:12
通过对CANBUS 协议的理解,我们知道:CAN 总线上的节点接收或发送数据都是以帧为单位的!!!CAN 协议规定了好几种帧类型,但是对于我们应用来说,只有数据帧和远程帧可以通过软件编程来控制。(其他几种帧都是由CAN 控制器硬件实现的,我们想管也管不了)。而数据帧和远程帧最大的区别在于:远程帧没有数据域。数据帧分为标准数据帧和扩展数据帧,它们之间最大的区别在于:标识符(ID)长度不同(标准帧为11 位,扩展帧为29 位)。为了能更好地理解下面的内容,让我们先来回忆一下标准数据帧是什么样子的:
StdId
StdId用来设定标准标识符。它的取值范围为 0到 0x7FF。
ExtId
ExtId用来设定扩展标识符。它的取值范围为 0到 0x1FFFFFFF。
IDE
IDE用来设定消息标识符的类型。
IDE 值
IDE
描述
CAN_Id_Standard
使用标准标识符
CAN_Id_Extended
使用扩展标识符
RTR
RTR用来设定待传输消息的帧类型。它可以设置为数据帧或者远程帧。
RTR 值
RTR
描述
CAN_RTR_Data
数据帧
CAN_RTR_Remote
远程帧
DLC
DLC用来设定待传输消息的帧长度。它的取值范围是 0到 0x8。
Data[8]
Data[8]包含了待传输数据,它的取值范围为 0到 0xFF。
先声明一个CanTxMsg 类型的变量,然后按照自己具体的需要,填充此结构变量就可以发送了(帧结构中其他没有填充的部分由硬件自动完成)。
强调:这里的StdId 或者ExtId 是根据自己的实际需要设置的!我们先抛开它们所代表的实际意义,认为它们存在的目的是为了“进攻”。(发送出去让别人过滤)
接下来,我们来看接收,第一个问题就是它是怎样接收的?------过滤!!!无数的初学者都倒在了这里。
STM32 参考手册中提到:bxCAN 控制器为应用程序提供了 14 个位宽可变的、可配置的过滤器组(13~0)。(互联型有28 个)。每个过滤器组的位宽都可以独立配置。可以配置成 16 位或者 32 位。过滤器组还可配置为屏蔽位模式或标识符列表模式。TNND,看起来好像很复杂!
先来理解一句话:共有14个过滤器组,每个过滤器组x由2个32位寄存器,CAN_FxR1和CAN_FxR2组成。
这样的话,就只能过滤出ID 为0x317(与CAN_FxR1 必须一样)和0x00F(与CAN_FxR2 必须一样)两种标准数据帧了。
以上是32 位模式下标识符屏蔽模式和标识符列表模式下的设置方法。在16 位模式下,只不过把两个32 位寄存器拆成了4 个16 位的而已,原理和32 位模式下是一样的。就不赘述了。
接收数据是通过指向CanRxMsg 结构体变量的指针传递的。直接调用 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域。
FMI
FMI设定为消息将要通过的过滤器索引,这些消息存储于邮箱中。该参数取值范围 0到0xFF。
- STM32 CAN 发送和接收过滤原理
- STM32--CAN简单接收和发送
- STM32 CAN 过滤原理(转贴)非常好
- STM32串口中断接收和中断发送
- 邮件发送和接收原理
- 邮件发送和接收原理
- tcp发送和接收的原理
- 邮件发送和接收邮件原理
- STM32 USART 串口 DMA 接收和发送的源码详解!
- STM32 USART串口DMA接收和发送模式
- STM32 USART 串口 DMA 接收和发送的源码详解!
- 利用STM32 的串口来发送和接收数据实验
- STM32 USART 串口 DMA 接收和发送的源码详解!
- STM32 串口通讯 发送 接收
- STM32串口接收发送子程序
- STM32之CAN---接收管理分析
- STM32之CAN---接收管理分析
- STM32之CAN---接收管理分析
- php读取本地文件常用函数
- SQL查询和优化(六)
- 算法--桶排序与基数排序
- PHP 和 AJAX responseXML 实例
- Spark1.6.1单节点环境搭建
- STM32 CAN 发送和接收过滤原理
- JavaEE面试题库分类及答案之五
- 微信小程序 高度占满整个屏幕
- Flex布局中的Flex-Grow无效问题
- IDEA和Eclipse修改注释模板
- java url正则表达式
- Jsoup介绍及解析常用方法
- 【AC自动机-fail树+离线+DFS序+树状数组】BZOJ2434(Noi2011)[阿狸的打字机]题解
- SpringBoot的RabbitMQ消息队列: 三、第二模式"Work queues"