<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

求一種CAN總線波特率的自適應算法設計方案

麥克泰技術 ? 來源:嵌入式系統專家之聲 ? 2023-12-26 11:12 ? 次閱讀

引言

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所示。

133559d8-a39c-11ee-8b88-92fbcf53809c.png

圖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所示。

13404848-a39c-11ee-8b88-92fbcf53809c.png

圖2 bxCAN 模塊位時序圖

在CAN 通信中,一個數據位所持續的時間稱為標稱位時間。由圖2可知,標稱位時間由同步段、位段1和位段2三部分構成,每一部分均包含若干個tq (最小時間單位),其中同步段固定為一個tq。波特率計算關系如式(1)~式(5)所示:

1349a85c-a39c-11ee-8b88-92fbcf53809c.png

式(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所示。

135be968-a39c-11ee-8b88-92fbcf53809c.png

圖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所示。

137cbc42-a39c-11ee-8b88-92fbcf53809c.png

圖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所示。

138bf4d2-a39c-11ee-8b88-92fbcf53809c.png

圖5 發送報文自適應波特率的測試結果

圖5中,左側部分為新增節點輪詢波特率列表時的輸出結果,當波特率切換為100kb/s時,與 CAN 網絡的波特率匹配成功并完成了系統初始化。右側部分為接收節點輸出結果,當波特率匹配成功后,接收節點正確地打印了新增節點發送的數據。

3.2 接收報文自適應波特率測試

新增節點接入 CAN 網絡后,配置工作模式為靜默模式,并監聽網絡上所有數據包,之后在規定時間內每隔10 ms讀取一次接收狀態,并根據接收狀態修改或匹配波特率。當波特率匹配成功時,新節點將接收到的報文數據通過串口打印出來,以表明正確匹配了網絡波特率。通過接收網絡報文實現波特率自適應的測試結果如圖6所示。

1390b3fa-a39c-11ee-8b88-92fbcf53809c.png

圖6 接收報文自適應波特率的測試結果

圖6中,左側部分為原網絡中發送節點的輸出信息,可知此時網絡的波特率為 20kp/s;右側部分為接收節點的結果,當波特率不匹配時輪詢波特率列表,當波特率也是20kp/s時實現波特率匹配,之后將接收到的報文數據通過串口正確地輸出。

4

結語

本文通過對 STM32F407IGT6 片內 bxCAN 模塊的研究,設計了 CAN 網絡新增節點通過發送報文或接收報文實現網絡波特率自適應的算法。實驗結果表明,本文算法具有識別率高、穩定可靠、速度快、簡單易實現等優點,能有效解決 CAN網絡波特率未知時新增節點的波特率配置問題,一定程度上提高了 CAN 網絡通信的靈活性。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6001

    文章

    43973

    瀏覽量

    620838
  • CAN總線
    +關注

    關注

    145

    文章

    1812

    瀏覽量

    129592
  • 波特率
    +關注

    關注

    2

    文章

    280

    瀏覽量

    33760
  • CAN控制器
    +關注

    關注

    3

    文章

    73

    瀏覽量

    14910
  • STM32F407
    +關注

    關注

    15

    文章

    187

    瀏覽量

    28973
收藏 人收藏

    評論

    相關推薦

    can波特率計算

    can波特率其實并不難計算,這里給出了can波特率的簡單計算,并給出了實例STM32的CAN波特率
    發表于 12-14 17:02 ?1.1w次閱讀
    <b class='flag-5'>can</b><b class='flag-5'>波特率</b>計算

    排查問題:降低CAN總線波特率嘗試解決問題,失敗

    CAN總線波特率波特率發生器can總線控制器總線
    jf_06209345
    發布于 :2022年03月18日 20:08:01

    #硬聲創作季 #CAN #PLC 總線設計的波特率應該如何選擇?

    CAN波特率波特率發生器
    學習電子知識
    發布于 :2022年11月02日 20:00:29

    實現CAN的高速超遠程傳輸--CAN波特率轉換器BTL-CAN

    CAN總線可以在5Kbps波特率時傳輸最遠10Km、在10Kbps波特率時傳輸最遠5Km、在100Kbps波特率時傳輸最遠500m,增加
    發表于 03-24 14:28

    經驗之談:波特率自適應

    ,此時就會考慮波特率識別問題,即波特率自適應問題。根據自己的些從業經驗,將這些系統設計時針對波特率自適
    發表于 09-24 11:52

    請問如何利用程序(STM32)判斷CAN總線波特率/通訊協議?

    /數據幀格式,那么更換下一種波特率再次測試。5、如果枚舉全部波特率都沒有找到合適的協議,那么程序給出提示,進入死循環?,F在的狀況是:如果固定協議,我的節點跑起來沒有問題,可是采用上述這種方法來測試通訊
    發表于 12-28 08:54

    非標準CAN波特率的計算

    影響CAN總線穩定的因素有很多,其中波特率項非常重要的指標,很多工程師在選擇波特率時非常頭疼。今天我們就來說說該如何快速解決特殊
    發表于 07-29 08:00

    如何用CAN控制器檢測到CAN總線上的波特率?

    CAN控制器怎樣檢測到CAN總線上的波特率?在不知道CAN總線
    發表于 04-22 01:12

    具有波特率自適應功能的無線數據傳輸模塊設計怎么實現?

    具有波特率自適應功能的無線數據傳輸模塊設計怎么實現?
    發表于 06-01 06:40

    CAN波特率的計算

    重新同步跳躍寬度,不參與波特率的計算,其值可以編程為1到4個時間單元,表示該總線波特率范圍的容差度。公式中1表示同步段固定為個單位時間。)APB1Clock=36Mhz,
    發表于 08-20 08:11

    波特率自適應的RS485中繼器設計

    在RS485 總線路上配置波特率自適應的中繼器是完成串口通信線路擴展的有效方法。本文利用W77E58 雙串口單片機和MAX485 芯片較好地實現了中繼任務,并通過軟件方式實現波特率
    發表于 01-25 11:48 ?99次下載

    CAN總線光纖轉換器怎么實現波特率的設置

    can總線光纖轉換器是能夠將CAN總線數據轉換為光信號進行傳輸的設備,是一種非常典型的遠程CAN
    的頭像 發表于 06-28 14:36 ?1524次閱讀

    AN4908_USART自適應波特率

    AN4908_USART自適應波特率
    發表于 11-21 17:06 ?3次下載
    AN4908_USART<b class='flag-5'>自適應</b><b class='flag-5'>波特率</b>

    can總線波特率一般采用多少?

    can總線波特率一般采用多少 Can總線是指Controller Area Network,是一種
    的頭像 發表于 09-07 15:05 ?1868次閱讀

    以太網CAN轉換器波特率的設置步驟是怎樣的?

    確定CAN總線波特率:首先,需要確定所連接的CAN總線波特率。
    的頭像 發表于 01-17 09:24 ?388次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>