在工業(yè)通信與物聯(lián)網(wǎng)應(yīng)用中,CAN 總線以其高可靠性和實(shí)時性成為關(guān)鍵通信方式。Air8000 模塊集成 CAN 接口后,為設(shè)備互聯(lián)提供了強(qiáng)大支持。本文將帶你進(jìn)行一次完整的實(shí)戰(zhàn)演練,系統(tǒng)解析 Air8000 模塊 CAN 接口的開發(fā)與配置流程,涵蓋硬件連接、驅(qū)動移植、參數(shù)設(shè)置及調(diào)試技巧,助你快速掌握實(shí)際應(yīng)用要點(diǎn)。
一、CAN 概述
控制器局域網(wǎng)(Controller Area Network,CAN)是一種廣泛應(yīng)用于工業(yè)控制、汽車電子等領(lǐng)域的實(shí)時通信協(xié)議,由德國博世公司于 1986 年提出并標(biāo)準(zhǔn)化(ISO 11898)。其核心采用多主(Multi-Master)總線架構(gòu),通過差分信號傳輸實(shí)現(xiàn)高抗干擾能力,支持節(jié)點(diǎn)間以廣播形式進(jìn)行高效、可靠的數(shù)據(jù)交換。CAN 協(xié)議基于非破壞性仲裁機(jī)制,利用報文 ID 優(yōu)先級解決總線沖突,確保高優(yōu)先級數(shù)據(jù)實(shí)時傳輸,同時具備完善的錯誤檢測、幀校驗和故障節(jié)點(diǎn)自動關(guān)閉功能,滿足嚴(yán)苛環(huán)境下的安全性需求。典型應(yīng)用包括汽車 ECU 通信(如動力總成、車身控制)、工業(yè)自動化(如 PLC 聯(lián)網(wǎng))及醫(yī)療設(shè)備互聯(lián),其衍生協(xié)議如 CAN FD(靈活數(shù)據(jù)率)進(jìn)一步提升了帶寬與靈活性,成為現(xiàn)代分布式控制系統(tǒng)的基礎(chǔ)技術(shù)之一。
二、演示功能概述
本篇文章演示的內(nèi)容為:用兩種方式測試 Air8000 的 CAN 功能,第一種是使用 Air8000 整機(jī)開發(fā)板使用 CAN 連接 CAN 轉(zhuǎn) USB 工具,進(jìn)行數(shù)據(jù)收發(fā),第二種是使用 Air8000 整機(jī)開發(fā)板和 Air8000 整機(jī)開發(fā)板進(jìn)行 CAN 功能的收發(fā)測試。
三、準(zhǔn)備硬件環(huán)境
參考:硬件環(huán)境清單第二章節(jié)內(nèi)容,準(zhǔn)備以及組裝好硬件環(huán)境。
3.1 Air8000 整機(jī)開發(fā)板

3.2 高速 USB-CAN 分析儀

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

Air8000 整機(jī)開發(fā)板和 Air8000 整機(jī)開發(fā)板連接圖:

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

返回值

例子

can.on(id, func)
注冊 CAN 事件回調(diào)
參數(shù)

返回值

例子

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

返回值

例子

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

返回值

例子

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

返回值

例子

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

返回值

例子

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

返回值

例子

can.debug(on_off)
CAN debug 開關(guān),打開后有更詳細(xì)的打印
參數(shù)

返回值
無
例子

zbuff.create(length,data,type)
創(chuàng)建 zbuff
參數(shù)

返回值

例子

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

返回值
無
例子

buff:seek(base,offset)
zbuff 設(shè)置光標(biāo)位置(可能與當(dāng)前指針位置有關(guān);執(zhí)行后指針會被設(shè)置到指定位置)
參數(shù)

返回值

例子

mcu.x32(value)
轉(zhuǎn)換 10 進(jìn)制數(shù)為 16 進(jìn)制字符串輸出
參數(shù)

返回值

例子

5.2 常量值解釋

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

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

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

六、運(yùn)行結(jié)果展示
6.1 完整代碼

6.2 結(jié)果展示

使用兩個 Air8000 整機(jī)開發(fā)板測試結(jié)果:

一個開發(fā)板為節(jié)點(diǎn) A,一個開發(fā)板為節(jié)點(diǎn) B,互相發(fā)送數(shù)據(jù)接收對方的數(shù)據(jù)。
七、總結(jié)
本文演示如何在 Air8000 整機(jī)開發(fā)板上面,用 CAN 接口,使用 USB 轉(zhuǎn) CAN 工具進(jìn)行數(shù)據(jù)的收發(fā),然后使用 Air8000 整機(jī)開發(fā)板和 Air8000 整機(jī)開發(fā)板兩個開發(fā)板把 CAN 接口進(jìn)行互連,進(jìn)行雙方數(shù)據(jù)的互發(fā)互收的演示。
八、常見問題
1.如何判斷模塊是否正常,如何自測?
如果有 CAN 收發(fā)器的情況下,直接設(shè)置為 can.mode(can_id, can.MODE_TEST)測試然后日志提示發(fā)送成功,則表示模塊端的 CAN 接口功能均正常。如果發(fā)送失敗,則需要短接模塊的 CAN_TX 和 CAN_RX,測試是否發(fā)送正常,如果發(fā)送正常,證明模塊這兩個腳是是沒有問題的,測量下 STB 的電平是否是低,如果為高,則需要代碼里面設(shè)置對應(yīng)的 gpio 拉低。
九、硬件電路說明
Air8000 CAN 硬件電路說明:https://docs.openluat.com/air8000/luatos/hardware/design/can/
今天的內(nèi)容就分享到這里了!
審核編輯 黃宇
-
接口
+關(guān)注
關(guān)注
33文章
9520瀏覽量
157021 -
CAN
+關(guān)注
關(guān)注
59文章
3067瀏覽量
472745
發(fā)布評論請先 登錄
Air8000 BLE外圍模式全解析:數(shù)據(jù)收發(fā)實(shí)戰(zhàn)指南!
手把手教你 Air8000 模塊 CAN 接口開發(fā)與配置實(shí)戰(zhàn)全攻略
雙 Air8000 核心板構(gòu)建 BLE 中心模式通信系統(tǒng)全流程
一招破解音頻硬件困局:Air8000參考設(shè)計讓開發(fā)零門檻
BLE 5.4時代下,Air8000藍(lán)牙通知與手機(jī)讀寫操作實(shí)戰(zhàn)攻略
揭秘Air8000對講黑科技:AirTalk+MQTT開發(fā)示例深度解析
是否必須使用LuatIO?Air8000 GPIO配置與設(shè)計規(guī)范深度解析
從零到一:基于Air8000的LuatOS softAP配網(wǎng)功能開發(fā)教程
高效開發(fā):解鎖Air8000 LuatOS softAP配網(wǎng)功能的核心技術(shù)!
LuatOS藍(lán)牙配網(wǎng)開發(fā)全攻略:以Air8000為核心實(shí)戰(zhàn)教學(xué)
LuatOS藍(lán)牙配網(wǎng)全流程解析:Air8000開發(fā)入門必備
Air8000藍(lán)牙掃描實(shí)戰(zhàn):從代碼解析到場景應(yīng)用全攻略
多功能+高擴(kuò)展能力加持,Air8000開發(fā)板最新資料
技術(shù)篇——Air8000開發(fā)板,一站式滿足多功能高擴(kuò)展開發(fā)需求!
Air8000 Wi-Fi功能實(shí)操指南:固件升級與網(wǎng)絡(luò)配置步驟!
Air8000 模塊 CAN 接口實(shí)戰(zhàn)開發(fā):從入門到配置的完整流程指南
評論