求助帖 关于can的 来懂can的大神

2019-07-20 20:22发布

最近在弄有关于can的东西,大体上能通信了,现在就剩下一个能进中断,但是解码的东西进不了,这是什么情况,困扰了好久,同样的原理写的为什么,求助,感激不尽,下面相关代码

这是  can配置的
u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{

  GPIO_InitTypeDef       GPIO_InitStructure;
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
#if CAN1_RX0_INT_ENABLE
  NVIC_InitTypeDef  NVIC_InitStructure;
#endif
  //使能相关时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能PORTB时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟       

  //初始化GPIO
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8| GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化PB8,PB9

  //引脚复用映射配置
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_CAN1); //GPIOB8复用为CAN1
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_CAN1); //GPIOB9复用为CAN1

  //CAN单元设置
  CAN_InitStructure.CAN_TTCM=DISABLE;                //非时间触发通信模式   
  CAN_InitStructure.CAN_ABOM=DISABLE;           //软件自动离线管理          
  CAN_InitStructure.CAN_AWUM=DISABLE;           //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
  CAN_InitStructure.CAN_NART=DISABLE;           //开启报文自动传送
  CAN_InitStructure.CAN_RFLM=DISABLE;                //报文不锁定,新的覆盖旧的  
  CAN_InitStructure.CAN_TXFP=DISABLE;                //优先级由报文标识符决定
  CAN_InitStructure.CAN_Mode= mode;                //模式设置
  CAN_InitStructure.CAN_SJW=tsjw;                //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
  CAN_InitStructure.CAN_BS1=tbs1;               //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
  CAN_InitStructure.CAN_BS2=tbs2;               //Tbs2范围CAN_BS2_1tq ~        CAN_BS2_8tq
  CAN_InitStructure.CAN_Prescaler=brp;          //分频系数(Fdiv)为brp+1       
  CAN_Init(CAN1, &CAN_InitStructure);           // 初始化CAN1

  //配置过滤器
  for(Fliter_i=0;Fliter_i<3;Fliter_i++)
  {
    CAN_FilterInitStructure.CAN_FilterNumber=Fliter_i;                                //过滤器0、1
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;
    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;              //32位
    CAN_FilterInitStructure.CAN_FilterIdHigh=std_id[2*Fliter_i]<<5;             //32位ID
    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=std_id[2*Fliter_i+1]<<5;       //32位MASK
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;          //过滤器0、1关联到FIFO0
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                        //激活过滤器0、1
    CAN_FilterInit(&CAN_FilterInitStructure);                                   //滤波器初始化
  }               

#if CAN1_RX0_INT_ENABLE       
  CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                    

  NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;     // 主优先级为1   优先级联调的时候要小心
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;            // 次优先级为0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
#endif
  return 0;
}   


下面是发送部分的,现在是地磁的能通,但是gps能进中断,但是进不了解码 通信连不上
uint8_t  TxData_CAN[100] = {0};
void CAN1_Send_Mag_Msg(void)
{       
  u8 mbox;
  u16 i=0;
  u16 Mag_data_Size =0;   
  u8 Send_times =0;         
  u8 Send_times_count =0;   
  u8 Residual_byte;         

  CanTxMsg TxMessage;
  TxMessage.StdId=0x003;                 
  TxMessage.IDE=CAN_ID_STD;                  
  TxMessage.RTR=CAN_RTR_DATA;                  
  TxMessage.DLC=8;                                                       

  Mag_data_Size = chose_Mag_CAN();
  Send_times=Mag_data_Size/8;

  for(Send_times_count=0;Send_times_count<Send_times;Send_times_count++)
  {
    for(i=0;i<8;i++)
      TxMessage.Data[i]=TxData_CAN[i+(Send_times_count)*8];         //
    mbox= CAN_Transmit(CAN1, &TxMessage);  
   // while(!(CAN_GetFlagStatus(CAN1, CAN_FLAG_RQCP0)==1|CAN_GetFlagStatus(CAN1, CAN_FLAG_RQCP1)==1|CAN_GetFlagStatus(CAN1, CAN_FLAG_RQCP2)==1));
    while(CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed){};               
  }
  Residual_byte=Mag_data_Size%8;
  if(Residual_byte != 0)
  {
    TxMessage.DLC = Residual_byte;                                                         // ????????
    for(i=0;i<Residual_byte;i++)
      TxMessage.Data[i] = TxData_CAN[i+(Send_times)*8];                                 // ?????      
    mbox= CAN_Transmit(CAN1, &TxMessage);
   // while(!(CAN_GetFlagStatus(CAN1, CAN_FLAG_RQCP0)==1|CAN_GetFlagStatus(CAN1, CAN_FLAG_RQCP1)==1|CAN_GetFlagStatus(CAN1, CAN_FLAG_RQCP2)==1));
  }
  //i=0;
  while(CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed){};               
}

void CAN1_Send_GPS_Msg(void)
{       
  u8 mbox;
  u16 i=0;
  u16 GPS_data_Size =0; //??????  ???
  u8 Send_times =0;       //??????  ???
  u8 Send_times_count =0; //??????  ???
  u8 Residual_byte;       //??????  ???

  CanTxMsg TxMessage;
  TxMessage.StdId=0x004;         // ??????0
  //TxMessage.ExtId=0x12;         // ???????(29?)
  TxMessage.IDE=CAN_ID_STD;                  // ???????
  TxMessage.RTR=CAN_RTR_DATA;                  // ????????,??8?
  TxMessage.DLC=8;                                                         // ??????

  GPS_data_Size = chose_GPS_data();
  Send_times=GPS_data_Size/8;

  for(Send_times_count=0;Send_times_count<Send_times;Send_times_count++)
  {
    for(i=0;i<8;i++)
      TxMessage.Data[i]=TxData_CAN[i+(Send_times_count)*8];                                 // ?????      
    mbox= CAN_Transmit(CAN1, &TxMessage);
    //while(!(CAN_GetFlagStatus(CAN1, CAN_FLAG_RQCP0)==1|CAN_GetFlagStatus(CAN1, CAN_FLAG_RQCP1)==1|CAN_GetFlagStatus(CAN1, CAN_FLAG_RQCP2)==1));               
    while(CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed){};               
  }

  Residual_byte=GPS_data_Size%8;
  if(Residual_byte != 0)
  {
    TxMessage.DLC = Residual_byte;                                                         // ????????
    for(i=0;i<Residual_byte;i++)
      TxMessage.Data[i] = TxData_CAN[i+(Send_times)*8];                                 // ?????      
    mbox= CAN_Transmit(CAN1, &TxMessage);
   // while(!(CAN_GetFlagStatus(CAN1, CAN_FLAG_RQCP0)==1|CAN_GetFlagStatus(CAN1, CAN_FLAG_RQCP1)==1|CAN_GetFlagStatus(CAN1, CAN_FLAG_RQCP2)==1));
  }
  //i=0;
  while(CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed){};               
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
Da Wen
1楼-- · 2019-07-21 01:32
是不是进中断之后还有判断ID,然后根据ID的值产生程序分支?
好好学
2楼-- · 2019-07-21 01:37
Da Wen 发表于 2016-9-3 16:57
是不是进中断之后还有判断ID,然后根据ID的值产生程序分支?

是的,004就是
Da Wen
3楼-- · 2019-07-21 02:56
好好学 发表于 2016-9-4 14:33
是的,004就是

能进中断但是不能分支,可能是你过滤器那边没配置好
好好学
4楼-- · 2019-07-21 03:58
 精彩回答 2  元偷偷看……
Da Wen
5楼-- · 2019-07-21 05:36
 精彩回答 2  元偷偷看……
Da Wen
6楼-- · 2019-07-21 05:53
Da Wen 发表于 2016-9-4 19:24
能进中断但是不能分支,可能是你过滤器那边没配置好

003ID的分支能执行?

一周热门 更多>