打印
[STM32F0]

STM32的CAN总线的接收双FIFO的使用问题

[复制链接]
4165|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qq792368480|  楼主 | 2017-1-6 16:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过cubemx生成的HAL库,CAN模块配置如下:
CAN_HandleTypeDef hcan;
CanTxMsgTypeDef TxMessage;
CanRxMsgTypeDef RxMessage;
/* CAN init function */
void MX_CAN_Init(void)
{

  hcan.Instance = CAN;
  hcan.pTxMsg = &TxMessage;
  hcan.pRxMsg = &RxMessage;
  //250K
  hcan.Init.Prescaler = 12;
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SJW = CAN_SJW_1TQ;
  hcan.Init.BS1 = CAN_BS1_7TQ;
  hcan.Init.BS2 = CAN_BS2_8TQ;
  hcan.Init.TTCM = DISABLE;
  hcan.Init.ABOM = ENABLE;
  hcan.Init.AWUM = DISABLE;
  hcan.Init.NART = DISABLE;
  hcan.Init.RFLM = DISABLE;
  hcan.Init.TXFP = DISABLE;
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    Error_Handler();
  }
       
CAN_FilterConfTypeDef  sFilterConfig;
//  /*##-2- Configure the CAN Filter ###########################################*/
//  sFilterConfig.FilterNumber = 0;
//  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
//  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
//  sFilterConfig.FilterIdHigh = 0x0000;
//  sFilterConfig.FilterIdLow = 0x0000;
//  sFilterConfig.FilterMaskIdHigh = 0x0000;
//  sFilterConfig.FilterMaskIdLow = 0x0000;
//  sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
//  sFilterConfig.FilterActivation = ENABLE;
//  sFilterConfig.BankNumber = 14;
//  if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
//  {
//    /* Filter configuration Error */
//    Error_Handler();
//  }
//        HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);               //使能CAN接收中断
       
  /*##-2- Configure the CAN Filter ###########################################*/
  sFilterConfig.FilterNumber = 1;
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  sFilterConfig.FilterIdHigh = 0x0000;
  sFilterConfig.FilterIdLow = 0x0000;
  sFilterConfig.FilterMaskIdHigh = 0x0000;
  sFilterConfig.FilterMaskIdLow = 0x0000;
  sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO1;
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.BankNumber = 14;

  if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  {
    /* Filter configuration Error */
    Error_Handler();
  }
  HAL_CAN_Receive_IT(&hcan, CAN_FIFO1);               //使能CAN接收中断
}

上面代码注释掉了CAN_FIFO0的那部分,可以正常接收到数据(进入CAN_FIFO0接收中断);反之,注释掉CAN_FIFO1的那部分也是可以正常接收到数据(进入CAN_FIFO1接收中断)。但如果两个都配置的话(不注释掉),一直只能进入CAN_FIFO0接收中断。我想要交替触发的效果,可以跟USB双缓冲一样吗?
沙发
yiyigirl2014| | 2017-1-6 20:58 | 只看该作者
应该是共用了一个中断入口,进入中断后你要判断具体是哪个中断吧。

使用特权

评论回复
板凳
qq792368480|  楼主 | 2017-1-7 09:03 | 只看该作者
CANFIFO0和CANFIFO1中断HAL库已经帮忙区分好了,只管取出数据处理;还有发现这两句:
HAL_CAN_Receive_IT(&hcan, CAN_FIFO1);               //使能CAN接收中断
HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);               //使能CAN接收中断
哪句放在前就只触发哪个中断

22.png (38.03 KB )

22.png

11.png (43.51 KB )

11.png

使用特权

评论回复
地板
qq792368480|  楼主 | 2017-1-7 09:24 | 只看该作者
我是想通过STM32F072做个CAN适配器,CAN收到数据往USB发出去,USB收到数据往CAN发出去,这个功能可以了,但速度一快的话(1MS发送一帧数据),不是CAN死掉,就是SUB死掉

使用特权

评论回复
5
qq792368480|  楼主 | 2017-1-7 09:52 | 只看该作者
工程已上传,调了两天,无进展做过这方面的大哥指点下

CANadapter.zip

1.32 MB

使用特权

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

本版积分规则

6

主题

15

帖子

0

粉丝