項(xiàng)目背景
本項(xiàng)目基于睿擎派RC3506J開(kāi)發(fā)板,實(shí)現(xiàn)了一套車載空調(diào)風(fēng)機(jī)CAN總線控制系統(tǒng)原型。系統(tǒng)以RC3506J作為空調(diào)域控制器下的智能上位機(jī),通過(guò)CAN FD控制器(can0,500kbps)與STM32G474 FOC電機(jī)驅(qū)動(dòng)板通信,構(gòu)建了完整的”域控—執(zhí)行”兩級(jí)架構(gòu)。RC3506J端部署RT-Thread操作系統(tǒng)與webnet網(wǎng)絡(luò)組件,提供基于Web瀏覽器的圖形化控制界面,支持電機(jī)啟停、轉(zhuǎn)速調(diào)節(jié)、正反轉(zhuǎn)切換及故障管理;STM32G474端利用MCSDK的mc_api接口實(shí)現(xiàn)FOC矢量控制,兩端的CAN協(xié)議層復(fù)用與ST Motor Pilot相同的底層API,做到了對(duì)原廠控制代碼的無(wú)侵入接入。
項(xiàng)目完整模擬了車載空調(diào)風(fēng)機(jī)的控制鏈路:空調(diào)域控制器(RC3506J)通過(guò)車載CAN總線向風(fēng)機(jī)驅(qū)動(dòng)器(STM32G474)下發(fā)目標(biāo)轉(zhuǎn)速指令,風(fēng)機(jī)驅(qū)動(dòng)器回傳實(shí)時(shí)轉(zhuǎn)速、運(yùn)行狀態(tài)與故障碼,域控制器將數(shù)據(jù)轉(zhuǎn)發(fā)至車載以太網(wǎng)供中控屏或診斷工具訪問(wèn)。本原型為后續(xù)擴(kuò)展AUTOSAR CAN協(xié)議棧、UDS診斷服務(wù)及OTA升級(jí)提供了清晰的軟件框架。

硬件平臺(tái)
本系統(tǒng)由兩級(jí)硬件構(gòu)成:RC3506J負(fù)責(zé)通信管理與人機(jī)交互,STM32G474負(fù)責(zé)電機(jī)實(shí)時(shí)控制。
主控設(shè)備:睿擎派RC3506J
睿擎派RC3506J是上海睿賽德電子推出的工業(yè)級(jí)評(píng)估板,搭載瑞芯微RK3506處理器(三核Cortex-A7 + 單核Cortex-M0異構(gòu)架構(gòu)),片內(nèi)集成CAN FD控制器、雙以太網(wǎng)GMAC和豐富的GPIO資源。本次試用重點(diǎn)評(píng)估了以下三項(xiàng)核心外設(shè):
CAN FD控制器(can0):兼容CAN 2.0與CAN FD協(xié)議,支持最高8Mbps數(shù)據(jù)段速率。本項(xiàng)目配置為500kbps經(jīng)典CAN模式,通過(guò)GPIO0_C3(TX)/GPIO0_C4(RX)與外部CAN收發(fā)器連接。RK3506的CAN FD IP支持硬件自動(dòng)重發(fā)、總線錯(cuò)誤診斷和靈活的過(guò)濾器配置。
以太網(wǎng)(GMAC0):板載RGMII PHY,本項(xiàng)目配置靜態(tài)IP 192.168.1.30,承載webnet輕量級(jí)Web服務(wù)器,為PC/手機(jī)瀏覽器提供控制界面訪問(wèn)入口。
RT-Thread操作系統(tǒng):睿擎派出廠預(yù)裝RT-Thread,內(nèi)核支持多線程調(diào)度、信號(hào)量/互斥量IPC、設(shè)備驅(qū)動(dòng)框架(CAN、GMAC)及webnet組件,極大降低了應(yīng)用層開(kāi)發(fā)門(mén)檻。

執(zhí)行設(shè)備:STM32G474 FOC驅(qū)動(dòng)板
STM32G474RET6 MCU,ARM Cortex-M4F @170MHz,集成FDCAN控制器與CORDIC加速器
X-NUCLEO-IHM16M1功率板,基于STSPIN830驅(qū)動(dòng)3-Shunt BLDC/PMSM電機(jī)
ST MCSDK生成的FOC固件基礎(chǔ),預(yù)留USER CODE插入點(diǎn)供CAN功能擴(kuò)展

系統(tǒng)互聯(lián)拓?fù)?/span>

項(xiàng)目分析與實(shí)現(xiàn)
CAN總線通信協(xié)議設(shè)計(jì)
系統(tǒng)定義了一套精簡(jiǎn)的8字節(jié)CAN應(yīng)用層協(xié)議,命令幀與狀態(tài)幀各占一個(gè)標(biāo)準(zhǔn)ID:

RC3506J側(cè)軟件架構(gòu)
RC3506J端程序(motor_control.c)采用分層設(shè)計(jì):
CAN設(shè)備層:基于RT-Thread CAN 設(shè)備框架,完成事件回調(diào)掩碼配置→SET_BAUD(500k)→中斷模式打開(kāi)→注冊(cè)RX indicate回調(diào)→創(chuàng)建RX接收線程的標(biāo)準(zhǔn)初始化流程。
協(xié)議解析層:RX線程通過(guò)信號(hào)量阻塞等待CAN幀到達(dá),解析狀態(tài)幀(0x201)提取float轉(zhuǎn)速、uint8運(yùn)行狀態(tài)、uint16故障碼和uint8控制模式,更新全局g_motor_status緩存。
CGI應(yīng)用層:注冊(cè)5個(gè)webnet CGI端點(diǎn)(/cgi-bin/start, stop, speed, fault_ack, status),瀏覽器通過(guò)AJAX輪詢status端點(diǎn)(100ms周期)獲取實(shí)時(shí)數(shù)據(jù),通過(guò)start/stop/speed端點(diǎn)下發(fā)控制指令。
Web前端:單頁(yè)HTML,SVG環(huán)形轉(zhuǎn)速表盤(pán)、啟停/故障按鈕、速度滑塊、斜坡時(shí)間輸入框,狀態(tài)徽章和故障碼顯示。
STM32G474側(cè)軟件架構(gòu)
can_control.c在USER CODE區(qū)塊嵌入,復(fù)用mc_api.h全部接口,與ST Motor Pilot走同一調(diào)用路徑。
FDCAN配置:500kbps經(jīng)典CAN(Prescaler=17, Seg1=9, Seg2=10),全局過(guò)濾器接收全部標(biāo)準(zhǔn)幀至RX FIFO 0,軟件層按ID=0x200篩選指令。
CAN_Control_Process()在MC_RunMotorControlTasks()中被周期調(diào)用(500μs粒度),輪詢RX FIFO并定時(shí)100ms發(fā)送狀態(tài)幀。
關(guān)鍵原則:不修改Src/Inc之外的庫(kù)代碼——CAN功能完全在USER CODE區(qū)實(shí)現(xiàn)。
RT-Thread應(yīng)用開(kāi)發(fā)要點(diǎn)
睿擎派RC3506J出廠即支持RT-Thread,無(wú)需底層移植。本項(xiàng)目側(cè)重于利用RT-Thread的CAN設(shè)備框架和webnet組件進(jìn)行應(yīng)用開(kāi)發(fā)。
一、打通CAN總線通信
RK3506的CAN FD驅(qū)動(dòng)(rockchip,rk3506-canfd)采用RT-Thread CAN總線驅(qū)動(dòng) 框架。核心要點(diǎn):
1. 設(shè)備初始化順序
RK3506 CAN驅(qū)動(dòng)要求嚴(yán)格的初始化順序——事件回調(diào)掩碼必須在SET_BAUD之前設(shè)置,否則驅(qū)動(dòng)內(nèi)部狀態(tài)機(jī)無(wú)法正確啟動(dòng)異步發(fā)送線程:
/* 正確順序 */rt_device_control(dev, RT_CAN_CTL_SET_EVENT_CALLBACK_MASK, ...); // 先rt_device_control(dev, RT_CAN_CTL_SET_BAUD, (void *)baud_val); // 后rt_device_open(dev, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX);
2. 波特率參數(shù)傳遞方式
CAN 框架中,SET_BAUD接收void參數(shù),RK3506驅(qū)動(dòng)將其直接解釋為波特率整數(shù)值(而非指針解引用)。必須使用`(void )CAN500kBaud值傳遞形式,而非&baud`指針傳遞形式,否則驅(qū)動(dòng)將把棧地址誤認(rèn)為波特率值。
static rt_uint32_t can_baud = CAN500kBaud;rt_device_control(can_dev, RT_CAN_CTL_SET_BAUD, (void *)can_baud); // 正確:值傳遞
3. CAN消息結(jié)構(gòu)體字段
CAN的rt_can_msg采用位域定義,包含fdf(CAN FD標(biāo)志)、brs(速率切換)、priv(優(yōu)先級(jí))和sync(同步/異步模式)等擴(kuò)展字段。這些字段不應(yīng)使用memset清零后依賴默認(rèn)值,而應(yīng)顯式賦值:
struct rt_can_msg msg;msg.priv = LOW_PRIORITY;msg.sync = CAN_SYNC;msg.fdf = CAN_20;
4. 接收路徑:信號(hào)量+線程模式
RK3506 CAN FD驅(qū)動(dòng)不支持定時(shí)器輪詢r(jià)t_device_read——該路徑在不注冊(cè)RX indicate回調(diào)時(shí)靜默返回空。正確做法是注冊(cè)rt_device_set_rx_indicate回調(diào),在ISR中釋放信號(hào)量,由獨(dú)立接收線程阻塞等待信號(hào)量后讀取幀。這一模式已在can_loopback_test命令中充分驗(yàn)證。
/* RX indicate (ISR) */static rt_err_t can_rx_indicate(rt_device_t dev, rt_size_t size) {rt_sem_release(can_rx_sem);return RT_EOK;}/* RX thread */static void can_rx_thread_entry(void *param) {while (can_rx_run) {rt_sem_take(can_rx_sem, ...);rt_device_read(can_dev, 0, &rx_msg, 1);/* 解析并更新 g_motor_status */}}
二、webnet組件集成
利用webnet的CGI注冊(cè)機(jī)制(webnet_cgi_register),將5個(gè)API端點(diǎn)映射到對(duì)應(yīng)的C函數(shù)
CGI handler直接調(diào)用can_send_frame寫(xiě)入CAN設(shè)備,同步返回JSON確認(rèn)
status端點(diǎn)讀取全局緩存g_motor_status,無(wú)需阻塞等待——數(shù)據(jù)由RX線程異步刷新
Web前端采用純靜態(tài)HTML+CSS+JS,通過(guò)AJAX定時(shí)輪詢實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)更新
遇到的問(wèn)題與解決辦法
問(wèn)題:CAN通信波特率不匹配
RK3506 CAN FD驅(qū)動(dòng)的默認(rèn)波特率由DTS時(shí)鐘樹(shù)決定(200MHz CAN時(shí)鐘 → 約1.47Mbps仲裁段 + 2Mbps數(shù)據(jù)段),調(diào)用rt_device_control(SET_BAUD, 500k)后驅(qū)動(dòng)返回RT_EOK但實(shí)際未生效,且報(bào)”device has been opened”錯(cuò)誤。
解決:將STM32G474的FDCAN波特率匹配至RK3506默認(rèn)值(500kbps經(jīng)典CAN模式),使兩端速率一致。
效果展示
視頻地址:https://www.bilibili.com/video/BV1Lt7w6CE6k
系統(tǒng)上電后,在MSH終端執(zhí)行cmd_motor_control啟動(dòng)服務(wù):
msh />cmd_motor_control[] Starting motor control web server...[] CAN opened OK @ 500kbps[] RX thread started[] CAN init done[] Webnet started with CGI handlers
PC瀏覽器訪問(wèn)http://192.168.1.30/,顯示圖形化控制界面:中央SVG環(huán)形表盤(pán)實(shí)時(shí)顯示轉(zhuǎn)速(正向綠色/反向橙色/停止灰色),下方狀態(tài)徽章指示IDLE/RUN/FAULT等運(yùn)行狀態(tài)。控制面板提供啟停按鈕、速度滑塊(-2000~+2000 RPM)、斜坡時(shí)間設(shè)定框(100~10000ms)和故障確認(rèn)按鈕。頁(yè)面以100ms周期AJAX輪詢status端點(diǎn),表盤(pán)動(dòng)畫(huà)流暢。
STM32驅(qū)動(dòng)板側(cè),CAN指令通過(guò)MC_StartMotor1()/MC_ProgramSpeedRampMotor1_F()直達(dá)FOC算法層,電機(jī)按設(shè)定斜坡平滑調(diào)速,實(shí)際轉(zhuǎn)速經(jīng)CAN狀態(tài)幀回傳至RC3506J并實(shí)時(shí)呈現(xiàn)在Web界面。

試用感想
睿擎派RC3506J在此次車載空調(diào)風(fēng)機(jī)控制原型的開(kāi)發(fā)中展現(xiàn)了令人印象深刻的綜合能力。
硬件層面,RK3506的異構(gòu)多核架構(gòu)為”通信+控制”分工提供了天然的硬件基礎(chǔ)——Cortex-A7核心承載RT-Thread操作系統(tǒng)、webnet網(wǎng)絡(luò)協(xié)議棧和CAN設(shè)備管理,Cortex-M0核心可用于實(shí)時(shí)性要求更高的底層邏輯。片內(nèi)CAN FD控制器與雙以太網(wǎng)的組合,完美契合車載域控制器的通信需求:CAN總線能夠接入車身控制網(wǎng)絡(luò),以太網(wǎng)能夠支持連接車內(nèi)信息娛樂(lè)系統(tǒng)或診斷網(wǎng)關(guān)。
軟件生態(tài)層面,RT-Thread的統(tǒng)一設(shè)備模型和豐富的組件庫(kù)(webnet、finsh/MSH)將應(yīng)用層與驅(qū)動(dòng)層解耦,大幅縮短了從原型到驗(yàn)證的開(kāi)發(fā)周期。MSH命令行工具在調(diào)試階段尤為實(shí)用——can_loopback_test命令幫助快速定位了CAN收發(fā)路徑的關(guān)鍵差異,成為排障的核心手段。
開(kāi)發(fā)體驗(yàn)方面,睿擎派RC3506J在SDK中提供了非常豐富的例程,幾乎涵蓋了各個(gè)關(guān)鍵組件。這使得我在開(kāi)發(fā)的過(guò)程中可以快速上手改造,實(shí)現(xiàn)自己的想法,而且可以看到官方開(kāi)發(fā)人員仍在對(duì)SDK保持熱點(diǎn)更新維護(hù),持續(xù)加入更多的應(yīng)用示例,這一點(diǎn)非常值得點(diǎn)贊!
總結(jié):RC3506J在工業(yè)控制、汽車電子等需要CAN總線+以太網(wǎng)雙通道通信的場(chǎng)景中具有顯著的平臺(tái)優(yōu)勢(shì)。其強(qiáng)大的處理性能、完善的外設(shè)集成和RT-Thread的生態(tài)加持,使其成為從原型驗(yàn)證到量產(chǎn)部署的理想選擇。期待睿擎派后續(xù)在驅(qū)動(dòng)成熟度、SDK文檔完善度和典型應(yīng)用參考設(shè)計(jì)方面持續(xù)投入,進(jìn)一步降低開(kāi)發(fā)者的接入成本。
最后感謝RT-Thread和睿擎派提供的試用機(jī)會(huì)!
版權(quán)聲明:
本文為RT-Thread論壇用戶「楓雪天」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:
https://club.rt-thread.org/ask/article/f70f94fbecf64f8f.html
歡迎加入交流群,共同學(xué)習(xí)共同進(jìn)步!



