天天看點

stm32 常見錯誤之can線通信前言can線問題具體表現形式:軟體問題:總結

目錄

前言

can線問題具體表現形式:

軟體問題:

1.速率

2.管腳

3.中斷回調

總結

前言

經過一段時間的stm32的學習,個人總結了一些常見問題,這篇文章就主要寫一下在can線上遇到的問題。

can線問題具體表現形式:

1.程式能夠運作,但是不能通信,接收不到連接配接裝置的資訊,原因:硬體的問題,觀察電源線、can線是否正常;軟體的問題:速率問題。

2.程式不能運作,卡在了can線的初始化,原因:管腳沒有配置好。

3.程式能夠運作,但不能通信,接收不到資訊(和第一個比較像,但這裡更主要指can1能通信,can2不能):原因:can1、can2使用的緩沖區是否不同,如不同,中斷使能可能沒有設定好。

軟體問題:

1.速率

     stm32要和某種裝置進行can線通信,一定要了解此裝置的can線通信速率,以robomaster的通用産品為例,例如G6020、3508的can線通信速率都為1Mbps,是以要将主要闆的can線速率也設定為1Mbps,否則無法正常通信,

void MX_CAN1_Init(void)
{

  hcan1.Instance = CAN1;
  hcan1.Init.Prescaler = 3;
  hcan1.Init.Mode = CAN_MODE_NORMAL;
  hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan1.Init.TimeSeg1 = CAN_BS1_10TQ;
  hcan1.Init.TimeSeg2 = CAN_BS2_3TQ;
  hcan1.Init.TimeTriggeredMode = DISABLE;
  hcan1.Init.AutoBusOff = ENABLE;
  hcan1.Init.AutoWakeUp = ENABLE;
  hcan1.Init.AutoRetransmission = DISABLE;
  hcan1.Init.ReceiveFifoLocked = DISABLE;
  hcan1.Init.TransmitFifoPriority = ENABLE;
  if (HAL_CAN_Init(&hcan1) != HAL_OK)
  {
    Error_Handler();
  }

}
           

速率配置在can1、can2的初始化時進行,具體就是 hcan1.Init.Prescaler、hcan1.Init.TimeSeg1、hcan1.Init.TimeSeg2三個變量決定,例如在以上的代碼中,這三個變量的設定值分别是3、10、3,此時使用的stm32f427晶片速率設定為168Mhz,APB1的速率設定為42Mhz,是以配置後的速率為42/(3*(10+3+1)) 為1Mhz(此處速率計算可參考其他文章,比較常見),滿足要求。

速率配置常見問題是,如在cube中直接配置速率,則新版cube不允許出現無限循環小數,則按主機闆168Mhz,無法在cube中配置成1Mhz,具體如下圖所示,是以隻能生成代碼後自己去找到void MX_CAN1_Init(void)初始化函數進行速率修改。

stm32 常見錯誤之can線通信前言can線問題具體表現形式:軟體問題:總結

2.管腳

can線的管腳包括TX管腳和RX管腳,一定要配置好,否則can線初始化是無法正常通過的。

這裡的方法就是找到你所使用的闆子的原理圖,去尋找can線的管腳是那些,這裡還是要提一下cube,cube大多會自動就生成兩個管腳,但請注意這裡的管腳并不是完全正确的,是以最好還是去自己找管腳進行配置。

stm32 常見錯誤之can線通信前言can線問題具體表現形式:軟體問題:總結

3.中斷回調

can線的通信也是通過中斷回調函數的,cube生成的代碼可以在stm32fxxx_it.c檔案中看到,例如此處就是can1的Tx中斷回調和Rx0的中斷回調,

void CAN1_TX_IRQHandler(void)
{
  /* USER CODE BEGIN CAN1_TX_IRQn 0 */

  /* USER CODE END CAN1_TX_IRQn 0 */
  HAL_CAN_IRQHandler(&hcan1);
  /* USER CODE BEGIN CAN1_TX_IRQn 1 */

  /* USER CODE END CAN1_TX_IRQn 1 */
}

/**
  * @brief This function handles CAN1 RX0 interrupts.
  */
void CAN1_RX0_IRQHandler(void)
{
  /* USER CODE BEGIN CAN1_RX0_IRQn 0 */
	
  /* USER CODE END CAN1_RX0_IRQn 0 */
  HAL_CAN_IRQHandler(&hcan1);
  /* USER CODE BEGIN CAN1_RX0_IRQn 1 */

  /* USER CODE END CAN1_RX0_IRQn 1 */
}
           

 而調用can線輸出的函數為

HAL_CAN_AddTxMessage(hcanx, &TxMessage, TxData, &pTxMailbox);

can線接收的函數為

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan);

void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan);

這裡的兩個接收函數的差別就是使用的fifo緩沖區的不同,

一般來說,我們讓can1使用FIFO0區,can2使用FIFO1區,這裡就出現了一個問題,中斷回調中TX隻有一個,而RX卻是兩個,一個RX0,一個為RX1,這裡的0、1之差就是使用緩沖區的不同導緻的,

是以要想正常使用就是 用FIFO0就使能RX0中斷,用FIFO1就使能RX1中斷。

stm32 常見錯誤之can線通信前言can線問題具體表現形式:軟體問題:總結

4.初始化(濾波器方面)

暫待

總結

本文主要針對我在stm32開發過程中遇到的can線問題做出的總結,期待補充,一起進步。

繼續閱讀