STM32_CAN
CAN Project on STM32
- can分析用例
- STM32讀取CAN
CAN分析儀用例
淘寶按銷量買的 CAN分析儀, 測試的産品是Benewake的 TF02, 有序列槽和CAN接口, 這裡用的當然是CAN接口.
TF02資料手冊上給出的CAN的相關資訊如下:
也就是1Mbps, ID為0x00090002, 幀格式為擴充幀, Byte0為DIST高8位, Byte1為DIST低8位.
給TF02供5V電源, CANH和CANL分别接 CAN分析儀CAN1接口的H和L, 接上120Ω終端電阻, 如圖所示:
打開CAN分析儀的上位機 USB-CAN Tool V2.12, 裝置操作 -> 啟動裝置:
确定, 就可以看到資料的輸出了:
圖中可以看到幀率103.8, ID号0x009002, 幀格式為擴充幀, 長度8位元組, 然後是8位元組16進制的資料.
STM32讀取CAN
參考 Github can2uart 工程, STM32讀取TF02 CAN接口的資料, 通過序列槽發送給上位機.
STM32F103TBU6, VP230(接到PA11 CAN_RX, PA12 CAN_TX), USB轉序列槽(PA9, PA10).
打開STM32CubeMX, Pinout頁籤配置如下:
Clock Configuration頁籤配置如下:
Configuration頁籤配置如下:
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 */
下完程式後打開序列槽調試助手, 可以看到發送的資訊為:
一行的資料為 (擴充幀ID, 位元組數, 十六進制原始資料, 計算的TF02距離值).