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