引言
CAN 總線是目前應(yīng)用十分廣泛的現(xiàn)場總線,其僅通過一對差分信號線即可實現(xiàn)網(wǎng)絡(luò)中各節(jié)點之間的互聯(lián)和信息交互,具有極強(qiáng)的抗干擾能力[1-3]。CAN 總線采用非破壞性仲裁技術(shù)和自動重發(fā)機(jī)制,不僅能有效避免總線沖突,還能確保各節(jié)點數(shù)據(jù)的可靠傳輸[4-5]。此外,CAN 總線還具有實時性強(qiáng)、可靠性好、標(biāo)準(zhǔn)化程度高等優(yōu)勢[6-7]?;诖?,CAN總線被廣泛應(yīng)用于工業(yè)控制、汽車制造、儀器儀表、煤礦智能系統(tǒng)等多個領(lǐng)域。
CAN網(wǎng)絡(luò)中的節(jié)點不分主從,因此通信方式靈活,網(wǎng)絡(luò)擴(kuò)展性強(qiáng),受限于CAN總線驅(qū)動電路,目前CAN網(wǎng)絡(luò)組網(wǎng)節(jié)點數(shù)最大可達(dá)110個。對于確定的CAN網(wǎng)絡(luò),往往會因為應(yīng)用需求而向其中引入新的功能節(jié)點,為了使新節(jié)點能夠與網(wǎng)絡(luò)中原有節(jié)點進(jìn)行可靠通信,必須確保新節(jié)點的波特率與CAN總線波特率一致。通常,新節(jié)點的程序已固化在存儲器中,波特率的修改或配置困難,從而可能導(dǎo)致新節(jié)點的波特率無法匹配網(wǎng)絡(luò)波特率。為解決 CAN 總線波特率的匹配問題,參考文獻(xiàn)[8]和[9]通過對設(shè)定閾值與產(chǎn)生的錯誤計數(shù)值和接收到的正確報文數(shù)進(jìn)行比較來修改和匹配波特率,該方法存在閾值選取合理性問題,且采用 FPGA 開發(fā),不易推廣;參考文獻(xiàn)[10]采用波特率輪詢法,通過檢測 CAN 控制器是否產(chǎn)生錯誤來調(diào)整和匹配波特率,方法簡單,易于實現(xiàn),但在收、發(fā)雙方波特率較接近時,可能產(chǎn)生誤判問題;參考文獻(xiàn)[11]通過控制器分類及判斷波特率切換次數(shù)來實現(xiàn)波特率自適應(yīng),該方法未對切換次數(shù)達(dá)上限時進(jìn)行處理,存在波特率適配不成功的可能。參考文獻(xiàn)[12]結(jié)合輪詢法和探測法,在 Linux下實現(xiàn)了波特率自適應(yīng)。為了兼顧算法的可用性及波特率匹配的成功率,本文提出了改進(jìn)的波特率自適應(yīng)算法,經(jīng)實際測試,新增節(jié)點能夠通過發(fā)送測試報文或者接收廣播報文,較快地適配網(wǎng)絡(luò)波特率,可靠性高。
STM32F407IGT6是采用Cortex M4內(nèi)核的32位高性能單片機(jī),其內(nèi)部集成兩個支持CAN2.0A和2.0B協(xié)議的CAN控制器[13],用戶只需外擴(kuò)簡單的 CAN 收發(fā)器電路即可將其接入到 CAN 網(wǎng)絡(luò)中,從而實現(xiàn)與網(wǎng)絡(luò)中各節(jié)點間的數(shù)據(jù)通信。本文基于 STM32F407IGT6 嵌入式開發(fā)平臺設(shè)計了 CAN 波特率自適應(yīng)算法。
1
硬件設(shè)計
STM32F407IGT6 嵌入式開發(fā)平臺采用 TJA1050 作為CAN 收發(fā)器,該收發(fā)器完全兼容ISO11898標(biāo)準(zhǔn),最高速度可達(dá)1 Mb/s,此外,還具有電磁輻射低、抗干擾能力強(qiáng)、接口簡單等優(yōu)點。該嵌入式開發(fā)平臺中STM32F407IGT6與JTA1050之間的連接電路圖如圖1所示。
圖1? STM32F407與TJA1050連接電路圖
STM32F407IGT6的PA11、PA12引腳可復(fù)用為片內(nèi)CAN控制器收發(fā)數(shù)據(jù)的通道。由圖1可知,PA11和PA12引腳分別連接 TJA1050 的串行數(shù)據(jù)線 RXD 和 TXD,然后通過收發(fā)器內(nèi)部兩個具有差動接收和發(fā)送能力的總線終端CANH和CANL連接到總線線路上。實驗中CAN 模塊均作為終端使用,為了提高網(wǎng)絡(luò)的抗干擾能力、降低反射能量,在CANH和CANL之間連接了120Ω終端電阻。TJA1050具有兩種工作模式:高速模式和靜音模式,通過控制線S進(jìn)行選擇。為了使開發(fā)平臺能夠通過CAN總線實現(xiàn)數(shù)據(jù)收發(fā),將控制線S連接到GND,收發(fā)器的工作模式配置為高速模式。Vref為參考電壓輸出端,懸空即可。
2
軟件設(shè)計
CAN總線協(xié)議中位的同步通過位時序邏輯實現(xiàn),位時序邏輯監(jiān)視串行CAN總線,執(zhí)行采樣并調(diào)整采樣點位置。STM32F407IGT6片內(nèi)bxCAN模塊通過CAN_BTR寄存器實現(xiàn)位時序的設(shè)置,位時序圖如圖2所示。
圖2 bxCAN 模塊位時序圖
在CAN 通信中,一個數(shù)據(jù)位所持續(xù)的時間稱為標(biāo)稱位時間。由圖2可知,標(biāo)稱位時間由同步段、位段1和位段2三部分構(gòu)成,每一部分均包含若干個tq (最小時間單位),其中同步段固定為一個tq。波特率計算關(guān)系如式(1)~式(5)所示:
式(3)中,tPCLK 為主控制器 APB 總線時鐘的時間周期,該值在系統(tǒng)初始化時確定。BRP[9:0]、TS1[3:0]和TS2[2:0]為CAN_BTR 寄存器中對應(yīng)的位域,其中,BRP[9:0]用于實現(xiàn)CAN 總線波特率預(yù)分頻,TS1[3:0]和 TS2[2:0]用于確定位段1及位段2所包含的tq個數(shù)。此外,為了盡可能消除由于硬件問題帶來的波特率誤差,提高網(wǎng)絡(luò)容忍度并保證總線中收發(fā)節(jié)點采樣的準(zhǔn)確性,自定義波特率時還會引入SJW(再同步跳轉(zhuǎn)寬度)參數(shù),通常 SJW 取值為1個tq。圖2中,采樣點位置對應(yīng)位段1結(jié)束位置,通常采樣點位于標(biāo)稱位時間75%~87.5%的位置[14-16]。
基于式(1)~(5)及采樣點的設(shè)置規(guī)則,確定實驗所用的波特率列表,列表中共包含15個常用波特率,取值分別為:20kb/s、33.33kb/s、40kb/s、50kb/s、66.66kb/s、 80kb/s、100kb/s、125kb/s、200kb/s、250kb/s、400kb/s、 500kb/s、666kb/s、800kb/s和1000kb/s。
CAN 總線上的節(jié)點不存在主從關(guān)系,當(dāng)收、發(fā)節(jié)點波特率一致時,為了保證接收節(jié)點能夠接收到發(fā)送節(jié)點的特定報文,接收節(jié)點必須結(jié)合期望報文包中的ID(消息標(biāo)識符)正確配置篩選器。CAN2.0協(xié)議支持兩種數(shù)據(jù)幀格式,分別是ID為11位的標(biāo)準(zhǔn)幀和ID為29位的擴(kuò)展幀。本文實驗根據(jù)ID的取值范圍對兩種幀格式下的篩選器進(jìn)行了設(shè)置,因此支持對兩種幀格式報文的接收。
2.1 發(fā)送報文自適應(yīng)波特率
當(dāng)新節(jié)點作為發(fā)送節(jié)點加入到未知 CAN 網(wǎng)絡(luò)中時,若該節(jié)點的波特率與 CAN 網(wǎng)絡(luò)的波特率不一致,則會導(dǎo)致測試報文發(fā)送失敗,用戶通過查詢對應(yīng)的 TXOKx 位,即可獲取報文的最終發(fā)送狀態(tài)。若確定當(dāng)前波特率與網(wǎng)絡(luò)波特率不匹配,則可通過輪詢波特率列表來更改波特率,然后再次發(fā)送測試報文,若發(fā)送成功,則波特率匹配成功。發(fā)送報文實現(xiàn)波特率自適應(yīng)的軟件流程圖如圖3所示。
圖3 發(fā)送報文波特率自適應(yīng)流程圖
圖3中,設(shè)置輪詢次數(shù)為100次,也可適當(dāng)減小該值以加快波特率的匹配。在發(fā)送測試報文后,通過查詢CAN_TSR 寄存器中 TXOKx 位來判斷發(fā)送狀態(tài),這里需要注意的是,在執(zhí)行查詢操作前一定要留足夠的等待時間確保硬件能夠完成數(shù)據(jù)的傳輸。由于波特率列表包含的最小波特率為20 kb/s,即傳輸一位所需要的時間為50μs,而一幀報文(含填充位)的最大長度不會超過150位,當(dāng) APB 總線時鐘頻率為42 MHz時可計算出查詢狀態(tài)所需的等待時間不會超過7.5 ms。在初次確定波特率正確后,通過重置輪詢次數(shù)對識別結(jié)果進(jìn)行再次確認(rèn),目的是盡可能提高識別的準(zhǔn)確性,避免誤判。若第二次仍能滿足波特率匹配條件,則說明當(dāng)前波特率與網(wǎng)絡(luò)波特率確實一致,匹配成功。
2.2 接收報文自適應(yīng)波特率
通常,原有 CAN 網(wǎng)絡(luò)的節(jié)點都是會通過總線向網(wǎng)絡(luò)廣播報文的,因此,加入網(wǎng)絡(luò)的新節(jié)點也可以根據(jù)接收報文的狀態(tài)來修正波特率,從而達(dá)到自適應(yīng)網(wǎng)絡(luò)波特率的目的。bxCAN 模塊為用戶提供了錯誤狀態(tài)寄存器 CAN_ ESR,通過查詢該寄存器,可以獲取總線當(dāng)前的網(wǎng)絡(luò)狀態(tài)及錯誤信息。采用接收報文匹配波特率時,需要將新節(jié)點配置為靜默模式,此時節(jié)點可以接收數(shù)據(jù)幀,但不具備發(fā)送功能。此外,為了保證新節(jié)點能夠接收到任意數(shù)據(jù)包,需要將篩選器配置為標(biāo)識符掩碼模式,并設(shè)置掩碼為0。然后,定期查詢 CAN_ESR 寄存器的狀態(tài),若查詢到節(jié)點產(chǎn)生持續(xù)錯誤,則可認(rèn)定新節(jié)點的波特率與網(wǎng)絡(luò)波特率不匹配,修正波特率直到查詢的狀態(tài)無誤為止。通過接收報文實現(xiàn)新節(jié)點波特率自適應(yīng)的軟件流程圖如圖4所示。
圖4 接收報文波特率自適應(yīng)流程圖
錯誤狀態(tài)寄存器 CAN_ESR 包含了接收錯誤計數(shù)器 REC、發(fā)送錯誤計數(shù)器 REC、上一次錯誤代碼 LEC 等錯誤信息,并且還能根據(jù)收、發(fā)錯誤計數(shù)器的值對錯誤警告標(biāo)志 EWGF、錯誤被動標(biāo)志 EPVF及總線關(guān)閉標(biāo)志 BOFF 進(jìn)行設(shè)置。由于采用接收報文匹配波特率時CAN的模式被設(shè)置為靜默模式,因此不會產(chǎn)生發(fā)送錯誤,也不會標(biāo)記 BOFF 位。而錯誤代碼及其他標(biāo)志的設(shè)置,均由 REC 的值決定,當(dāng)接收期間產(chǎn)生錯誤時,REC 值會增加,而成功接收數(shù)據(jù)后該值能夠按1 遞減,若能連續(xù)接收成功,則該值最終會遞減到0。因此,為簡化波特率匹配條件,圖4 中根據(jù) CAN_ESR 是否為0來記錄錯誤次數(shù)。
圖4中,報文的接收并未開啟中斷,原因是在波特率不匹配時會因為接收錯誤而頻繁進(jìn)出中斷,一定程度上會增加CPU的開銷。在自適應(yīng)波特率期間,若查詢到 FIFO(FirstInFirstOut)中有報文,則應(yīng)及時從 FIFO 輸出郵箱中讀取報文并釋放郵箱,以保證其他郵箱中的報文能夠被正確讀取。在確認(rèn)波特率匹配成功后,CAN 的工作模式需配置為正常模式以實現(xiàn)收、發(fā)報文功能,篩選器也需根據(jù)接收報文的需求重新進(jìn)行設(shè)置。此外,為了提高報文接收效率,應(yīng)開啟接收中斷。
3
測試
為了方便對波特率自適應(yīng)算法進(jìn)行測試,這里定義10個消息標(biāo)識符,其中標(biāo)準(zhǔn)ID和擴(kuò)展ID各占5個。消息標(biāo)識符具體定義如下:
uint32_tmsg_id[10]=
{0x111,0x222,0x333,0x444,0x555,0x11111,0x22222, 0x33333,0x44444,0x5555};
此外,設(shè)計10條報文,對應(yīng)的數(shù)據(jù)部分定義如下:
uint8_tmsg_data[10][8]=
{"one","two","three","four","five","six","seven", "eight","nine","ten"};
3.1 發(fā)送報文自適應(yīng)波特率測試
新節(jié)點接入 CAN 網(wǎng)絡(luò)后,每隔50 ms發(fā)送一次測試報文。為了在波特率匹配成功時能夠直觀地看到接收節(jié)點收到的測試報文,這里取測試報文的ID 為0x111(可取 ID 列表中任意值),測試報文的內(nèi)容取"hello"。匹配成功后,新節(jié)點每隔50 ms從 msg_data[10][8]中讀取一條報文并廣播到網(wǎng)絡(luò),接收節(jié)點收到報文后通過串口打印出來。通過發(fā)送報文實現(xiàn)波特率自適應(yīng)的測試結(jié)果如圖5所示。
圖5 發(fā)送報文自適應(yīng)波特率的測試結(jié)果
圖5中,左側(cè)部分為新增節(jié)點輪詢波特率列表時的輸出結(jié)果,當(dāng)波特率切換為100kb/s時,與 CAN 網(wǎng)絡(luò)的波特率匹配成功并完成了系統(tǒng)初始化。右側(cè)部分為接收節(jié)點輸出結(jié)果,當(dāng)波特率匹配成功后,接收節(jié)點正確地打印了新增節(jié)點發(fā)送的數(shù)據(jù)。
3.2 接收報文自適應(yīng)波特率測試
新增節(jié)點接入 CAN 網(wǎng)絡(luò)后,配置工作模式為靜默模式,并監(jiān)聽網(wǎng)絡(luò)上所有數(shù)據(jù)包,之后在規(guī)定時間內(nèi)每隔10 ms讀取一次接收狀態(tài),并根據(jù)接收狀態(tài)修改或匹配波特率。當(dāng)波特率匹配成功時,新節(jié)點將接收到的報文數(shù)據(jù)通過串口打印出來,以表明正確匹配了網(wǎng)絡(luò)波特率。通過接收網(wǎng)絡(luò)報文實現(xiàn)波特率自適應(yīng)的測試結(jié)果如圖6所示。
圖6 接收報文自適應(yīng)波特率的測試結(jié)果
圖6中,左側(cè)部分為原網(wǎng)絡(luò)中發(fā)送節(jié)點的輸出信息,可知此時網(wǎng)絡(luò)的波特率為 20kp/s;右側(cè)部分為接收節(jié)點的結(jié)果,當(dāng)波特率不匹配時輪詢波特率列表,當(dāng)波特率也是20kp/s時實現(xiàn)波特率匹配,之后將接收到的報文數(shù)據(jù)通過串口正確地輸出。
4
結(jié)語
本文通過對 STM32F407IGT6 片內(nèi) bxCAN 模塊的研究,設(shè)計了 CAN 網(wǎng)絡(luò)新增節(jié)點通過發(fā)送報文或接收報文實現(xiàn)網(wǎng)絡(luò)波特率自適應(yīng)的算法。實驗結(jié)果表明,本文算法具有識別率高、穩(wěn)定可靠、速度快、簡單易實現(xiàn)等優(yōu)點,能有效解決 CAN網(wǎng)絡(luò)波特率未知時新增節(jié)點的波特率配置問題,一定程度上提高了 CAN 網(wǎng)絡(luò)通信的靈活性。
審核編輯:黃飛
評論