打印

STM32 CAN 过滤器的疑问,求解答

[复制链接]
7383|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位大侠:
最近在搞CAN(STM32F105)。阅读的资料为:ST官方的固件库说明和用户手册,固件库版本V3.5。
关于过滤器的设计:
官方例程中:接收的CAN1配置成如下:
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x6420;
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;

发送端CAN2配置成如下,
  TxMessage.StdId = 0x321;
  TxMessage.ExtId = 0x01;
  TxMessage.RTR = CAN_RTR_DATA;
  TxMessage.IDE = CAN_ID_STD;
  TxMessage.DLC = 1;
1问:TxMessage.StdId = 0x321是如何与CAN1的过滤器配成对的?
例程中又将CAN2接收端配置为
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x2460;
而CAN1发送配置不变。
2问:这就奇怪了,TxMessage.StdId = 0x321又是如何与CAN2的过滤器配成对的?

官方的例程见附件。求助各路大侠和香版主!

DualCAN.rar

14.2 KB

沙发
捡漏王子| | 2012-8-16 09:16 | 只看该作者
1、CAN1的StdId=0x321与CAN2的接收滤波是一致的
0x321:001100100001
0x642:  011001000010
注意标准帧 帧的结构,仔细看下文档就清楚了。
2、CAN2的stdid不需要与自己的过滤器配对,掩码只是针对接收而言的。CAN2的掩码是关于需要接收的

使用特权

评论回复
板凳
IJK| | 2012-8-16 10:38 | 只看该作者
本帖最后由 IJK 于 2012-8-16 10:39 编辑

LZ需要看STM32的reference manual,看中文的也可以。
关键要看CAN的 Filter的数据结构,如下:


发送端CAN2配置成如下,
  TxMessage.StdId = 0x321;
  TxMessage.IDE = CAN_ID_STD;
说明发送端使用的是标准ID【11位】,为 011  0010 0001【低位对齐到bit0】
根据上图Filter的数据结构,接收端FilterIdHigh【高16位】应该为:
0110 0100  0010 0000 【STID对齐到bit15】,即对应于接收端 CAN_FilterIdHigh = 0x6420;

使用特权

评论回复
地板
飞絮飘飘| | 2012-8-16 14:35 | 只看该作者
过滤器的低3位对应IDE,RTR和一个无关位,我认为不能叫32位,而是29位,因为低3位是无用的,如果用的是扩展标识符,每次都要把标识符左移3位。

使用特权

评论回复
5
wangdapeng718|  楼主 | 2012-8-16 17:17 | 只看该作者
to 2楼、3楼:
先感谢。
二位大侠,只回答了我第一个问题,即CAN2的发送与CAN1的接收配对成功;而我理解的是,例程中CAN1的发送与CAN2的接收也是一对,是否我理解有误?

使用特权

评论回复
6
IJK| | 2012-8-16 17:52 | 只看该作者
to 2楼、3楼:
先感谢。
二位大侠,只回答了我第一个问题,即CAN2的发送与CAN1的接收配对成功;而我理解的是,例程中CAN1的发送与CAN2的接收也是一对,是否我理解有误? ...
wangdapeng718 发表于 2012-8-16 17:17


“例程中CAN1的发送与CAN2的接收也是一对”  理解正确。

使用特权

评论回复
7
5509| | 2012-8-16 20:47 | 只看该作者
CAN1发送与CAN2接收是否是一对,主要还是看CAN2的接收掩码是否是CAN1的ID

使用特权

评论回复
8
捡漏王子| | 2012-8-16 20:48 | 只看该作者
to 2楼、3楼:
先感谢。
二位大侠,只回答了我第一个问题,即CAN2的发送与CAN1的接收配对成功;而我理解的是,例程中CAN1的发送与CAN2的接收也是一对,是否我理解有误? ...
wangdapeng718 发表于 2012-8-16 17:17
对的,CAN2的过滤器设置和CAN1的ID是一致的

使用特权

评论回复
9
wangdapeng718|  楼主 | 2012-8-16 21:42 | 只看该作者
to 2楼、3楼:疑问仍存在。
既然CAN2的发送与CAN1的接收配对成功,则简写为:0x6420  与0X321 配对。
  而CAN1的发送与CAN2的接收配对成功,岂不是:0x2460与0x321配对成功了?此时是如何对应的?还是我忽略了其他细节。

使用特权

评论回复
10
wangdapeng718|  楼主 | 2012-8-16 22:00 | 只看该作者
新发现。各位大虾,是不是因为如下的语句: CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; 对应的FR2寄存器都是0,所以不关心ID具体是多少,所以将所有的报文都接收了?

使用特权

评论回复
11
helongdm| | 2012-8-17 08:26 | 只看该作者
上面的并没有使用过滤器,你看看他的中断接收程序   肯定是使用ID简单做了判断
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
这决定了  所有报文都接收   没有过滤

使用特权

评论回复
12
IJK| | 2012-8-17 09:33 | 只看该作者
to 2楼、3楼:疑问仍存在。
既然CAN2的发送与CAN1的接收配对成功,则简写为:0x6420  与0X321 配对。
  而CAN1的发送与CAN2的接收配对成功,岂不是:0x2460与0x321配对成功了?此时是如何对应的?还是我忽略了其他细 ...
wangdapeng718 发表于 2012-8-16 21:42


非也。

CAN2的发送与CAN1的接收配对成功,为:ID 0x321与Filter 0x6420配对。
  而CAN1的发送与CAN2的接收配对成功,为:ID 0x123与Filter 0x2460配对。

使用特权

评论回复
13
wangdapeng718|  楼主 | 2012-8-17 10:53 | 只看该作者
12# IJK

请问,哪来的0X123?

使用特权

评论回复
14
IJK| | 2012-8-17 11:26 | 只看该作者
本帖最后由 IJK 于 2012-8-17 11:27 编辑
12# IJK  

请问,哪来的0X123?
wangdapeng718 发表于 2012-8-17 10:53


ST的例子本来应该这么写,但 似乎偷懒而没这么做。

使用特权

评论回复
15
IJK| | 2012-8-17 11:27 | 只看该作者
新发现。各位大虾,是不是因为如下的语句: CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; 对应的FR2寄存器都是0,所以不关心ID具体是多少,所以 ...
wangdapeng718 发表于 2012-8-16 22:00


是的。

使用特权

评论回复
16
wangdapeng718|  楼主 | 2012-8-17 11:27 | 只看该作者
OK,thanks!
此贴应该结了。

使用特权

评论回复
17
IJK| | 2012-8-17 11:29 | 只看该作者
LZ可以进行如下修改,CAN1应该还能收到:

接收的CAN1配置成如下:
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x6420;
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;

使用特权

评论回复
18
wangdapeng718|  楼主 | 2012-8-17 11:40 | 只看该作者
明白,高位能够完全对应的上。

使用特权

评论回复
19
hustergatsby| | 2014-7-20 13:30 | 只看该作者
有个问题想请教一下,为什么CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000,
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000,不是还有RTR位,IDE位吗?

使用特权

评论回复
20
21icupk| | 2014-8-16 16:28 | 只看该作者
第三位都是0,代表使用标准id,使用数据帧,将发送邮箱清空。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

62

帖子

0

粉丝