lianglunfei 发表于 2019-3-25 18:59:50

STM32F446 nucleo板CAN1通信配置不成功

使用CUBE MX配置CAN1接口,参考官方库资料和网友分享资料,不管怎样在连接USB CAN卡的时候,CAN卡都不能识别到配置好的波特率,请教有没有人遇到此类问题,谢谢了。

主要代码如下:
static void MX_CAN1_Init(void)
{

/* USER CODE BEGIN CAN1_Init 0 */

/* USER CODE END CAN1_Init 0 */

/* USER CODE BEGIN CAN1_Init 1 */

/* USER CODE END CAN1_Init 1 */
hcan1.Instance = CAN1;
hcan1.Init.Prescaler = 5;
hcan1.Init.Mode = CAN_MODE_NORMAL;
hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan1.Init.TimeSeg1 = CAN_BS1_6TQ;
hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
hcan1.Init.TimeTriggeredMode = DISABLE;
hcan1.Init.AutoBusOff = DISABLE;
hcan1.Init.AutoWakeUp = DISABLE;
hcan1.Init.AutoRetransmission = ENABLE;
hcan1.Init.ReceiveFifoLocked = DISABLE;
hcan1.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan1) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN CAN1_Init 2 */
      
      CAN_User_Init(&hcan1);

/* USER CODE END CAN1_Init 2 */

}

void CAN_User_Init(CAN_HandleTypeDef *hcan)
{

      CAN_FilterTypeDefsFilterConfig;
//      HAL_StatusTypeDefHAL_Status;
      
      sFilterConfig.FilterBank = 0;                     
      sFilterConfig.FilterMode =CAN_FILTERMODE_IDMASK;   
      sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;   
                        
      sFilterConfig.FilterIdHigh = CAN_CONFIG_INIT.CAN_Rece_ID<<5;
      sFilterConfig.FilterIdLow= 0 | CAN_ID_STD;   
      
//sFilterConfig.FilterIdHigh = 0;
//      sFilterConfig.FilterIdLow= 0;
                        
      sFilterConfig.FilterMaskIdHigh = 0;
      sFilterConfig.FilterMaskIdLow= 0;
      
      sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;            
      sFilterConfig.FilterActivation = ENABLE;
      
      sFilterConfig.SlaveStartFilterBank= 0;
      
if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
      {
                Error_Handler();
      }
      
      if (HAL_CAN_Start(&hcan1) != HAL_OK )
      {
   Error_Handler();
}      
      
//if(HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_TX_MAILBOX_EMPTY) != HAL_OK)
      if(HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
      {
    Error_Handler();
}
      
}   

watershade 发表于 2019-4-2 21:10:44

本帖最后由 watershade 于 2019-4-2 21:11 编辑

你的代码看的心烦了。我用code搞在下面。记得将代码写在代码块之间。
不清楚你CAN分频之前的时钟是多少。也不知道你配置的目标波特率是多少。根据你的配置,假定你时钟是90m,则你的tq大约是1/18M = 55ns.所以你的波特率是 tq*(1+6+2) = 495ns。所以波特率超过2M。你搞笑呐。所以希望你的时钟低一点吧,不是90M。 这里的1不是STW,是固定值。

static void MX_CAN1_Init(void)
{

/* USER CODE BEGIN CAN1_Init 0 */

/* USER CODE END CAN1_Init 0 */

/* USER CODE BEGIN CAN1_Init 1 */

/* USER CODE END CAN1_Init 1 */
hcan1.Instance = CAN1;
hcan1.Init.Prescaler = 5;
hcan1.Init.Mode = CAN_MODE_NORMAL;
hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan1.Init.TimeSeg1 = CAN_BS1_6TQ;
hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
hcan1.Init.TimeTriggeredMode = DISABLE;
hcan1.Init.AutoBusOff = DISABLE;
hcan1.Init.AutoWakeUp = DISABLE;
hcan1.Init.AutoRetransmission = ENABLE;
hcan1.Init.ReceiveFifoLocked = DISABLE;
hcan1.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan1) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN CAN1_Init 2 */
      
      CAN_User_Init(&hcan1);

/* USER CODE END CAN1_Init 2 */

}

void CAN_User_Init(CAN_HandleTypeDef *hcan)
{

      CAN_FilterTypeDefsFilterConfig;
//      HAL_StatusTypeDefHAL_Status;
      
      sFilterConfig.FilterBank = 0;                     
      sFilterConfig.FilterMode =CAN_FILTERMODE_IDMASK;   
      sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;   
                        
      sFilterConfig.FilterIdHigh = CAN_CONFIG_INIT.CAN_Rece_ID<<5;
      sFilterConfig.FilterIdLow= 0 | CAN_ID_STD;   
      
//sFilterConfig.FilterIdHigh = 0;
//      sFilterConfig.FilterIdLow= 0;
                        
      sFilterConfig.FilterMaskIdHigh = 0;
      sFilterConfig.FilterMaskIdLow= 0;
      
      sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;            
      sFilterConfig.FilterActivation = ENABLE;
      
      sFilterConfig.SlaveStartFilterBank= 0;
      
if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
      {
                Error_Handler();
      }
      
      if (HAL_CAN_Start(&hcan1) != HAL_OK )
      {
   Error_Handler();
}      
      
//if(HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_TX_MAILBOX_EMPTY) != HAL_OK)
      if(HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
      {
    Error_Handler();
}
      
}   

3111272 发表于 2019-4-3 09:58:41

注意你的时钟配置

lianglunfei 发表于 2019-7-18 10:50:31

这个问题最后解决了,和配置感觉没有关系,我用cube F4 1.24.1版本的库后,就可以正常通信了。

finlaycb45ef 发表于 2019-7-18 15:28:10

学习贴
页: [1]
查看完整版本: STM32F446 nucleo板CAN1通信配置不成功