硬汉嵌入式论坛

 找回密码
 立即注册
查看: 281|回复: 5
收起左侧

[有问必答] CAN设置为16位滤波器——标识符屏蔽模式时,其中的EXTID[17:15]如何设置?

[复制链接]

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 2024-5-9 23:55:13 | 显示全部楼层 |阅读模式
有一个问题请教一下,看是否我理解有误:
若CAN采用11位的标准ID,发送头的设置为:
  TxHeader.StdId = 0x0321;
  TxHeader.RTR = CAN_RTR_DATA;     // 数据帧
  TxHeader.IDE = CAN_ID_STD;         // 11位标准ID
  TxHeader.TransmitGlobalTime = DISABLE;  
  TxHeader.DLC = 4;  
由于发送数据帧没有使用到扩展ID,此时滤波器设置为16位滤波器——标识符屏蔽模式,那问题是其中的EXTID[17:15]如何设置呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107970
QQ
发表于 2024-5-10 08:54:34 | 显示全部楼层
标准库这个地方设计的非常不好,需要用户手动做偏移计算。

例如,如果你想要接收EXTID为0x20000到0x27FFF的消息,你可以设置滤波器的高16位(FilterIdHigh)和低16位(FilterIdLow)来匹配这个范围。具体的设置方法如下

[C] 纯文本查看 复制代码
CAN_FilterInitTypeDef CAN_FilterInitStructure;

// 16位滤波器配置
CAN_FilterInitStructure.CAN_FilterNumber = 0; // 选择滤波器编号
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; // 标识符屏蔽模式
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit; // 16位滤波器

// 根据需要接收的EXTID范围设置ID和掩码
CAN_FilterInitStructure.CAN_FilterIdHigh = (0x20000 << 5) >> 16; // EXTID[17:15]设置为'001'
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; // 其他位设置为0
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (0x07FFF << 5) >> 16; // 掩码设置为'0011111111111111'
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; // 其他位设置为0

CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; // 分配到FIFO 0
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; // 激活滤波器

CAN_FilterInit(&CAN_FilterInitStructure);




在上面的代码中,CAN_FilterIdHigh和CAN_FilterMaskIdHigh的设置决定了EXTID[17:15]的匹配规则。这个例子中,滤波器将会接收EXTID[17:15]为001的所有CAN消息1。

回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-5-10 10:20:53 | 显示全部楼层
可能我的问题没有描述清楚:我的发送端、接收端使用的是CAN 2.0A 的 11位的标准帧格式,没有用到EXTID,那滤波器怎么设置?
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-5-10 22:32:00 | 显示全部楼层
eric2013 发表于 2024-5-10 08:54
标准库这个地方设计的非常不好,需要用户手动做偏移计算。

例如,如果你想要接收EXTID为0x20000到0x27FF ...

我的意思是:若使用CAN 2.0A规范(11位标识符)发送如下的数据帧时,因为此帧中没有用到18位的EXTID,那么问题来了,此时过滤器(16位滤波器——标识符屏蔽模式)中的EXTID[17:15]依据什么来设置呢?


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107970
QQ
发表于 2024-5-11 08:12:45 | 显示全部楼层
shaodong821 发表于 2024-5-10 22:32
我的意思是:若使用CAN 2.0A规范(11位标识符)发送如下的数据帧时,因为此帧中没有用到18位的EXTID,那 ...

他这个过滤器含义是这样的。

我们以2个16位过滤器---标识符屏蔽为例进行说明:


将过滤器寄存器分成两个部分,标识符寄存器和屏蔽位寄存器。
上面截图中ID部分就是标识符寄存器,屏蔽部分就是屏蔽位寄存器。
比如
ID    : 0xFED0;
屏蔽:0xFFE0;
那就是表示,接收端接受帧数据时,前11位的数值必须跟ID中定义的前11位一致,后面的5位数据忽略。
不管是什么值都可以。也即是说屏蔽位中的数值:
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-5-11 10:50:59 | 显示全部楼层
eric2013 发表于 2024-5-11 08:12
他这个过滤器含义是这样的。

我们以2个16位过滤器---标识符屏蔽为例进行说明:

哦,直接忽略掉就行了,是我想复杂了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-21 02:51 , Processed in 0.203525 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表