憑借實(shí)時(shí)性、抗干擾性和安全性等優(yōu)點(diǎn),CAN2.0在工業(yè)及汽車(chē)行業(yè)得到了廣泛應用,但其最高速率僅為1Mbit/s,每幀最多只能傳輸8字節的有效數據,報文中只有約50%的帶寬用于有效數據傳輸。然而隨著(zhù)產(chǎn)業(yè)的發(fā)展,各種傳感器和控制器數量的增多,總線(xiàn)上的數據量也激增,這使得CAN2.0總線(xiàn)在傳輸速率和帶寬方面的缺點(diǎn)暴露的更加明顯,于是就誕生了CAN-FD。
CAN-FD在傳輸速率和帶寬方面有了明顯的提升,波特率可高達8Mbit/s,每幀可多達64字節有效數據,傳輸效率可提高至約80%,能夠進(jìn)一步提高總線(xiàn)的實(shí)時(shí)性,拓寬總線(xiàn)的數據帶寬,提升總線(xiàn)的傳輸效率。
在飛凌嵌入式OKMX8MP-C開(kāi)發(fā)板上有兩路CAN-FD,小編今天就基于這款開(kāi)發(fā)板以處理器的M核與A核各控制一路CAN-FD互相通信為例,從應用角度講述M核和A核如何控制CAN-FD高速通信。 ![]()
飛凌嵌入式OKMX8MP-C開(kāi)發(fā)板所搭載的NXP i.MX8M Plus處理器具備強悍的性能,集成4個(gè)主頻最高可達1.8GHz (工業(yè)級主頻為1.6GHz)的Arm Cortex-A53多任務(wù)核和1個(gè)Cortex-M7實(shí)時(shí)核,不管是對數據的高速吞吐、處理,還是復雜的人機交互界面處理,都能從容應對。
01 M核CAN-FD 1. CAN-FD初始化 CAN-FD初始化主要包括總線(xiàn)時(shí)鐘,管腳和相應寄存器的初始化。具體如下:
(1)CAN總線(xiàn)時(shí)鐘: 現將CAN總線(xiàn)倍頻到800MHz,再10分頻到80MHz。 CLOCK_SetRootMux(kCLOCK_RootFlexCan1, kCLOCK_FlexCanRootmuxSysPll1); // 設置CAN1總線(xiàn)時(shí)鐘為800MHz CLOCK_SetRootDivider(kCLOCK_RootFlexCan1, 2U, 5U); // 分頻因子為2*5=10,設置CAN1總線(xiàn)時(shí)鐘為80MHz
(2)管腳配置: 選擇CAN1的發(fā)送管腳為32腳,接收管腳為34腳。 IOMUXC_SetPinMux(IOMUXC_SAI2_TXC_CAN1_RX, 0U); // CAN1 RX IOMUXC_SetPinMux(IOMUXC_SAI2_RXC_CAN1_TX, 0U); // CAN1 TX
(3)CAN波特率: CAN-FD支持可變速率,即控制區和數據區的波特率可以不一致,控制區最大為1Mbit/s;數據區最大為8Mbit/s。后續程序根據總線(xiàn)時(shí)鐘和設置的波特率,分配時(shí)段設置的seg1,seg2等數值。 pConfig->bitRate = 1000000U; // CAN-FD控制區波特率為1Mbit/s pConfig->bitRateFD = 8000000U; // CAN-FD數據區波特率為8Mbit/s
(4)CAN-FD使能: 除了使能CAN-FD,可變波特率也需要使能,否則數據區的最大速率和控制區的速率一樣,最大為1Mbit/s。 base->MCR |= CAN_MCR_FDEN_MASK; // CAN-FD使能 fdctrl |= CAN_FDCTRL_FDRATE_MASK; // 可變波特率使能
(5)關(guān)閉自回環(huán): 如果開(kāi)啟了自回環(huán),那么CAN1數據會(huì )在芯片內回環(huán),不會(huì )到外部管腳,在程序調試時(shí)可以排除外部端子的干擾,但真實(shí)應用時(shí),需要關(guān)閉自回環(huán),從外部管腳收發(fā)數據。 pConfig->enableLoopBack = false; // 不回環(huán),使用外部管腳
(6)幀格式: 本次我們使用11位標準數據幀,小伙伴也在后續試試擴展幀。需要設置自己的ID,便于總線(xiàn)上其他設備識別。 mbConfig.format = kFLEXCAN_FrameFormatStandard; // 11位標準幀,非擴展幀 mbConfig.type = kFLEXCAN_FrameTypeData; // 數據幀 非遠程幀 mbConfig.id = FLEXCAN_ID_STD(rxIdentifier); // 幀ID 用于區別總線(xiàn)中不同的設備
(7)接收過(guò)濾: 用戶(hù)可設置接收過(guò)濾規則,這樣就可以只接收特定幀ID的數據,減少應用處理的數據量。 rxIdentifier = 0;FLEXCAN_SetRxMbGlobalMask(EXAMPLE_CAN, FLEXCAN_RX_MB_STD_MASK(rxIdentifier, 0, 0));//接收所有ID數據
2. CAN-FD收發(fā)流程 本次測試M核做主站,CAN1先發(fā)送一幀包含64字節數據,A核CAN2收到,將64字節數據再次發(fā)送,M核CAN1接收。對比發(fā)送和接收的64字節數據是否一致。重復100次。
(1)CAN-FD發(fā)送數據: EXAMPLE_CAN表示為CAN1,flexcanHandle為CAN實(shí)例,包含了發(fā)送接收回調函數,txXfer為要發(fā)送的64字節數據。 FLEXCAN_TransferFDSendNonBlocking(EXAMPLE_CAN, &flexcanHandle, &txXfer); // CAN-FD發(fā)送數據
(2)CAN-FD接收數據: EXAMPLE_CAN表示為CAN1,flexcanHandle為CAN實(shí)例,包含了發(fā)送接收回調函數,rxXfer為接收的64字節數據。 FLEXCAN_TransferFDReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer); // CAN-FD接收函數
(3)接收和發(fā)送數據對比: for (j = 0U; j <= DLC; j++) // 對比收發(fā)數據,不一致打印 { if(txXfer.framefd->dataWord[j] != rxXfer.framefd->dataWord[j]) { LOG_INFO("Data mismatch !!! j=%d \r\n",j); } }
02 A核CAN-FD A核設備樹(shù)中保留CAN2,內核解析設備樹(shù)在 /dev下生成can0。設置波特率后使能can0節點(diǎn),應用程序中open函數打開(kāi)接口,write函數發(fā)送數據,read函數接收數據。我們把CAN接口的示例已經(jīng)作為一個(gè)跨平臺的綜合演示程序,小伙伴們可以直接加參數調用即可。
1. 分配節點(diǎn) (1)M核獨享CAN1,A核獨享CAN2,修改設備樹(shù),在設備樹(shù)OK8MP-C.dts中,刪除CAN1設備節點(diǎn),保留CAN2設備節點(diǎn)。編譯新的設備樹(shù);
(2)將生成的OK8MP-C.dtb和Image拷貝至開(kāi)發(fā)板的 /run/media/mmcblk2p1/ 目錄下,輸入sync命令同步后重啟開(kāi)發(fā)板;
(3)通過(guò)A核串口輸入命令uname -r ,顯示內核版本,將 /lib/modbule目錄下文件夾名稱(chēng)改為內核版本,這樣才能自動(dòng)加載模塊生成can0節點(diǎn),重啟開(kāi)發(fā)板。 ![]()
![]()
2. 演示Demo 進(jìn)程名:can_demo
使用方法:./can_demo設備名 [參數選項]… … ![]()
本次測試接口為can0(對應開(kāi)發(fā)板CAN2),控制區波特率為1Mbit/s,數據區最大為8Mbit/s,11位標準幀,不過(guò)濾幀ID,不主動(dòng)發(fā)數據,不回環(huán)。因此命令為: ./can_demo can0-b 1000 -fd 8000。
03 程序驗證 1. 硬件連接 使用杜邦線(xiàn)將CAN1和CAN2的can-H短接,同時(shí)將can-L短接,注意不要接反。 ![]()
2. M核程序 修改uboot環(huán)境變量設置M核自啟動(dòng),同時(shí)將M核程序forlinx_m7_tcm_firmware.bin; 放到/run/media/mmcblk2p1/目錄下。詳細操作可看上篇文章《【玩轉多核異構】M核程序的啟動(dòng)、編寫(xiě)和仿真》。
3. A核程序 (1)使用串口Xmodem,網(wǎng)絡(luò )FTP,SCP,U盤(pán),TF卡等多種方式,將can_demo從電腦拷貝至核心板默認目錄下,輸入以下命令修改權限; chmod 777 can_demo
(2)輸入以下命令,A核應用程序can_demo將設置波特率后打開(kāi)can0節點(diǎn),等待M核發(fā)送的數據,再將接收的數據通過(guò)CAN2發(fā)送給M核。 ./can_demo can0 -b 1000 -fd 8000
4. 實(shí)際測試 (1)OKMX8MP-C開(kāi)發(fā)板重新上電后,M核程序啟動(dòng),完成CAN1初始化后,在M核調試串口輸出信息,等待按鍵;
(2)在A(yíng)核調試串口輸入以下命令,CAN2將處于接收的狀態(tài): ./can_demo can0 -b 1000 -fd 8000
(3)在M核串口按下鍵A或a,M核CAN1發(fā)送64字節數據,A核CAN2接收數據,并將接收的數據再次發(fā)送,M核CAN1接收后和發(fā)送數據對比,輸出結果。循環(huán)100次;
(4)通過(guò)測試可以看到,依托i.MX8M Plus強大的性能,雙核都以8Mbit/s的高速率發(fā)送大量數據,均沒(méi)有出現異常。 ![]()
|