打印

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

[复制链接]
5012|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 | 只看该作者

顶顶顶

顶顶顶

使用特权

评论回复
5
dengting|  楼主 | 2009-6-28 03:04 | 只看该作者

顶顶顶

希望前辈们不吝赐教啊

使用特权

评论回复
6
jinjing999| | 2009-8-31 16:28 | 只看该作者
呵呵
我也正在想这个问题
替你顶一下吧

使用特权

评论回复
7
baidudz| | 2009-8-31 21:43 | 只看该作者
还是看的不是很懂

使用特权

评论回复
8
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可以用来接收低优先级的消息,同时给相应的中断设置低优先级。

使用特权

评论回复
9
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;
怎么设置啊?我不知道应该设置那个?

使用特权

评论回复
10
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);

使用特权

评论回复
11
jinjing999| | 2009-9-2 15:09 | 只看该作者
哦谢谢我还有个疑问,手册397页,就是上边的那个表格

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

使用特权

评论回复
12
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

使用特权

评论回复
13
dengting|  楼主 | 2009-9-28 10:10 | 只看该作者
谢谢各位的解答...
关于,FIFO0只能针对0,1,3,5,6,9,13的问题,我试过,不是这样的...
你想想,如果是只能固定FIFO,那指定FIFO_NUMBER参数有什么意义?

使用特权

评论回复
14
dengting|  楼主 | 2009-9-28 10:25 | 只看该作者
问题3大家没遇到吗? 奇了怪了

使用特权

评论回复
15
dengting|  楼主 | 2009-9-28 10:28 | 只看该作者
CANID的大小是决定了在总线上竞争能力,有再多的数据,也只能一个一个发送到总线。。。。
所以FIFO的分配应该与CANID的优先级没有关系。。。。如果FIFO满了,就丢数据了,不能说优先级低的ID就可以丢了吧?除非整个网络是你设计的,你说可以丢就可以丢。。。

使用特权

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

本版积分规则

12

主题

70

帖子

0

粉丝