天天看點

STM32 HAL CANSTM32_CAN

STM32_CAN

CAN Project on STM32

  • can分析用例
  • STM32讀取CAN

CAN分析儀用例

淘寶按銷量買的 CAN分析儀, 測試的産品是Benewake的 TF02, 有序列槽和CAN接口, 這裡用的當然是CAN接口.

TF02資料手冊上給出的CAN的相關資訊如下:

STM32 HAL CANSTM32_CAN
STM32 HAL CANSTM32_CAN

也就是1Mbps, ID為0x00090002, 幀格式為擴充幀, Byte0為DIST高8位, Byte1為DIST低8位.

給TF02供5V電源, CANH和CANL分别接 CAN分析儀CAN1接口的H和L, 接上120Ω終端電阻, 如圖所示:

STM32 HAL CANSTM32_CAN

打開CAN分析儀的上位機 USB-CAN Tool V2.12, 裝置操作 -> 啟動裝置:

STM32 HAL CANSTM32_CAN

确定, 就可以看到資料的輸出了:

STM32 HAL CANSTM32_CAN

圖中可以看到幀率103.8, ID号0x009002, 幀格式為擴充幀, 長度8位元組, 然後是8位元組16進制的資料.

STM32讀取CAN

參考 Github can2uart 工程, STM32讀取TF02 CAN接口的資料, 通過序列槽發送給上位機.

STM32 HAL CANSTM32_CAN

STM32F103TBU6, VP230(接到PA11 CAN_RX, PA12 CAN_TX), USB轉序列槽(PA9, PA10).

打開STM32CubeMX, Pinout頁籤配置如下:

STM32 HAL CANSTM32_CAN

Clock Configuration頁籤配置如下:

STM32 HAL CANSTM32_CAN

Configuration頁籤配置如下:

STM32 HAL CANSTM32_CAN
STM32 HAL CANSTM32_CAN

CAN挂在APB1時鐘上, CAN波特率 36M/Pre/(BS1+BS2+SJW) = 36M/3/(5+6+1) = 1Mbps, 剛好對應圖中 Time for one Bit 的 1000ns. 要用FIFO0的接收中斷, 是以USB low priority or CAN RX0 interrupts 這個勾上.

main.c中主要添加的代碼如下:

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
CanRxMsgTypeDef RxMessage;
/* USER CODE END PV */

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
uint8_t CAN_Init() {
    hcan.pRxMsg = &RxMessage;

    CAN_FilterConfTypeDef filterConfig;

    filterConfig.FilterNumber = ;
    filterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
    filterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
    filterConfig.FilterIdHigh = ;
    filterConfig.FilterIdLow = ;
    filterConfig.FilterMaskIdHigh = ;
    filterConfig.FilterMaskIdLow = ;
    filterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
    filterConfig.FilterActivation = ENABLE;
    filterConfig.BankNumber = ;

    if(HAL_CAN_ConfigFilter(&hcan,&filterConfig) != HAL_OK) return ;
    return ;
}

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan1) {
    __HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);
    printf("(0x%08x, %d,", hcan.pRxMsg->ExtId, hcan.pRxMsg->DLC);
    for(int i = ; i < hcan.pRxMsg->DLC; i++) {
        printf(" %02x", hcan.pRxMsg->Data[i]);
    }
    if(hcan.pRxMsg->DLC >= ) {
        printf(", %d", (hcan.pRxMsg->Data[]<<) + hcan.pRxMsg->Data[]);   //distance
    }
    printf(")\r\n");
}
/* USER CODE END PFP */

    //main函數中
    /* USER CODE BEGIN 2 */
    printf("Hello, world!\r\n");
    CAN_Init();
    __HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);
    /* USER CODE END 2 */
           

下完程式後打開序列槽調試助手, 可以看到發送的資訊為:

STM32 HAL CANSTM32_CAN

一行的資料為 (擴充幀ID, 位元組數, 十六進制原始資料, 計算的TF02距離值).

繼續閱讀