OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 18514|回复: 15

CAN通讯的2个3级深度的FIFO使用

[复制链接]

2

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-12-17
在线时间
0 小时
发表于 2014-12-17 18:58:27 | 显示全部楼层 |阅读模式
5金钱
 can  有2个3级深度的FIFO,    这2个 是同时再用么?   第一个FIFO满了   自动存储到第2个 FIFO ?
例程上  只读了第一个  FIFO 
  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据 

最佳答案

查看完整内容[请看2#楼]

//过滤器  1   CAN_FilterInitStructure.CAN_FilterNumber         = 1;   //过滤器   CAN_FilterInitStructure.CAN_FilterMode           = CAN_FilterMode_IdMask; //标识符屏蔽位模式    CAN_FilterInitStructure.CAN_FilterScale    = CAN ...
不疯魔,不成活!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-12-17
在线时间
0 小时
 楼主| 发表于 2014-12-17 18:58:28 | 显示全部楼层
//过滤器  1
  CAN_FilterInitStructure.CAN_FilterNumber         = 1;   //过滤器
  CAN_FilterInitStructure.CAN_FilterMode           = CAN_FilterMode_IdMask; //标识符屏蔽位模式
   CAN_FilterInitStructure.CAN_FilterScale    = CAN_FilterScale_32bit; //过滤位宽为单个32位 
    CAN_FilterInitStructure.CAN_FilterIdHigh  = (((u32)0x1315<<3)&0xFFFF0000)>>16; //要过滤的ID高位 
    CAN_FilterInitStructure.CAN_FilterIdLow  = (((u32)0x1315<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; //要过滤的ID低位 
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF; //过滤器高16位每位必须匹配
    CAN_FilterInitStructure.CAN_FilterMaskIdLow  = 0xFFFF; //过滤器低16位每位必须匹配
   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; //过滤器关联到FIFO0
  CAN_FilterInitStructure.CAN_FilterActivation     = ENABLE;  //激活过滤器

   CAN_FilterInit(&CAN_FilterInitStructure); //过滤器初始化

//过滤器   6
  CAN_FilterInitStructure.CAN_FilterNumber         = 6 ;   //过滤器 
  CAN_FilterInitStructure.CAN_FilterMode           = CAN_FilterMode_IdMask; //标识符屏蔽位模式
   CAN_FilterInitStructure.CAN_FilterScale    = CAN_FilterScale_32bit; //过滤位宽为单个32位 
    CAN_FilterInitStructure.CAN_FilterIdHigh  = (((u32)0x1314<<3)&0xFFFF0000)>>16; //要过滤的ID高位 
    CAN_FilterInitStructure.CAN_FilterIdLow  = (((u32)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; //要过滤的ID低位 
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF; //过滤器高16位每位必须匹配
    CAN_FilterInitStructure.CAN_FilterMaskIdLow  = 0xFFFF; //过滤器低16位每位必须匹配
   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO1; //过滤器关联到FIFO1
  CAN_FilterInitStructure.CAN_FilterActivation     = ENABLE;  //激活过滤器 

   CAN_FilterInit(&CAN_FilterInitStructure); //过滤器初始化
  

//使能中断
#if CAN_RX0_INT_ENABLE

CAN_ITConfig(CAN1,CAN_IT_FMP0 | CAN_IT_FF0 | CAN_IT_FOV0,ENABLE);
CAN_ITConfig(CAN1,CAN_IT_FMP1 | CAN_IT_FF1 | CAN_IT_FOV1,ENABLE); //FIFO0消息挂号中断允许.     

  
   NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);

   NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;     // 主优先级为1
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);


终于搞定了,总结一下:
1、CAN数据接收报文首先通过过滤器,需要设置过滤器过滤条件,过滤器0条件为空的话,所有报文都通过过滤器0进入FIFO,其他的过滤器不起作用。(即过滤器的优先级选择,参看下面链接) 
2、报文过滤了以后送给FIFO
3、过滤器给哪个FIFO是通过过滤器关联设置的
4、FIFO1接收中断是CAN1_RX1_IRQn , FIFO0接收中断是USB_LP_CAN1_RX0_IRQn
CAN过滤器总结可以参看  http://wenku.baidu.com/link?url=wkdp0yynqFFrZ6itMFYIFzY3vTw4yETm1z0DJXV7GeHpUuqy7e1RN36hXU4fUQBENqEAgF3BvH46FnQu2CaEmFzlZJ4fTxpGFuRAsX4hFyW
不疯魔,不成活!
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-12-17
在线时间
0 小时
 楼主| 发表于 2014-12-17 19:34:23 | 显示全部楼层
测试了下    用上位机软件   发送 80个报文  间隔10ms, FIFO0产生了满中断和溢出中断,但是FIFO1没有产生接收中断。
是否可以认为  CAN1没有用到 FIFO1 ,只用到了 FIFO0.





不疯魔,不成活!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-17 22:41:27 | 显示全部楼层
是可以同时用,但是你的过滤器得关联到对应的FIFO才行。
我们例程只关联到了FIFO0,所以FIFO1不可能出现数据。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-12-17
在线时间
0 小时
 楼主| 发表于 2014-12-18 18:43:15 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
FIFO1 中断 服务函数是 void USB_LP_CAN1_RX0_IRQHandler(void)  还是 void CAN1_RX1_IRQHandler(void) ? 

//过滤器
  CAN_FilterInitStructure.CAN_FilterNumber         = 0;   //过滤器0
  CAN_FilterInitStructure.CAN_FilterMode           = CAN_FilterMode_IdMask; //标识符屏蔽位模式
   CAN_FilterInitStructure.CAN_FilterScale    = CAN_FilterScale_32bit; //过滤位宽为单个32位 
   CAN_FilterInitStructure.CAN_FilterIdHigh         = 0x0000;//32位ID
   CAN_FilterInitStructure.CAN_FilterIdLow          = 0x0000;
   CAN_FilterInitStructure.CAN_FilterMaskIdHigh     = 0x0000;//32位MASK
   CAN_FilterInitStructure.CAN_FilterMaskIdLow      = 0x0000;
   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; //过滤器0关联到FIFO0
  CAN_FilterInitStructure.CAN_FilterActivation     = ENABLE;  //激活过滤器0

   CAN_FilterInit(&CAN_FilterInitStructure); //过滤器初始化

//过滤器

  CAN_FilterInitStructure.CAN_FilterNumber         = 1 ;   //过滤器1
  CAN_FilterInitStructure.CAN_FilterMode           = CAN_FilterMode_IdMask; //标识符屏蔽位模式
   CAN_FilterInitStructure.CAN_FilterScale    = CAN_FilterScale_32bit; //过滤位宽为单个32位 
   CAN_FilterInitStructure.CAN_FilterIdHigh         = 0x0000;//32位ID
   CAN_FilterInitStructure.CAN_FilterIdLow          = 0x0000;
   CAN_FilterInitStructure.CAN_FilterMaskIdHigh     = 0x0000;//32位MASK
   CAN_FilterInitStructure.CAN_FilterMaskIdLow      = 0x0000;
   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO1; //过滤器1关联到FIFO1
  CAN_FilterInitStructure.CAN_FilterActivation     = ENABLE;  //激活过滤器1

   CAN_FilterInit(&CAN_FilterInitStructure); //过滤器初始化


过滤器1关联到FIFO1 后  中断服务函数中的    CAN_IT_FMP1  、 CAN_IT_FOV1 、CAN_IT_FF1 这三个中断  都进不去。
CAN_ITConfig(CAN1,CAN_IT_FMP0 | CAN_IT_FF0 | CAN_IT_FOV0,ENABLE);
CAN_ITConfig(CAN1,CAN_IT_FMP1 | CAN_IT_FF1 | CAN_IT_FOV1,ENABLE); //FIFO0消息挂号中断允许.
不疯魔,不成活!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-18 22:38:01 | 显示全部楼层
回复【4楼】as2807479:
---------------------------------
战舰板,FIFO1应该是CAN1_RX1_IRQHandler
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-12-17
在线时间
0 小时
 楼主| 发表于 2014-12-19 15:12:49 | 显示全部楼层
有这方面问题的同学可以交流交流,一个人想太费时间了。
不疯魔,不成活!
回复

使用道具 举报

14

主题

173

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2011-10-14
在线时间
2 小时
发表于 2015-1-4 16:47:19 | 显示全部楼层
顶一下,正有此困惑,学习了。
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-12-17
在线时间
0 小时
 楼主| 发表于 2015-1-6 10:53:29 | 显示全部楼层
回复【8楼】smithlin:
---------------------------------
有机会多交流
不疯魔,不成活!
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-1-12
在线时间
1 小时
发表于 2015-1-12 15:26:42 | 显示全部楼层
回复【6楼】as2807479:
---------------------------------
过滤器0条件为空的话,所有报文都通过过滤器0进入FIFO,其他的过滤器不起作用

过滤器条件设为空什么意思?过滤器都是并联的,再怎么设置其他的过滤器怎么可能不起作用?
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-1-12
在线时间
1 小时
发表于 2015-1-12 15:30:10 | 显示全部楼层
回复【9楼】as2807479:
---------------------------------
你的意思应该是 过滤器0 设置为对每位不过滤,过滤器0和FIFO0关联,其它过滤器无论怎么设置 ,消息都会被接收到FIFO0
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-12-17
在线时间
0 小时
 楼主| 发表于 2015-1-25 09:53:02 | 显示全部楼层
回复【11楼】helloword:
---------------------------------
对的。
不疯魔,不成活!
回复

使用道具 举报

10

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2013-12-20
在线时间
94 小时
发表于 2015-5-20 16:43:18 | 显示全部楼层
谢谢 mark
回复

使用道具 举报

10

主题

147

帖子

0

精华

高级会员

Rank: 4

积分
602
金钱
602
注册时间
2015-7-11
在线时间
94 小时
发表于 2017-3-21 21:59:49 | 显示全部楼层
学习了谢谢!!
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2015-11-26
在线时间
27 小时
发表于 2017-9-14 13:59:05 | 显示全部楼层
你好在么?我使用接收中断会死在里面,原子的例程没有写中断类型判断也没有清除中断,这是怎么回事,请赐教
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2019-9-10
在线时间
14 小时
发表于 2020-11-13 16:11:35 | 显示全部楼层
加个好友交流交流不?我q
1875231161
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 07:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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