||
在工業物聯網場景中,穩定可靠的CAN總線通信是關鍵。本文基于Air780EPM模組與LuatOS系統,深入解析如何快速構建CAN通信解決方案,助你突破開發瓶頸,實現設備間高效數據交互。
最新資料詳見:https://docs.openluat.com/air780epm/luatos/api/core/can/
一、Can操作庫常量定義
can.MODE_NORMAL:
正常工作模式;
can.MODE_LISTEN:
監聽模式(僅接收,不發送);
can.MODE_TEST:
自測模式(自收自發);
can.MODE_SLEEP:
休眠模式。
can.STATE_STOP:
停止工作狀態;
can.STATE_ACTIVE:
主動錯誤狀態(一般情況下為該狀態);
can.STATE_PASSIVE:
被動錯誤狀態(總線上錯誤較多時進入,但仍可正常收發);
can.STATE_BUSOFF:
離線狀態(總線錯誤非常多,不能收發,需手動退出);
can.STATE_LISTEN:
監聽狀態(選擇監聽模式時進入);
can.STATE_TEST:
自收自發狀態(選擇自測模式時進入);
can.STATE_SLEEP:
休眠狀態(選擇休眠模式時進入)。
can.CB_MSG:
有新數據寫入緩存;
can.CB_TX:
數據發送完成(需通過param判斷成功/失敗);
can.CB_ERR:
錯誤報告(param為錯誤碼);
can.CB_STATE:
總線狀態變更,后續param參數是新的狀態,也可以用can.state讀出。
can.EXT:擴展幀;
can.STD:標準幀。
二、Can操作庫API函數
1)初始化CAN總線
can.init(id, rx_message_cache_max)
參數:
id:總線ID(0表示can0,1表示can1,通常默認為0)。
rx_message_cache_max:接收緩存消息數最大值(默認使用平臺值)。
返回值:boolean(成功返回true,失敗返回false)。
示例:
2)配置CAN總線的波特率及時序參數
can.timing(id, br, PTS, PBS1, PBS2, SJW)
參數:
id:總線ID。
br:波特率(默認1Mbps)。
PTS:
傳播時間段(范圍1~8,默認5)。
PBS1:
相位緩沖段1(范圍1~8,默認4)。
PBS2:
相位緩沖段2(范圍2~8,默認3)。
SJW:
同步補償寬度(范圍1~4,默認2)。
返回值:boolean。
示例:
3)設置CAN總線工作模式
can.mode(id, mode)
參數:
id:總線ID。
mode:
模式常量(如 can.MODE_NORMAL)。
返回值:boolean。
示例:
4)設置消息過濾規則
can.filter(id, dual_mode, ACR, AMR)
參數:
id:總線ID。
dual_mode:是否啟用雙濾波模式。
ACR:接受代碼寄存器(過濾 ID 值)。
AMR:接受掩碼寄存器(掩碼值)。
返回值:boolean。
注意:具體實現依賴硬件特性。
5)設置CAN節點ID及類型can.node(id, node_id, id_type)
參數:
id:總線ID。
node_id:節點 ID。
id_type:ID 類型(can.EXT或can.STD)。
返回值:boolean。
示例:
1)發送CAN消息
can.tx(id, msg_id, id_type, RTR, need_ack, data)
參數:
id:總線ID。
msg_id:消息ID。
id_type:
幀類型(can.EXT 或 can.STD)。
RTR:
是否為遠程傳輸請求(true/false)。
need_ack:
是否需要應答(true/false)。
data:
數據(數組,如 {0x01, 0x02})。
返回值:無。
示例:
2)接收CAN消息
can.rx(id)
參數:id:總線ID。
返回值:消息數據(如 {id=0x123, data={0x01, 0x02}})。
示例:
1)注冊事件回調函數
can.on(id, func)
參數:
id:總線ID。
func:回調函數(參數:id, type, param)。
示例:
2)獲取當前總線狀態
can.state(id)
參數:id:總線ID。
返回值:狀態常量(如 can.STATE_ACTIVE)。
3)停止指定總線can.stop(id)
參數:id:總線ID。
4)重置總線(恢復默認配置)can.reset(id)
參數:id:總線ID。
5)反初始化總線can.deinit(id)
參數:id:總線ID。
6)啟用/禁用調試信息輸出can.debug(on_off)
參數:on_off(布爾值)。
三、CAN開發相關注意事項
使用can.tx發送消息,確保參數正確;通過can.rx拉取消息,或在回調中處理can.CB_MSG。
3.3 狀態監控定期檢查can.state,處理離線狀態(can.STATE_BUSOFF);錯誤回調can.CB_ERR,需記錄param錯誤碼。
3.4 調試與性能啟用can.debug(true) 輸出底層日志;接收緩存rx_message_cache_max需根據需求調整,避免消息丟失。
3.5 常見問題如何解決can.STATE_BUSOFF離線狀態?
需先調用can.reset(id)恢復總線,再重新初始化配置。
如何確保消息發送成功?
通過can.CB_TX回調判斷發送結果,或檢查返回值(若API支持)。
如何處理高頻率消息接收?
增大rx_message_cache_max,或在回調中及時處理消息。
更多最新開發資料詳見:www.air780epm.cn
今天的內容就分享到這里了~