CAN?總線在工業、汽車行業具有非常廣泛的應用,為網絡中設備之間點對點通信提供一種可靠、穩定、經濟的方案。伴隨網絡中設備節點的增加,由于?1Mbps?速率和最長數據?8?字節的限制,通信效率和總線占用問題變得愈發突出。而?CAN FD?正是為了應對這種挑戰而出現。文章接下來將介紹?CAN FD?的一些新特點以及使用注意事項,最后將使用?Toradex Apalis iMX8QM?和?Verdin iMX8M Mini?計算機模塊簡單演示?CAN FD?使用。
相比于傳統?CAN?協議,CAN FD?最大的兩個特點是采用可變速率和單幀最長?64?字節數據,另外包括控制位和?CRC?校驗的變化。
圖?1:傳統?CAN?和?CAN FD?幀
控制位的首位由傳統?CAN?的?RTR?變為?CAN FD?的?RRS,該位始終是顯性(0)。第三個控制位在傳統?CAN?中屬于保留功能,在?CAN FD?位?FDF,位隱性(1)。FDF?位?1?時表示該幀是?CAN FD?格式。在?CAN FD?中緊隨?FDF?還是一個保留功能,用于將來的擴展。BRS(Bit Rate Switch)位允許?CAN FD?幀以不同的速率進行傳輸。如果?BRS?為顯性(0)則該幀采用和仲裁階段(Arbitration Phase)同樣的速率進行傳輸,既速率不發生變化。當?BRS?為隱性(1),該幀接下來的部分將以較高的速率傳輸。這里需要注意,并不是整個?CAN FD?幀都用高速率傳輸,如下圖,Data Phase?從?BRS?后的?ESI?位開始到?CRC Delimiter?位結束,該階段的數據會以較高的速率傳輸。
圖?2:?CAN FD?幀結構
ESI(Error Status Indicator)通常為顯性(0)。當發送方遇到通訊異常后會將其置為隱性(1)。DLC?表示該幀中實際數據長度,為了于傳統?CAN?兼容,DLC?仍然采用?4bit。當數據長度小于?8?字節時,DLC?位的數值可以直接表示數據長度,但超過?8?字節時,由于?4?個位最高只能表示?15,為了支持?CAN FD?最長?64?字節數據,這里采用了折中的表示方法。當數據不超過?8?個字節時,DLC?仍直接表示數據長度。當超過?8?個字節,只支持?12?到?64?中部分長度的數據包,而非全部的?9?到?64?任一長度。如下表所示,當?DLC?為?9?時,CAN FD?數據長度為?12?字節,DLC?為?12?時,數據長度是?24?字節。
?
DLC?和數據長度對應關系 | ||||||||||||||||
DLC | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
數據長度 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 16 | 20 | 24 | 32 | 48 | 64 |
?
在實際應用中最好選擇上面的其中一種長度,避免通訊效率降低。如果小于某一種長度,則需要對數據進行填充,可以用?0xCC?和?0x55?作為填充字節,這樣能夠在總線上產生足夠的波形翻轉從而使?CAN?節點保持同步。
在?CAN FD?中根據數據長度會采用不同的?CRC?校驗方案,當小于等于?16?字節是為?CRC-17,當數據大于?16?字節后則采用?CRC-21。CRC Delimiter?之后的格式?CAN FD?和傳統?CAN?仍保持一致。
CAN FD?雖然具有更長的數據包以及更快的傳輸速度,但是由于引入了更多的位到幀中,幀的開銷也會增加。以同樣發送?1字節數據包為例,傳統?CAN 2.0?標準幀和?CAN FD?標準幀具體組成如上方圖?1?所示。傳統?CAN 2.0?標準幀總共位?54 bit,CAN FD?為?70 bit。CAN FD?需要多消耗?16 bit?來傳送同樣的數據。如果?CAN FD?不采用更高的可變速率這就意味著同樣的幀,CAN FD?反而會要更長的傳輸時間。當?CAN FD?采用可變速率,那么情況將會變得不一樣。假設?CAN FD?的仲裁速率是?500 Kbps,和傳統?CAN?的速率一致,而可變的數據傳輸速率提高?8?倍到?4 Mbps。傳統?CAN?耗時為?54 bit/ 500 Kbps = 108 us。CAN FD?中?4 Mbps?的速率只用于傳輸從?ESI?位開始到?CRC Delimiter?位之間的數據,所以?CAN FD?耗時為?29 bit/500 Kbps + 41 bit/4 Mbps = 68 us。這里我們看到,在提高數據傳輸速率情況下,?CAN FD?即使有更多的幀開銷,幀傳輸時間還是減少了?40 us。更高的傳輸速度有利于發送節點更快得完成幀發送,減少?CAN?總線占用時間,這對越長數據的幀會更加明顯,對?CAN?網絡的實時性來講是一個優勢。
然而提高傳輸速率不僅僅是在使用的時候設置一個參數,更重要的是保障?CAN?總線物理鏈路層的質量。可以使用示波器觀察總線上信號的質量。如果信號陡峭且清晰,可以嘗試將數據傳輸速率提高到仲裁速率的?2?到?4?倍。測量點需要遍布總線上多個位置,信號在不同位置會有所差異。線路阻抗的一致性對信號質量至關重要。通常在總線交叉點的線纜沒有發生物理尺寸變化,并采用具有相同介電常數的隔離器,阻抗會保持不變。這可以參考以太網和?USB?中使用的專門的連接器。當?CAN FD?采用較高的傳輸速率時,每處線路分叉,每個連接器都可能會影響阻抗,從而引起信號反射。這些反射信號的能量最終可以影響?CAN?幀每個比特位邊緣的抖動。
CAN FD?最長?64?字節的數據包使用在實際應用中也需要注意。更長的幀不可避免在傳輸的時候會占用總線更多的時間,而這期間其他?CAN?節點則無法發送數據。對于實時性需求不高的場合,如通過?CAN?總線升級固件,長幀能夠以更小的開銷完成傳輸。而對實時性有要求的場合,對長幀的使用需要有一定的限制。對于?8?字節以下的幀,?CAN FD?更高的數據傳輸速率可以有效降低總線占用時間,前提是物理鏈路層能夠滿足高速傳輸的要求。
對于應用開發?CAN FD?的使用是非常簡單的。CAN FD?是可以兼容傳統?CAN,這意味著原先基于傳統?CAN?通信的代碼可以直接運行在支持?CAN FD的設備上,但不使用任何?CAN FD?的新功能。如果需要使用?CAN FD?的可變數據速率或者超過?8?字節數據的幀,那么代碼也只需做簡單的修改。我們以?Linux?中?SocketCAN?為例,使用?can-utils?代碼進行說明。在?cansend.c?和?candump.c?中采用?canfd_frame?結構體來存放需要發送和接收的?CAN?數據。CANFD_MAX_DLEN?為?64,對應?CAN FD?最長的?64?字節。
然后將?can socket?設置?CAN FD?格式,使用?setsockopt()?函數,設置?CAN_RAW_FD_FRAMES?參數即可。
在發送時將?struct canfd_frame frame?結構體中?len?長度參數設置?CAN FD?定義幾種長度。
剩余代碼中的操作可以沿用傳統?CAN?模式下的方法。最后用下面命令配置?CAN?設備。這里仲裁速率為?500Kbps,CAN FD?可變數據速率為1Mbps,在結尾添加?fd on?參數啟用?CAN FD。
接下來我們將在?Apalis iMX8QM?和?Verdin iMX8M Mini?計算機模塊上演示?CAN FD?通信。Apalis iMX8QM ?采用?NXP i.MX8 QuadMax?處理器,可以提供?3?路?CAN?接口。Verdin iMX8M Mini?上的?i.MX8 M Mini?處理器本身并不支持?CAN?接口,我們在模塊上添加了一塊?MCP2518?實現?CAN?接口。
Apalis iMX8QM?和?Verdin iMX8M Mini?分別通過?Ixora?和?Dahlia?載板進行?CAN?接口互聯。這兩個底板上均引出了?CAN?接口,方便用戶測試。
Verdin iMX8M Mini?作為發送端,依次運行下面命令,并發送?4?字節和?10?字節長度的幀。
Apalis iMX8QM?作為接收端。
上面測試可以看到?Verdin iMX8M Mini?發送一幀?10?字節長度的數據,但是?Apalis iMX8QM??在收到了?12?字節的數據。這是?CAN FD?定義沒有?10?字節的幀長,適合發送?10?字節的是?12?字節長度的幀。所以看到實際收到的是“11 22 33 44 55 66 77 88 99 00 00 00”這12?個字節,最后兩個“00 00?”是填充的數據。這部分填充數據來自?lib.c?代碼? memset(cf, 0, sizeof(*cf)); /* init CAN FD frame, e.g. LEN = 0 */
總結
CAN FD?的新功能為滿足了應用對更加高效的傳輸、更好實時性需求,但充分發揮這些功能還需要從應用開發到鏈路設計方面的優化。上面我們討論簡單地討論一些注意事項,以及使用方法,具體的應用還要結合實際工況做調整。
審核編輯:黃飛
評論