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