面對復雜多樣的嵌入式通信需求,Air8000 模塊的 CAN 接口開發尤為重要。本文以實戰為導向,詳細拆解 Air8000 模塊 CAN 接口的開發流程與配置方法,從環境搭建到代碼實現,再到實際測試,讓你零基礎也能輕松掌握,實現高效、穩定的數據通信。
一、CAN 概述
控制器局域網(Controller Area Network,CAN)是一種廣泛應用于工業控制、汽車電子等領域的實時通信協議,由德國博世公司于 1986 年提出并標準化(ISO 11898)。其核心采用多主(Multi-Master)總線架構,通過差分信號傳輸實現高抗干擾能力,支持節點間以廣播形式進行高效、可靠的數據交換。CAN 協議基于非破壞性仲裁機制,利用報文 ID 優先級解決總線沖突,確保高優先級數據實時傳輸,同時具備完善的錯誤檢測、幀校驗和故障節點自動關閉功能,滿足嚴苛環境下的安全性需求。典型應用包括汽車 ECU 通信(如動力總成、車身控制)、工業自動化(如 PLC 聯網)及醫療設備互聯,其衍生協議如 CAN FD(靈活數據率)進一步提升了帶寬與靈活性,成為現代分布式控制系統的基礎技術之一。
二、演示功能概述
本篇文章演示的內容為:用兩種方式測試 Air8000 的 CAN 功能,第一種是使用 Air8000 整機開發板使用 CAN 連接 CAN 轉 USB 工具,進行數據收發,第二種是使用 Air8000 整機開發板和 Air8000 整機開發板進行 CAN 功能的收發測試。
三、準備硬件環境
參考:硬件環境清單第二章節內容,準備以及組裝好硬件環境。
3.1 Air8000 整機開發板

3.2 高速 USB-CAN 分析儀

3.3 硬件連接圖
Air8000 整機板和 USB-CAN 分析儀鏈接圖:
CAN 總線采用差分信號傳輸,由兩根線組成:
CAN 采用差分信號傳輸,通過兩根信號線(CANH 和 CANL)傳輸數據。兩根線上的信號相位相反,即使存在干擾,接收端也能通過差值還原出原始數據。所以 CAN 接線可以不接 GND

Air8000 整機開發板和 Air8000 整機開發板連接圖:

四、準備軟件環境
在開始實踐本示例之前,先籌備一下軟件環境:
1.Luatools 工具;
2. 內核固件文件(底層 core 固件文件):LuatOS-SoC_V2008_Air8000_VOLTE.soc;參考項目使用的內核固件;
3. luatos 需要的腳本和資源文件
gitee 下載地址:https://gitee.com/openLuat/LuatOS/blob/master/module/Air8000/demo/can/main.lua
LuatOS 運行所需要的 lib 文件:
使用 Luatools 燒錄時,勾選 添加默認 lib 選項,使用默認 lib 腳本文件
準備好軟件環境之后,接下來查看如何燒錄項目文件到 Air8000,將本篇文章中演示使用的項目文件燒錄到 Air8000 中。
五、代碼 API 和代碼解析
5.1 代碼 API
can.init(id, rx_message_cache_max)
CAN 總線初始化
參數

返回值

例子

can.on(id, func)
注冊 CAN 事件回調
參數

返回值

例子

can.timing(id, br, PTS, PBS1, PBS2, SJW)
CAN 總線配置時序
參數

返回值

例子

can.mode(id, mode)
CAN 總線設置工作模式
參數

返回值

例子

can.node(id, node_id, id_type)
CAN 總線設置節點 ID,這是一種簡易的過濾規則,只接收和 ID 完全匹配的消息,和 can.filter 選擇一個使用
參數

返回值

例子

can.tx(id, msg_id, id_type, RTR, need_ack, data)
CAN 發送一條消息
參數

返回值

例子

can.rx(id)
從緩存里讀出一條消息
參數

返回值

例子

can.debug(on_off)
CAN debug 開關,打開后有更詳細的打印
參數

返回值
無
例子

zbuff.create(length,data,type)
創建 zbuff
參數

返回值

例子

buff:set(start, num, len)
zbuff 的類似于 memset 操作,類似于 memset(&buff[start], num, len),當然有 ram 越界保護,會對 len 有一定的限制
參數

返回值
無
例子

buff:seek(base,offset)
zbuff 設置光標位置(可能與當前指針位置有關;執行后指針會被設置到指定位置)
參數

返回值

例子

mcu.x32(value)
轉換 10 進制數為 16 進制字符串輸出
參數

返回值

例子

5.2 常量值解釋

5.3 代碼解析
1.配置 SELF_TEST_FLAG 為正常收發模式,節點配置為 A 節點,對應的 rx 的 id 為 0x12345678,tx 的 id 為 0x12345677,代碼里面使用的 id 為擴展幀,擴展幀和標準幀的區別:
CAN 協議中標準幀和擴展幀的主要區別體現在以下幾個方面:
5.3.1 標識符長度與節點數量
1.標準幀
2.擴展幀
5.3.2 數據傳輸能力
標準幀數據長度限制為 8 字節,超過部分會被填充或忽略。
擴展幀數據長度可達 0-64 字節,通過分段傳輸(如 ISO-TP 協議)實現大容量數據傳輸。
5.3.3 控制字段差異
標準幀:6 位控制字段(如 DLC、R0、IDE 位)。
擴展幀:4 位控制字段(如 DLC、R1、IDE 位),部分功能由擴展標識符擴展。
配置了 STB 的 pin 用于不同硬件的控制,創建了 Zbuff 存儲發送數據

2.初始化 CAN 總線,設置 id 和接收緩存消息數,注冊 CAN 事件的回調函數,對 cb_type 進行對比,can.CB_MSG 為對有新數據寫入緩存進行讀取處理,can.CB_TX 為數據發送結束,需要根據后續 param 確定發送成功還是失敗,can.CB_ERR 為有錯誤報告,后續 param 是錯誤碼,can.CB_STATE 為總線狀態變更,后續 param 是新的狀態,也可以用 can.state 讀出,然后對 can 總線的時序進行配置,代碼里配置的是 1Mbps,然后根據上面的是否是自測模式的變量進行判斷,如果是自測模式就使用 can.mode 配置 can 總線的工作模式為自測模式 can.MODE_TEST,如果是正常工作模式就配置為 can.MODE_NORMAL,本文檔中使用的為擴展幀,配置節點 ID 為 CAN.EXT,如果要使用標準幀配置為 CAN.STD,其中 STB 的管腳,
關于 CAN_STB 信號:
1. 電源管理(待機模式控制)
低功耗模式:當系統需要進入節能狀態時(如汽車熄火或設備待機),CAN_STB 信號可被觸發(高電平或低電平,取決于硬件設計),使 CAN 收發器進入低功耗待機模式。此時,收發器停止正常通信以降低能耗。
喚醒功能:當需要恢復通信時,CAN_STB 信號狀態切換(如拉低或拉高),將收發器從待機模式喚醒,重新激活 CAN 總線的數據傳輸。
2. 硬件控制
收發器啟用/禁用:在某些 CAN 收發器芯片(如 TI 的 SN65HVD230)中,STB(Standby)引腳直接控制收發器的工作狀態。例如:
STB = 高電平:收發器關閉,僅消耗微量靜態電流。
STB = 低電平:收發器正常工作,可收發 CAN 信號。
系統集成:在復雜系統中,CAN_STB 可能由主控制器(如 MCU)輸出,協調多個 CAN 節點的電源狀態,優化整體能耗。
3. Air8000 整機開發板設計
注意!Air8000 整機開發板,CAN_STB 信號是直接引出來的,所以需要控制 GPIO 的電平拉低:
STB 為低電平是正常工作,所以需要手動把 gpio27 也就是 CAN_STB 拉低才可以

3.設置循環定時器,2 秒鐘發一次數據,根據節點判斷是 A 節點還是 B 節點打印節點發送信息,設置 test_cnt 計數器,每發送一次 +1,>8 的時候,設置為 1,然后使用 tx_buf:set(0,test_cnt)函數,把 buff 里面的內容設置成從索引 0 開始,連續 8 個字節被填充為 test_cnt,因為 zbuff 創建空間位 8,所以是 8 個字節,然后利用 tx_buf:seek 把光標位置設置為 test_cnt 的值,比如:填充完之后內容為 01 01 01 01 01 01 01 01,設置第一個光標的值設置完為 01,設置第二個光標為 01 01,然后利用 can.tx 發送內容,其中有涉及到是否需要應答的機制,can.tx 的第五個參數,need_ack
其中該機制為:
CAN 協議中的應答機制是其核心可靠性保障措施之一,主要通過以下方式實現:
1、應答機制的核心組成
ACK 應答位
應答間隙(ACK SLOT)
應答界定符(ACK DELIMITER)
2、應答機制的工作流程
數據傳輸
發送節點發送數據幀后進入等待應答狀態,總線進入仲裁階段。
仲裁與應答
錯誤處理

六、運行結果展示
6.1 完整代碼

6.2 結果展示

使用兩個 Air8000 整機開發板測試結果:

一個開發板為節點 A,一個開發板為節點 B,互相發送數據接收對方的數據。
七、總結
本文演示如何在 Air8000 整機開發板上面,用 CAN 接口,使用 USB 轉 CAN 工具進行數據的收發,然后使用 Air8000 整機開發板和 Air8000 整機開發板兩個開發板把 CAN 接口進行互連,進行雙方數據的互發互收的演示。
八、常見問題
1.如何判斷模塊是否正常,如何自測?
如果有 CAN 收發器的情況下,直接設置為 can.mode(can_id, can.MODE_TEST)測試然后日志提示發送成功,則表示模塊端的 CAN 接口功能均正常。如果發送失敗,則需要短接模塊的 CAN_TX 和 CAN_RX,測試是否發送正常,如果發送正常,證明模塊這兩個腳是是沒有問題的,測量下 STB 的電平是否是低,如果為高,則需要代碼里面設置對應的 gpio 拉低。
九、硬件電路說明
Air8000 CAN 硬件電路說明:https://docs.openluat.com/air8000/luatos/hardware/design/can/
今天的內容就分享到這里了!
審核編輯 黃宇
-
接口
+關注
關注
33文章
9519瀏覽量
157020 -
CAN
+關注
關注
59文章
3067瀏覽量
472741
發布評論請先 登錄
【迅為RK3568開發板NPU實戰】別再閑置你的NPU!手把手教你玩轉RKNN-Toolkit2 的使用
BLE 5.4時代下,Air8000藍牙通知與手機讀寫操作實戰攻略
是否必須使用LuatIO?Air8000 GPIO配置與設計規范深度解析
從零到一:基于Air8000的LuatOS softAP配網功能開發教程
LuatOS藍牙配網開發全攻略:以Air8000為核心實戰教學
Air8000藍牙掃描實戰:從代碼解析到場景應用全攻略
手把手教你 Air8000 模塊 CAN 接口開發與配置實戰全攻略
評論