你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F446 nucleo板CAN1通信配置不成功

[复制链接]
lianglunfei 提问时间:2019-3-25 18:59 /
使用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_FilterTypeDef  sFilterConfig;
//        HAL_StatusTypeDef  HAL_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();
  }
        
}   

收藏 评论4 发布时间:2019-3-25 18:59

举报

4个回答
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,是固定值。

  1. static void MX_CAN1_Init(void)
  2. {

  3.   /* USER CODE BEGIN CAN1_Init 0 */

  4.   /* USER CODE END CAN1_Init 0 */

  5.   /* USER CODE BEGIN CAN1_Init 1 */

  6.   /* USER CODE END CAN1_Init 1 */
  7.   hcan1.Instance = CAN1;
  8.   hcan1.Init.Prescaler = 5;
  9.   hcan1.Init.Mode = CAN_MODE_NORMAL;
  10.   hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  11.   hcan1.Init.TimeSeg1 = CAN_BS1_6TQ;
  12.   hcan1.Init.TimeSeg2 = CAN_BS2_2TQ;
  13.   hcan1.Init.TimeTriggeredMode = DISABLE;
  14.   hcan1.Init.AutoBusOff = DISABLE;
  15.   hcan1.Init.AutoWakeUp = DISABLE;
  16.   hcan1.Init.AutoRetransmission = ENABLE;
  17.   hcan1.Init.ReceiveFifoLocked = DISABLE;
  18.   hcan1.Init.TransmitFifoPriority = DISABLE;
  19.   if (HAL_CAN_Init(&hcan1) != HAL_OK)
  20.   {
  21.     Error_Handler();
  22.   }
  23.   /* USER CODE BEGIN CAN1_Init 2 */
  24.         
  25.         CAN_User_Init(&hcan1);

  26.   /* USER CODE END CAN1_Init 2 */

  27. }

  28. void CAN_User_Init(CAN_HandleTypeDef *hcan)
  29. {

  30.         CAN_FilterTypeDef  sFilterConfig;
  31. //        HAL_StatusTypeDef  HAL_Status;
  32.         
  33.         sFilterConfig.FilterBank = 0;                     
  34.         sFilterConfig.FilterMode =  CAN_FILTERMODE_IDMASK;   
  35.         sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;   
  36.                         
  37.         sFilterConfig.FilterIdHigh = CAN_CONFIG_INIT.CAN_Rece_ID<<5;  
  38.         sFilterConfig.FilterIdLow  = 0 | CAN_ID_STD;   
  39.         
  40. //  sFilterConfig.FilterIdHigh = 0;  
  41. //        sFilterConfig.FilterIdLow  = 0;  
  42.                         
  43.         sFilterConfig.FilterMaskIdHigh = 0;
  44.         sFilterConfig.FilterMaskIdLow  = 0;
  45.         
  46.         sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;            
  47.         sFilterConfig.FilterActivation = ENABLE;
  48.         
  49.         sFilterConfig.SlaveStartFilterBank  = 0;
  50.         
  51.   if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
  52.         {
  53.                 Error_Handler();
  54.         }
  55.         
  56.         if (HAL_CAN_Start(&hcan1) != HAL_OK )
  57.         {
  58.      Error_Handler();
  59.   }        
  60.         
  61. //  if(HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_TX_MAILBOX_EMPTY) != HAL_OK)
  62.         if(HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
  63.         {
  64.     Error_Handler();
  65.   }
  66.         
  67. }   
复制代码

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

3111272 回答时间:2019-4-3 09:58:41
注意你的时钟配置

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

lianglunfei 回答时间:2019-7-18 10:50:31
这个问题最后解决了,和配置感觉没有关系,我用cube F4 1.24.1版本的库后,就可以正常通信了。
Finlay 回答时间:2019-7-18 15:28:10
学习贴
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版