stm32 CAN 通讯滤波 看了那么多 这个弄懂了

语言生动形象,让人一看就懂。

STM32 CAN发送和接收过滤原理

通过对 CANBUS 协议的理解 , 我们知道 : CAN 总线上的节点接收或发送数据都是以帧为单位的 ! ! ! CAN 协议规定了好几种帧类型,但是对于我们应用来说,只有数据帧和远程帧可以通过软件编程来控制 。 ( 其他几种帧都是由 CAN 控制器硬件实现的 , 我们想管也管不了 ) 。而数据帧和远程帧最大的区别在于 : 远程帧没有数据域 。 数据帧分为标准数据帧和扩展数据帧,它们之间最大的区别在于:标识符 (ID) 长度不同(标准帧为 11 位,扩展帧为 29 位 ) 。为了能更好地理解下面的内容,让我们先来回忆一下标准数据帧是什么样子的:
0.png
0.jpg0.jpg0.png
1 :假如我们只想收到别人发过来的 ID 为 0x317 的标准数据帧:
0X317 二进制位: 011 0001 0111
那么可以这样设置 :
0.png0.png

种标准数据帧了。
以上是 32 位模式下标识符屏蔽模式和标识符列表模式下的设置方法。
在 16 位模式下,只不过把两个 32 位寄存器拆成了 4 个 16 位的而已,原理和 32 位模式下是一样的。就不赘述了。
接收数据是通过指向 Can Can Can Can R R R R xMsg xMsg xMsg xMsg 结构体变量的指针传递的。直接调用 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 。

猜你喜欢

转载自blog.csdn.net/Soonjn/article/details/103267906