潘文卿,劉興義,王飛飛,宋炳雨,穆大蕓
(濰柴動力股份有限公司,山東 濰坊 261061)
在汽車領域,因為功能越來越多,越來越復雜,負載率越來越高,傳統CAN總線難以滿足當前需求,又不可能直接放棄傳統CAN總線技術,為了解決負載率問題還要兼容傳統的CAN總線,CANFD應運而生。2011年BOSCH首次發布了CANFD(CAN with Flexible Data rate)方案,在滿足CAN總線特性的基礎上升級了波特率和數據長度的兩大特性,在數據段傳輸時既可以提升速率又可以增加數據長度,最大可以一次傳輸64字節,大大節省了數據傳輸的時間,CANFD同時還繼承了傳統CAN的主要特性,采用雙線串行通信協議,非破壞性仲裁技術,分布式實時控制,可靠的錯誤處理和檢測機制。
對比傳統的CAN[1]如圖1所示。
1)CANFD不支持遠程幀,所以原來RTR位用RRS替代,并且始終為顯性位“0”。
2)為了區分CANFD與CAN,增加了FDF(FD Format)位,0表示傳統CAN,1表示CANFD。
3)CANFD最顯著的特征就是數據段可以提升傳輸速率,在CANFD仲裁場增加BRS(Bit Rate Switch)位,1表示進行速率切換,0表示不進行速率切換。

圖1 CANFD幀格式
4)CANFD最大可傳輸64字節的數據,所以原來4個字節的DLC(Data Length Code)需要重新編碼,既支持傳統的CAN,也要支持最大64個字節的CANFD,具體編碼方式見表1。
5)CRC(Cyclic Redundancy Check)校驗在傳統CAN的基礎上進行了升級,如果數據段的長度大于16個字節時,CRC的長度為21bits,小于16個字節時,CRC的長度是17bits,CANFD對CRC算法做了改變。在校驗和部分從第1位開始每4bits添加一個填充位加以分割,這個填充位的值是上一位的反碼。
6)ESI(Error State Indicator)錯誤知識狀態位,0表示CANFD節點處于主動報錯狀態,1表示CANFD節點處于被動報錯狀態[2]。
傳統CAN僅有一套預分頻方式,CANFD確定仲裁段預分頻因子和數據段預分頻因子有兩種方式[3]:①兩套獨立的預分頻配置方式,仲裁段預分頻因子不等于數據段預分頻因子。②一套共享的預分頻配置方式,仲裁段預分頻因子等于數據段預分頻因子。

表1 CAN&CANFD DLC編碼表
在研究和應用中發現如果采用第1種兩套獨立的預分頻配置方式,采樣會有誤差,所以選用第2種配置方式。根據實際應用中基于單片機時鐘配置,仲裁段和數據段設置相同的分頻因子。同時考慮仲裁段和數據段的波特率都會在1Mb/s以上,為保證信號采集的準確性,采樣點的配置需要大于80%以上。
分析基于擴展幀格式的傳統CAN和CANFD報文的傳輸時間理論上均以有效位計算,不考慮填充位。傳統CAN通信,按照最大波特率1Mb/s,傳輸1bit的時間是1μs,報文數據長度是8字節,一幀不計算數據填充位的報文長度是128bits,傳輸一幀報文的時間是128μs。
根據實際應用中CANFD報文的仲裁段按照1Mb/s波特率配置,其中BRS速率切換指示位是數據段波特率加速過渡階段,BRS階段前半段為仲裁段,會采用仲裁段的波特率,后半段采用數據段的波特率,所以計算BRS的整體脈寬則是分別取兩種波特率脈寬的一半,進行累加,CRC界定符同理[4]。仲裁段按照圖1的幀格式計算傳輸時間為45μs,數據段按照不同的波特率和不同數據長度,傳輸時間見表2。
數據段按照2Mb/s波特率配置,傳輸一幀報文的時間按照兩種波特率的配置方式計算,仲裁段是1μs/bit,數據段0.5μs/bit,按照傳輸數據的長度,如果是最大64字節數據,一幀報文仲裁段45bits,數據段543bits,傳輸一幀64字節數據的CANFD報文的時間是仲裁段45μs,數據段271.5μs,傳輸一幀數據是64字節的CANFD報文不考慮填充位的理論時間是45μs+271.5μs=316.5μs;如果是8字節數據,一幀報文仲裁段45bits,數據段91bits,傳輸一幀8字節數據的CANFD報文的時間是45μs+45.5μs=90.5μs。

表2 數據段不同配置對應報文時間
對比分析同樣是一幀8字節數據的報文,傳統CAN采用1Mb/s波特率,需要128μs;通過CANFD協議,仲裁段采用1Mb/s,數據段采用2Mb/s傳輸,需要90.5μs。整條報文的傳輸時間相較于傳統CAN并未提升50%,僅僅提升了(128-90.5)/128=29.3%左右,原因主要有兩點:①CANFD的數據長度加長了,傳統CAN是128bits,CANFD是136bits;②數據傳輸時間提升是在數據段的91bits,仲裁段的45bits依然是按照1Mb/s的波特率,1μs/bit的時間傳輸。
CANFD在刷寫中的理論計算如下。
如果要傳輸2048個字節的數據,按照傳統的UDS刷寫協議[6],采用傳統CAN-1Mb/s的波特率傳輸,需要295條報文,理論計算用時295*128μs=37760μs。
采用CANFD協議,仲裁段1Mb/s,數據段2Mb/s,第一種情況:數據長度8字節,理論計算用時295*90.5μs=26697.5μs。第二種情況:最大數據長度是64字節,需要32條64字節報文,1條48字節報文,2條8字節報文;理論計算用時,32*316.5μs+252.5μs+2*90.5μs=10561.5μs。表3為CANFD數據傳輸中速率提升。

表3 CANFD數據傳輸中速率提升
通過理論計算分析可以得出,在傳輸2048個字節時,CANFD協議如果僅僅是提升數據段的波特率到2Mb/s,字節長度不變的情況下,相較于傳統CAN速率會提升29.3%,這與前面分析的傳輸一幀報文的速率提升一致,當數據長度最大到64字節時,同樣是傳輸2048字節的數據,數據段波特率為2Mb/s,相較于傳統CAN,速率會提升72%。
CANFD最大可支持的長度是64字節,標準的UDS刷寫協議[6]是針對8字節的傳統CAN,所以如果要用CANFD協議刷寫,需要修改傳統的數據傳輸協議,同時兼容8字節,最大64字節的數據長度。
相較于傳統的ISO 15765-2協議,在CANFD協議刷寫的過程中,需要通過數據長度來決定單幀的字節長度究竟是使用哪個字節來表示,如表4所示,如果CANFD協議傳輸的數據長度大于8,則通過Byte1來表示有效字節長度,如果是等于8的數據長度,依然使用傳統的Byte0的Bit3-0表示有效字節長度[5]。

表4 ISO 15765-2升級
圖2是傳統CAN采用1Mb/s波特率刷寫一段完整的程序數據的報文記錄,用時209.199s-17.941s=191.258s。

圖2 傳統CAN-1Mb/s刷寫時間
同一段程序數據采用CANFD協議,仲裁段1Mb/s,數據段2Mb/s的波特率,最大是8字節的數據長度進行刷寫,用時229.188s-66.000s=163.188s,如圖3所示。
綜合實際測試結果,數據段不同波特率和不同最大數據長度的情況下,同一段程序數據的刷寫所用的時間和傳統CAN波特率是1Mb/s的刷寫時間及速率提升見表5。

圖3 CANFD-1Mb/s-2Mb/s-8字節

表5 不同波特率不同數據長度下刷寫情況

圖4 CANFD-1Mb/s-2Mb/s擦除等待

圖5 CAN-1Mb/s擦除等待
在實際刷寫應用中,CANFD在提升數據段波特率和數據長度的情況下,提升速率與理論計算傳輸2048個字節的傳輸提升速率有偏差,主要是因為,在傳統的刷寫流程[6]中有寫入等待,擦除等待,數據一致性校驗等待,在線監測等時間優化是微小的,如圖4和圖5,分別截取了CANFD和傳統CAN協議刷寫過程擦除同一塊Block時的擦除等待時間,可以通過時間戳看出,CANFD協議在刷寫過程中的擦除等待時間如圖4所示:72.380s-53.948s=18.432s,擦除同一塊區域,傳統CAN協議等待時間如圖5所示,57.840s-38.455s=19.385s。CANFD協議與傳統CAN協議在擦除同一塊區域的時間僅僅差了19.385s-18.432s=0.953s,這個差距主要是因為CANFD協議數據段提升了速率,發送報文的時間短的優勢。刷寫的過程中是按照單片機的Block塊進行擦除寫入的,在擦寫時會根據Block塊的大小有不同的等待時間,在這些不可優化的流程上,CANFD是沒有優勢的,所以CANFD的優勢在刷寫流程中主要體現在數據傳輸過程中。
本文介紹了CANFD協議相較于傳統CAN的升級,以及分析了CANFD協議在數據段不同波特率,不同數據長度情況下一幀報文的傳輸時間的不同,比較了CANFD協議傳輸一幀8字節的報文和傳統CAN傳輸一幀報文所用時間的差異和速率提升,CANFD在傳輸數據時波特率提升主要體現在數據段,仲裁段的波特率最大是1Mb/s。通過理論計算分析了傳輸同一塊2048個字節的數據,CANFD協議在不同數據段波特率和數據長度下的用時和相較于傳統CAN的速率提升。實際應用中,基于CANFD協議刷寫功能的開發,在傳統ISO 15765-2不滿足數據長度的地方做了升級。刷寫一段完整的程序數據,不同波特率和數據長度時分別做了時間戳的記錄,分析計算不同情況下的用時,并針對理論計算的速度提升率和實際應用中速度的提升率差異作了分析。通過研究分析,CANFD協議在實際刷寫過程中優勢主要體現在數據傳輸階段,在擦除和寫入過程中的等待時間無法優化。