IMX6ULL開(kāi)發(fā)板的CAN通信

查看板子上的CAN設(shè)備是否使能:

如果查詢到上圖所示,說(shuō)明CAN設(shè)備(也可稱為CAN“網(wǎng)卡”)是可以工作的,否則需要做好底層設(shè)備樹(shù)及驅(qū)動(dòng)配置。將板子上CAN接口(該板子只有1路CAN)的CAN_H和CAN_L分別接到USBCAN盒的其中一路CAN輸入的CAN_H和CAN_L上,嘗試從開(kāi)發(fā)板發(fā)送數(shù)據(jù)到USBCAN上位機(jī)以及從上位機(jī)通過(guò)USBCAN發(fā)送數(shù)據(jù)到開(kāi)發(fā)板。Linux系統(tǒng)將CAN當(dāng)作網(wǎng)絡(luò)設(shè)備進(jìn)行統(tǒng)一管理,所以CAN應(yīng)用程序仍然采用經(jīng)典的socket通信那一套。開(kāi)發(fā)板發(fā)送數(shù)據(jù)的應(yīng)用代碼如下。需要注意的是,對(duì)于CAN協(xié)議族,socket應(yīng)該使用原始套接字SOCK_RAW。因?yàn)閮H有發(fā)送,所以通過(guò)setsockopt設(shè)置了過(guò)濾規(guī)則為不接收任何報(bào)文。發(fā)送的內(nèi)容是每幀8個(gè)字節(jié)的數(shù)據(jù):0xAB 0xBC 0xCD 0xDE 0xEF 0xFA 0xAB 0xBC,ID為0x123,發(fā)送周期為1s。
編譯后在開(kāi)發(fā)板上運(yùn)行,可以看到USBCAN的上位機(jī)接收結(jié)果如圖,可見(jiàn)USBCAN上位機(jī)成功接收到了來(lái)自開(kāi)發(fā)板的CAN報(bào)文。

開(kāi)發(fā)板上CAN接收數(shù)據(jù)的應(yīng)用代碼如下。需要注意的是,由于是接收數(shù)據(jù),這里設(shè)置了三組報(bào)文ID過(guò)濾,分別是0x123、0x234和0x345,掩碼設(shè)置的都是0x7FF,也就是說(shuō)設(shè)置開(kāi)發(fā)板的CAN僅接收ID為0x123或0x234或0x345的報(bào)文,其它ID不會(huì)被接收。接收到數(shù)據(jù)后根據(jù)報(bào)文ID中的一些特殊位,可以進(jìn)行錯(cuò)誤幀、擴(kuò)展幀、遠(yuǎn)程幀等類型的判斷。
編譯后在開(kāi)發(fā)板上運(yùn)行。嘗試在USBCAN上位機(jī)發(fā)送若干種ID及類型的報(bào)文:

開(kāi)發(fā)板側(cè)的接收情況如下。很明顯可見(jiàn),只有上面提到的那三種ID的報(bào)文才被接收了,并正確獲取了幀類型。
