OpenEdv-开源电子网

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

STM32中 CAN接收中断里为什么每次接收到的第一次数据都是空的?

[复制链接]

41

主题

96

帖子

0

精华

高级会员

Rank: 4

积分
659
金钱
659
注册时间
2017-12-4
在线时间
208 小时
发表于 2020-12-26 10:44:21 | 显示全部楼层 |阅读模式
  1. u8 j=0;
  2. u8 sun2=0;                    //  数据包数
  3. u8 buf2[CAN_BUF_LENGTH]={0};        //记录can2接收到的原始数据
  4. u8 temp2[CAN_BUF_LENGTH]={0};     //记录can2重组后的有效数据
  5. u8 k=0;
  6. int count2=0;         //有效数据个数   
  7. void CAN2_RX0_IRQHandler(void)
  8. {
  9.                                         CanRxMsg RxMessage;
  10.                                         int i=0;
  11.                         
  12.         
  13.                                   CAN_ClearITPendingBit(CAN2,CAN_IT_FMP0);
  14.                                         CAN_Receive(CAN2, 0, &RxMessage);
  15.                                        
  16.                                  if(RxMessage.Data[1]==0x01)
  17.                                  {
  18.                                                          sun2= RxMessage.Data[2] ;                          
  19.                                  }
  20.                                                 
  21.                                        
  22.                                         //接收can的原始数据
  23.                                         for(i=0;i<8;i++)
  24.                                         {
  25.                                                         buf2[j] =RxMessage.Data[i];                                                        
  26.                                                 //        printf("rxbuf2[%d]:%0x\r\n",j,        buf2[j]);                                                                                                        
  27.                                                         j++;                                                
  28.                                         }

  29.                                   //重新组包数据        
  30.                                         if(j>7)
  31.                                         {
  32.                                                  memTomem(temp2+k,buf2+j,8);
  33.                                                 
  34.                                                         for(i=0;temp2[k]!=0&&i<8;i++)
  35.                                                         {                                
  36.                                                                 printf("rxbuf3[%d]:%0x\r\n",k,        temp2[k]);     //开发板断电在上电,这里每次第一次打印temp2时都是空,就是什么都不输出,是什么原因呢?
  37.                                                                 k++;
  38.                                                                 count2++;
  39.                                                         }                                
  40.                                                                                        
  41.                                         }
  42.                                        
  43.                                                   if(sun2==0)//是否接收完当前报文帧数
  44.                                                 {                                                                                                               

  45.                                                                         j=0;//将数组下标还原为0
  46.                                                                         k=0;        
  47.                                                                         count2=0;                                                                        
  48.                                                 }                                                   
  49.                                         sun2--;                                                                                                

  50. }
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

41

主题

96

帖子

0

精华

高级会员

Rank: 4

积分
659
金钱
659
注册时间
2017-12-4
在线时间
208 小时
 楼主| 发表于 2020-12-26 10:44:44 | 显示全部楼层
问题在37行,请大佬们帮忙看下,是不是我哪里写的不对?
回复 支持 反对

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1436
金钱
1436
注册时间
2020-5-12
在线时间
394 小时
发表于 2020-12-28 16:08:50 | 显示全部楼层
附上can初始化代码:
/* CAN1 init function */
void MX_CAN1_Init(void)
{
  CAN_FilterTypeDef hcanfilter;
  
  hcan1.Instance                    = CAN1;
  hcan1.Init.Prescaler              = 15;
  hcan1.Init.Mode                   = CAN_MODE_NORMAL;
  hcan1.Init.SyncJumpWidth          = CAN_SJW_1TQ;
  hcan1.Init.TimeSeg1               = CAN_BS1_16TQ;
  hcan1.Init.TimeSeg2               = CAN_BS2_3TQ;
  hcan1.Init.TimeTriggeredMode      = DISABLE;
  hcan1.Init.AutoBusOff             = ENABLE;
  hcan1.Init.AutoWakeUp             = DISABLE;
  hcan1.Init.AutoRetransmission     = DISABLE;
  hcan1.Init.ReceiveFifoLocked      = DISABLE;
  hcan1.Init.TransmitFifoPriority   = DISABLE;
  if (HAL_CAN_Init(&hcan1) != HAL_OK)
  {
    Error_Handler();
  }

  /**
   *  过滤组设置
   */
  hcanfilter.FilterIdHigh           = 0x0000;  /*以下四个值为0,表示不对任何ID过滤*/   
  hcanfilter.FilterIdLow            = 0x0000;
  hcanfilter.FilterMaskIdHigh       = 0x0000;
  hcanfilter.FilterMaskIdLow        = 0x0000;
  hcanfilter.FilterFIFOAssignment   = CAN_FILTER_FIFO0;
  hcanfilter.FilterMode             = CAN_FILTERMODE_IDMASK;
  hcanfilter.FilterScale            = CAN_FILTERSCALE_32BIT;
  hcanfilter.FilterActivation       = ENABLE;
  hcanfilter.FilterBank             = 1;
  if(HAL_CAN_ConfigFilter(&hcan1, &hcanfilter) != HAL_OK)
  {      
     Error_Handler();
  }
  
  //顺序不能乱,先开启再打开中断
  HAL_CAN_Start(&hcan1);
  
  HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);  
  
}
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 14:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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