求救,关于CAN的两个接收FIFO的问题

[复制链接]
6710|14
 楼主| dengting 发表于 2009-6-25 12:00 | 显示全部楼层 |阅读模式
各位前辈,香主,浪主,小弟在使用STM32的CAN时有一些问题:

问题1:
我所了解到的,每一个FILTER漏入的数据只能指定放在一个FIFO(0或1),
而在应用中绝大多数的数据是从一个FILTER中漏入的,所以,都挤在FIFO0中,FIFO1没有什么用处,能不能把两个FIFO连成一个能存放6条消息的FIFO使用呢?或者说,当在FIFO0满时,自动存到FIFO1中?

问题2:
怎样做才能发挥两个FIFO的效率呢?

问题3:
还有,当我设置为 ID-LIST模式时,只需要设置了一条ID,即将一个32位CAN-ID写入FILTER0的ID的寄存器,而FILTER0的MASK寄存器中写了0x00000000, 由于FILTER0被ACTIVE后,ID和MASK同时生效了, 会造成MASK寄存器将CAN1.0的帧(ID为0x0000)误漏入,有什么办法解决?

问题4:
不知我描述清楚了没有...
 楼主| dengting 发表于 2009-6-25 12:11 | 显示全部楼层

顶起来

顶起来
 楼主| dengting 发表于 2009-6-25 12:25 | 显示全部楼层

顶第一

顶第一
 楼主| dengting 发表于 2009-6-25 16:03 | 显示全部楼层

顶顶顶

顶顶顶
 楼主| dengting 发表于 2009-6-28 03:04 | 显示全部楼层

顶顶顶

希望前辈们不吝赐教啊
jinjing999 发表于 2009-8-31 16:28 | 显示全部楼层
呵呵
我也正在想这个问题
替你顶一下吧
baidudz 发表于 2009-8-31 21:43 | 显示全部楼层
还是看的不是很懂
IJK 发表于 2009-9-1 16:04 | 显示全部楼层
问题1:
我所了解到的,每一个FILTER漏入的数据只能指定放在一个FIFO(0或1),
而在应用中绝大多数的数据是从一个FILTER中漏入的,所以,都挤在FIFO0中,FIFO1没有什么用处,能不能把两个FIFO连成一个能存放6条消息的FIFO使用呢?或者说,当在FIFO0满时,自动存到FIFO1中?

问题2:
怎样做才能发挥两个FIFO的效率呢?

回答:这说明 FILTER、message 没有设计好。

CAN通信是基于消息(message)的,而消息根据其ID不同 从而优先级也不同。因此,可以这样做:
STM32的两个FIFO,一个FIFO可以用来接收高优先级的消息,同时给相应的中断设置高优先级;
另一个FIFO可以用来接收低优先级的消息,同时给相应的中断设置低优先级。
jinjing999 发表于 2009-9-2 11:48 | 显示全部楼层
楼上的,我也是这样想的,不过有个问题我有点搞不明白。
如果用FIFO0,采用屏蔽位模式,屏蔽位实际区分不同CAN节点地址。
如果用FIFO1,也采用屏蔽位模式,这个屏蔽位包括CAN节点地址,要多加几位进行屏蔽位模式。

我的担心,两个接收缓冲区都漏进去怎么办?

还有一个问题,我对屏蔽位不是太了解,看到手册过滤FIFO0,只能用0,1,3,5,6,9,13过滤号
过滤FIFO1,只能用2,4,7,8,10,11,12过滤号。
库函数提供两个设置:
          CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
          CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
怎么设置啊?我不知道应该设置那个?
IJK 发表于 2009-9-2 14:15 | 显示全部楼层
两个接收缓冲区都漏进去怎么办?

好的FILTER、message 设计,当然不应该出现这种情况。

举例说明屏蔽位模式的用法。
STM32的两个FIFO,一个FIFO(比如FIFO0)可以用来接收高优先级的消息,同时给相应的中断设置高优先级;
另一个FIFO(比如FIFO1)可以用来接收低优先级的消息,同时给相应的中断设置低优先级。
比如,
高优先级ID 16~31 (0x10~0x1F) 考虑过滤到FIFO0去

低优先级ID 32~63 (0x20~0x3F) 考虑过滤到FIFO1去,那么设置起来很容易。
用STM32的库来说明:

  // 设置 FILTER 1,过滤ID 16~31 到FIFO0去
  CAN_FilterInitStruct.CAN_FilterNumber=1;
  CAN_FilterInitStruct.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStruct.CAN_FilterScale=CAN_FilterScale_16bit;
  CAN_FilterInitStruct.CAN_FilterIdHigh=0x0000;
  CAN_FilterInitStruct.CAN_FilterIdLow=0x0010;
  CAN_FilterInitStruct.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStruct.CAN_FilterMaskIdLow=0x0030;
  CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_FilterFIFO0;
  CAN_FilterInitStruct.CAN_FilterActivation=ENABLE;       
  CAN_FilterInit(&CAN_FilterInitStruct);

  // 设置 FILTER 2,过滤ID 32~47 到FIFO1去
  CAN_FilterInitStruct.CAN_FilterNumber=2;
  CAN_FilterInitStruct.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStruct.CAN_FilterScale=CAN_FilterScale_16bit;
  CAN_FilterInitStruct.CAN_FilterIdHigh=0x0000;
  CAN_FilterInitStruct.CAN_FilterIdLow=0x0020;
  CAN_FilterInitStruct.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStruct.CAN_FilterMaskIdLow=0x0030;
  CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_FilterFIFO1;
  CAN_FilterInitStruct.CAN_FilterActivation=ENABLE;       
  CAN_FilterInit(&CAN_FilterInitStruct);

  // 设置 FILTER 3,过滤ID 48~63 到FIFO1去
  CAN_FilterInitStruct.CAN_FilterNumber=3;
  CAN_FilterInitStruct.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStruct.CAN_FilterScale=CAN_FilterScale_16bit;
  CAN_FilterInitStruct.CAN_FilterIdHigh=0x0000;
  CAN_FilterInitStruct.CAN_FilterIdLow=0x0030;
  CAN_FilterInitStruct.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStruct.CAN_FilterMaskIdLow=0x0030;
  CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_FilterFIFO1;
  CAN_FilterInitStruct.CAN_FilterActivation=ENABLE;       
  CAN_FilterInit(&CAN_FilterInitStruct);
jinjing999 发表于 2009-9-2 15:09 | 显示全部楼层
哦谢谢我还有个疑问,手册397页,就是上边的那个表格

过滤号是不是针对哪个缓冲区是固定的? 0,1,3,5,6,9,13过滤号,看只能FIFO0? 2,4,7,8,10,11,12过滤号,过滤FIFO1?
IJK 发表于 2009-9-3 10:12 | 显示全部楼层
手册397页,就是上边的那个表格

过滤号是不是针对哪个缓冲区是固定的? 0,1,3,5,6,9,13过滤号,看只能FIFO0? 2,4,7,8,10,11,12过滤号,过滤FIFO1?

回答:手册397页只是举例说明,过滤号当然不是固定给某个FIFO的。
如果仔细看10L,其实就很清楚了。

  // 设置 FILTER 1,过滤ID 16~31 到FIFO0(改为FIFO1当然也可以)去
  CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_FilterFIFO0; //过滤ID 到FIFO0
  // 下面改为FIFO1
  CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_FilterFIFO1; //过滤ID 到FIFO1
 楼主| dengting 发表于 2009-9-28 10:10 | 显示全部楼层
谢谢各位的解答...
关于,FIFO0只能针对0,1,3,5,6,9,13的问题,我试过,不是这样的...
你想想,如果是只能固定FIFO,那指定FIFO_NUMBER参数有什么意义?
 楼主| dengting 发表于 2009-9-28 10:25 | 显示全部楼层
问题3大家没遇到吗? 奇了怪了
 楼主| dengting 发表于 2009-9-28 10:28 | 显示全部楼层
CANID的大小是决定了在总线上竞争能力,有再多的数据,也只能一个一个发送到总线。。。。
所以FIFO的分配应该与CANID的优先级没有关系。。。。如果FIFO满了,就丢数据了,不能说优先级低的ID就可以丢了吧?除非整个网络是你设计的,你说可以丢就可以丢。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

70

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部