平台 STM32F429
軟件 STM32CubeMx 5.0.0
固件庫 STM32Cube_FW_F4_V1.23.0
目的: 實現 CAN 的發送
一 簡介
CAN是控制器局域網絡(Controller Area Network, CAN)的簡稱,是由研發和生產汽車電子產品著稱的德國BOSCH公司開發了的,並最終成為國際標准(ISO11898)。是國際上應用最廣泛的現場總線之一。 在北美和西歐,CAN總線協議已經成為汽車計算機控制系統和嵌入式工業控制局域網的標准總線,並且擁有以CAN為底層協議專為大型貨車和重工機械車輛設計的J1939協議。
由於 CAN 屬於異步通訊,沒有時鍾信號線,連接在同一個總線網絡中的各個節點會像串口異步通訊那樣,節點間使用約定好的波特率進行通訊,特別地,CAN 還會使用“位同步”的方式來抗干擾、吸收誤差,實現對總線電平信號進行正確的采樣,確保通訊正常。
為了實現位同步,CAN 協議把每一個數據位的時序分解成如圖 43-5 所示的 SS 段、PTS 段、PBS1 段、PBS2 段,這四段的長度加起來即為一個 CAN 數據位的長度。分解后最小的時間單位是 Tq,而一個完整的位由 8~25 個 Tq 組成。為方便表示,圖中的高低電平直接代表信號邏輯 0 或邏輯 1(不是差分信號)。

波特率 = Tq *(SS+PTS+PBS1+PBS2)
二 創建工程
生成代碼
修改代碼
啟動 CAN
HAL_CAN_Start(&hcan1);
發送數據
CAN_TxHeaderTypeDef TxHeader; uint8_t TxData[8] = {0x23, 0x81, 0x60, 0x00, 0x55, 0x55, 0x08, 0x00}; uint32_t TxMailbox; uint32_t std_id = 0x601; TxHeader.RTR = CAN_RTR_DATA; TxHeader.IDE = CAN_ID_STD; TxHeader.StdId=std_id; TxHeader.TransmitGlobalTime = DISABLE; TxHeader.DLC = 8; if (HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox) != HAL_OK) { /* Transmission request Error */ Error_Handler(); }
實驗結果:
使用USB轉CAN盒,打開ecantools軟件,波特率為500k
按下按鍵,收到數據
代碼 已上傳到gitHub上 https://github.com/itachi1121/stm32-can.git