stm32 can bus 总结

/* CAN init function */
void MX_CAN_Init(void)
{
  CAN_FilterConfTypeDef filter;
  hcan.Instance = CAN1;
  hcan.Init.Prescaler = 3;
//  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.Mode = CAN_MODE_LOOPBACK;
  hcan.Init.SJW = CAN_SJW_1TQ;
  hcan.Init.BS1 = CAN_BS1_12TQ;
  hcan.Init.BS2 = CAN_BS2_2TQ;
  hcan.Init.TTCM = DISABLE;
  hcan.Init.ABOM = DISABLE;
  hcan.Init.AWUM = DISABLE;
  hcan.Init.NART = DISABLE;
  hcan.Init.RFLM = DISABLE;
  hcan.Init.TXFP = ENABLE;

  //在cube生成的基础上添加以下三项,用于保存收发的内容
  hcan.pTxMsg = &CAN_TX_MSG;  //用于保存要发送的内容
  hcan.pRxMsg = &CAN_RX0_MSG;  //对应fifo0接收
  hcan.pRx1Msg = &CAN_RX1_MSG; //对应fifo1接收
  if (HAL_CAN_Init(&hcan) != HAL_OK)  
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  filter.FilterNumber=1;
  filter.FilterMode=CAN_FILTERMODE_IDMASK;
  filter.FilterScale=CAN_FILTERSCALE_32BIT;
  filter.FilterIdHigh=0x0000;
  filter.FilterIdLow=0x0000;
  filter.FilterMaskIdHigh=0x0000;
  filter.FilterMaskIdLow=0x0000;
  filter.FilterFIFOAssignment=CAN_FIFO0;
  filter.FilterActivation=ENABLE;
 
  if(  HAL_CAN_ConfigFilter(&hcan,&filter) != HAL_OK) //刚开始因为没有加过滤配置,导致数据一直收不到,所以接收中断进不去。
  {
      Error_Handler();
  }
    
  if(HAL_CAN_Receive_IT(&hcan,CAN_FIFO0) != HAL_OK) // 打开接收中断(注意cube自动生成的中断处理会再次清除中断使能,所以只能接受一次,想要反复接收每次接收万要重新打开)
  {
      Error_Handler();
  }
}

猜你喜欢

转载自www.cnblogs.com/zhanghonglang/p/8919181.html