关于CAN调试

在配置CAN通讯过程中 除了在CUBEMX中打开接收中断RX0以外,用户本身也要添加相关函数  包括过滤器配置 打开CAN 打开中断  中断回调等

CAN_TxHeaderTypeDef     TxMeg;

CAN_RxHeaderTypeDef     RxMeg;

uint8_t  CAN_RX_Data[8];

uint8_t  CAN_RX_END=0;
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)  //接收回调函数
{

    HAL_StatusTypeDef    HAL_RetVal;
    HAL_RetVal=HAL_CAN_GetRxMessage(hcan,  CAN_RX_FIFO0, &RxMeg,  CAN_RX_Data);
    if ( HAL_OK==HAL_RetVal)
    {                   
        CAN_RX_END=1;
        for(int i=0;i<8;i++)
        {
          printf("%d\r\n", CAN_RX_Data[i]);
        }
    }
}

void User_CAN_Init(CAN_HandleTypeDef* hcan )   //用户初始化函数

{

 CAN_FilterTypeDef  sFilterConfig;

 HAL_StatusTypeDef  HAL_Status;

    

  sFilterConfig.FilterActivation = ENABLE;//使能过滤器
    sFilterConfig.FilterBank = 1;//指定过滤器为1
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//指定过滤器为标识符屏蔽位模式
    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//过滤器位宽为32位
    sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;//设定了指向过滤器的FIFO
    
    sFilterConfig.FilterIdHigh =0x0000 ;//要过滤的ID高位 
  sFilterConfig.FilterIdLow = 0x0000;//要过滤的ID低位 
    sFilterConfig.FilterMaskIdHigh = 0x0000;//过滤器屏蔽标识符的高16位值
  sFilterConfig.FilterMaskIdLow = 0x0000; //过滤器屏蔽标识符的低16位值

    HAL_CAN_ConfigFilter(hcan,&sFilterConfig);

  HAL_Status=HAL_CAN_Start(hcan);  //开启CAN

  if(HAL_Status!=HAL_OK){

    printf("开启CAN失败\r\n");    

  }    

  HAL_Status=HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING);

  if(HAL_Status!=HAL_OK){

    printf("开启挂起中断允许失败\r\n");    

  }

}
//发送数据函数
/*void CAN_TRANSMIT(void)
{
  TxMeg.DLC=8;
  TxMeg.StdId=0x0000;
  TxMeg.ExtId=0x2018;
  TxMeg.IDE=CAN_ID_STD;
  TxMeg.RTR=CAN_RTR_DATA;
  uint8_t TR_BUF[8]={0,1,2,3,4,5,6,7};
  HAL_CAN_AddTxMessage(&hcan,&TxMeg,TR_BUF,(uint32_t*)CAN_TX_MAILBOX0);
//   if(!=HAL_OK)
//  {
//     printf("發送失敗");
//  }
}*/
uint8_t CANx_SendNormalData(CAN_HandleTypeDef* hcan,uint16_t ID,uint8_t *pData,uint16_t Len)
{
    CAN_TxHeaderTypeDef     TxMeg1;
    
    TxMeg1.IDE=CAN_ID_STD;//CAN_ID_EXT;

  TxMeg1.RTR=CAN_RTR_DATA;
    
    uint32_t USR_USED_MAILBOX = 0;

    HAL_StatusTypeDef    HAL_RetVal;

  uint16_t SendTimes,SendCNT=0;

    uint8_t  FreeTxNum=0;

    TxMeg1.StdId=ID;

    if(!hcan || ! pData ||!Len)  return 1;

    SendTimes=Len/8+(Len%8?1:0);

    FreeTxNum=HAL_CAN_GetTxMailboxesFreeLevel(hcan);

    TxMeg1.DLC=8;

    while(SendTimes--)
    {

        if(0==SendTimes){

            if(Len%8)

                TxMeg1.DLC=Len%8;

        }

        while(0==FreeTxNum)
        {

            FreeTxNum=HAL_CAN_GetTxMailboxesFreeLevel(hcan);

        }

        HAL_Delay(1);   //没有延时很有可能会发送失败

        HAL_RetVal=HAL_CAN_AddTxMessage(hcan,&TxMeg1,pData+SendCNT, &USR_USED_MAILBOX);    //    *pTxMailbox = (uint32_t)1 << transmitmailbox; 需要注释

        if(HAL_RetVal!=HAL_OK)
        {

            return 2;
            printf("凯斯\r\n");

        }

        SendCNT+=8;

    }

    

  return 0;

}

 

posted @ 2021-06-09 16:05  会编程的数组  阅读(744)  评论(0编辑  收藏  举报