打印

CAN多节点通信怎么设置过滤和屏蔽器?

[复制链接]
5876|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gylsxcn|  楼主 | 2011-8-26 16:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
can发送数据:
  /* transmit 1 message */
  TxMessage.StdId=0x1234;
  TxMessage.ExtId=0x5678;
  TxMessage.IDE=CAN_ID_EXT;
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.DLC=2;
  TxMessage.Data[0]=0x55;
  TxMessage.Data[1]=0x55;
  CAN_Transmit(&TxMessage);

can接收数据:
void USB_LP_CAN_RX0_IRQHandler(void)
{
  CanRxMsg RxMessage;

  RxMessage.StdId=0x1234;
  RxMessage.ExtId=0x5678;
  RxMessage.IDE=0;
  RxMessage.DLC=2;
  RxMessage.FMI=0;
  RxMessage.Data[0]=0x00;
  RxMessage.Data[1]=0x00;

  CAN_Receive(CAN_FIFO0, &RxMessage);

  ret = 1;
}

/* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=1;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x1234;
  CAN_FilterInitStructure.CAN_FilterIdLow=0x5678;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);

  /* CAN FIFO0 message pending interrupt enable */  
  CAN_ITConfig(CAN_IT_FMP0, ENABLE);

只要屏蔽器的值为零,就能接收到数据,现在想搞多借点通信,屏蔽器CAN_FilterMaskIdHigh和CAN_FilterMaskIdLow值都为0xffff;时接收不到数据。现在的主要问题是我不知道过滤器和屏蔽器的值怎么设置!谢谢了!
沙发
airwill| | 2011-8-27 11:20 | 只看该作者
那就好好看看数据手册, 那里还是讲得蛮清楚的.

一旦收到的报文被存入FIFO,就可被应用程序访问。通常情况下,报文中的数据被拷贝到
SRAM中;为了把数据拷贝到合适的位置,应用程序需要根据报文的标识符来辨别不同的数
据。bxCAN提供了过滤器匹配序号,以简化这一辨别过程。
根据过滤器优先级规则,过滤器匹配序号和报文一起,被存入邮箱中。因此每个收到的报文,
都有与它相关联的过滤器匹配序号。
过滤器匹配序号可以通过下面两种方式来使用:
●  把过滤器匹配序号跟一系列所期望的值进行比较
●  把过滤器匹配序号当作一个索引来访问目标地址
对于标识符列表模式下的过滤器(非屏蔽方式的过滤器),软件不需要直接跟标识符进行比较。
对于屏蔽位模式下的过滤器,软件只须对需要的那些屏蔽位(必须匹配的位)进行比较即可。
在给过滤器编号时,并不考虑过滤器组是否为激活状态。另外,每个FIFO各自对其关联的过滤
器进行编号。

使用特权

评论回复
板凳
gylsxcn|  楼主 | 2011-8-27 14:36 | 只看该作者
搞定了。应该这么写  
CAN_FilterInitStructure.CAN_FilterIdHigh=(((u32)0x5678<<3)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow=(((u32)0x5678<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;

使用特权

评论回复
地板
yanjunjan| | 2011-10-29 14:13 | 只看该作者
这是验收都屏蔽了啊...

使用特权

评论回复
5
wangshi| | 2011-11-23 21:07 | 只看该作者
楼上真是高手。

使用特权

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

本版积分规则

0

主题

7

帖子

1

粉丝