Linux CAN 驱动实验
目錄
- CAN 協(xié)議簡析
- 何為CAN
- CAN 電氣屬性
- 顯隱性電平
- 接線
- 端接電阻
- 速度距離
- CAN 協(xié)議
- 1、數(shù)據(jù)幀
- 2、遙控幀
- 3、錯誤幀
- 4、過載幀
- 5、幀間隔
- CAN 速率
- I.MX6ULL FlexCAN 簡介
- 硬件原理圖分析
- 實驗程序編寫
- 修改設備樹
- 使能Linux 內核自帶的FlexCAN 驅動
- FlexCAN 測試
- 檢查CAN 網卡設備是否存在
- 移植iproute2
- 移植can-utils 工具
- CAN 通信測試
CAN 是目前應用非常廣泛的現(xiàn)場總線之一,主要應用于汽車電子和工業(yè)領域,尤其是汽車領域,汽車上大量的傳感器與模塊都是通過CAN 總線連接起來的。CAN 總線目前是自動化領域發(fā)展的熱點技術之一,由于其高可靠性,CAN 總線目前廣泛的應用于工業(yè)自動化、船舶、汽車、醫(yī)療和工業(yè)設備等方面。I.MX6ULL 自帶了CAN 外設,因此可以開發(fā)CAN 相關的設備,本章我們就來學習一下如何驅動I.MX6U-ALPHA 開發(fā)板上的CAN 接口。
CAN 協(xié)議簡析
有關CAN 協(xié)議詳細內容請參考開發(fā)板資料里面由瑞薩電子編寫的《CAN 入門教程》,路徑為:4、參考資料->CAN 入門教程.pdf,本小節(jié)參考自此教程。
何為CAN
CAN 的全稱為Controller Area Network,也就是控制局域網絡,簡稱為CAN。CAN 最早是由德國BOSCH(博世)開發(fā)的,目前已經是國際標準(ISO 11898),是當前應用最廣泛的現(xiàn)場總線之一。BOSCH 主要是做汽車電子的,因此CAN 一開始主要是為汽車電子準備的,事實也是如此,CAN 協(xié)議目前已經是汽車網絡的標準協(xié)議。當然了,CAN 不僅僅應用于汽車電子,經過幾十年的發(fā)展,CAN 協(xié)議的高性能和高可靠性已經得到了業(yè)界的認可,目前除了汽車電子以外也廣泛應用于工業(yè)自動化、醫(yī)療、工業(yè)和船舶等領域。
以汽車電子為例,汽車上有空調、車門、發(fā)動機、大量傳感器等,這些部件都是通過CAN總線連在一起形成一個網絡,車載網絡結構如圖66.1.1.1 所示:
圖66.1.1.1 中各個單元通過CAN 總線連接在一起,每個單元都是獨立的CAN 節(jié)點。同一個CAN 網絡中所有單元的通信速度必須一致,不同的網絡之間通信速度可以不同。比如圖66.1.1.1 中125Kbps 的CAN 網絡下所有的節(jié)點速度都是125Kbps 的,整個網絡由一個網關與其他的網絡連接。
CAN 的特點主要有一下幾點:
-
①、多主控制
在總線空閑時,所有單元都可以發(fā)送消息(多主控制),而兩個以上的單元同時開始發(fā)送消息時,根據(jù)標識符(Identifier 以下稱為ID)決定優(yōu)先級。ID 并不是表示發(fā)送的目的地址,而是表示訪問總線的消息的優(yōu)先級。兩個以上的單元同時開始發(fā)送消息時,對各消息ID的每個位進行逐個仲裁比較。仲裁獲勝(被判定為優(yōu)先級最高)的單元可繼續(xù)發(fā)送消息,仲裁失利的單元則立刻停止發(fā)送而進行接收工作。 -
②、系統(tǒng)的柔軟性
與總線相連的單元沒有類似于“地址”的信息。因此在總線上增加單元時,連接在總線上的其它單元的軟硬件及應用層都不需要改變。 -
③、通信速度快,距離遠
最高1Mbps(距離小于40M),最遠可達10KM(速率低于5Kbps)。 -
④、具有錯誤檢測、錯誤通知和錯誤恢復功能
所有單元都可以檢測錯誤(錯誤檢測功能),檢測出錯誤的單元會立即同時通知其他所有單元(錯誤通知功能),正在發(fā)送消息的單元一旦檢測出錯誤,會強制結束當前的發(fā)送。強制結束發(fā)送的單元會不斷反復地重新發(fā)送此消息直到成功發(fā)送為止(錯誤恢復功能)。 -
⑤、故障封閉功能
CAN 可以判斷出錯誤的類型是總線上暫時的數(shù)據(jù)錯誤(如外部噪聲等)還是持續(xù)的數(shù)據(jù)錯誤(如單元內部故障、驅動器故障、斷線等)。由此功能,當總線上發(fā)生持續(xù)數(shù)據(jù)錯誤時,可將引起故障的單元從總線上隔離出去。 -
⑥、連接節(jié)點多
CAN 總線是可同時連接多個單元的總線。可連接的單元總數(shù)理論上是沒有限制的。但實際上可連接的單元數(shù)受總線上的時間延遲及電氣負載的限制。降低通信速度,可連接的單元數(shù)增加;提高通信速度,則可連接的單元數(shù)減少。
CAN 電氣屬性
顯隱性電平
CAN 總線使用兩根線來連接各個單元:CAN_H 和CAN_L,CAN 控制器通過判斷這兩根線上的電位差來得到總線電平,CAN 總線電平分為顯性電平和隱性電平兩種。
- 顯性電平表示邏輯“0”,此時CAN_H 電平比CAN_L 高,分別為3.5V 和1.5V,電位差為2V。
- 隱形電平表示邏輯“1”,此時CAN_H 和CAN_L 電壓都為2.5V 左右,電位差為0V。
CAN 總線就通過顯性和隱形電平的變化來將具體的數(shù)據(jù)發(fā)送出去,如圖66.1.2.1 所示:
接線
CAN 總線上沒有節(jié)點傳輸數(shù)據(jù)的時候一直處于隱性狀態(tài),也就是說總線空閑狀態(tài)的時候一直處于隱性。CAN 網絡中的所有單元都通過CAN_H 和CAN_L 這兩根線連接在一起,如圖66.1.2.2 所示:
端接電阻
途中所有的CAN 節(jié)點單元都采用CAN_H 和CAN_L 這兩根線連接在一起,CAN_H 接CAN_H、CAN_L 接CAN_L,CAN 總線兩端要各接一個120Ω的端接電阻,用于匹配總線阻抗,吸收信號反射及回撥,提高數(shù)據(jù)通信的抗干擾能力以及可靠性。
速度距離
CAN 總線傳輸速度可達1Mbps/S,最新的CAN-FD 最高速度可達5Mbps/S,甚至更高,CAN-FD 不在本章討論范圍,感興趣的可以自行查閱相關資料。CAN 傳輸速度和總線距離有關,總線距離越短,傳輸速度越快。
CAN 協(xié)議
通過CAN 總線傳輸數(shù)據(jù)是需要按照一定協(xié)議進行的,CAN 協(xié)議提供了5 種幀格式來傳輸數(shù)據(jù):數(shù)據(jù)幀、遙控幀、錯誤幀、過載幀和幀間隔。其中數(shù)據(jù)幀和遙控幀有標準格式和擴展格式兩種,標準格式有11 位標識符(ID),擴展格式有29 個標識符(ID)。這5 中幀的用途見表66.1.3.1:
| 數(shù)據(jù)幀 | 用于CAN節(jié)點單元之間進行數(shù)據(jù)傳輸?shù)膸?/td> |
| 遙控幀 | 用于接收單元向具有相同ID 的發(fā)送單元請求數(shù)據(jù)的幀 |
| 錯誤幀 | 用于當檢測出錯誤時向其它單元通知錯誤的幀 |
| 過載幀 | 用于接收單元通知其尚未做好接收準備的幀 |
| 間隔幀 | 用于將數(shù)據(jù)幀及遙控幀與前面的幀分離開來的幀 |
1、數(shù)據(jù)幀
數(shù)據(jù)幀由7 段組成:
①、幀起始,表示數(shù)據(jù)幀開始的段。
②、仲裁段,表示該幀優(yōu)先級的段。
③、控制段,表示數(shù)據(jù)的字節(jié)數(shù)及保留位的段。
④、數(shù)據(jù)段,數(shù)據(jù)的內容,一幀可發(fā)送0~8 個字節(jié)的數(shù)據(jù)。
⑤、CRC 段,檢查幀的傳輸錯誤的段。
⑥、ACK 段,表示確認正常接收的段。
⑦、幀結束,表示數(shù)據(jù)幀結束的段。
數(shù)據(jù)幀結構如圖66.1.3.1 所示:
圖66.1.3.1 給出了數(shù)據(jù)幀標準格式和擴展格式兩種幀結構,圖中D 表示顯性電平0、R 表示隱性電平1,D/R 表示顯性或隱性,也就是0 或1,我們來簡單分析一下數(shù)據(jù)幀的這7 個段。
①、幀起始
幀起始很簡單,標準格式和擴展格式都是由一個位的顯性電平0 來表示幀起始。
②、仲裁段
仲裁段表示幀優(yōu)先級,仲裁段結構如圖66.1.3.2 所示:
標準格式和擴展格式的仲裁段不同,從圖66.1.3.2 可以看出,標準格式的ID 為11 位,發(fā)送順序是從ID10 到ID0,最高7 位ID10~ID4 不能全為隱性(1),也就是禁止0X1111111XXXXX這樣的ID。擴展格式的ID 為29 位,基本ID 從ID28 到ID18,擴展ID 由ID17 到ID0,基本ID 與標準格式一樣,禁止最高7 位都為隱性。
③、控制段
控制段由6 個位構成,表示數(shù)據(jù)段的字節(jié)數(shù),標準格式和擴展格式的控制段略有不同,如圖66.1.3.3 所示:
圖66.1.3.3 中r1 和r0 為保留位,保留位必須以顯性電平發(fā)送。DLC 為數(shù)據(jù)長度,高位在前,DLC 段有效值范圍為0~8。
④、數(shù)據(jù)段
數(shù)據(jù)段也就是幀的有效數(shù)據(jù),標準格式和擴展格式相同,可以包含0~8 個字節(jié)的數(shù)據(jù),從最高位(MSB)開始發(fā)送,結構如圖66.1.3.4 所示:
注意,圖66.1.3.4 中數(shù)據(jù)段的0~64 為bit,對應到字節(jié)就是0~8 字節(jié)。
⑤、CRC 段
CRC 段保存CRC 校準值,用于檢查幀傳輸錯誤,標準格式和擴展格式相同,CRC 段結構如圖66.1.3.5 所示:
從圖66.1.3.5 可以看出,CRC 段由15 位的CRC 值與1 位的CRC 界定符組成。CRC 值的計算范圍包括:幀起始、仲裁段、控制段、數(shù)據(jù)段,接收方以同樣的算法進行計算,然后用計算得到的CRC 值與此CRC 段進行比較,如果不一致的話就會報錯。
⑥、ACK 段
ACK 段用來確認接收是否正常,標準格式和擴展格式相同,ACK 段結構如圖66.1.3.6 所示:
從圖66.1.3.7 可以看出,ACK 段由ACK 槽(ACK Slot)和ACK 界定符兩部分組成。發(fā)送單元的ACK,發(fā)送2 個隱性位,而接收到正確消息的單元在ACK 槽(ACK Slot)發(fā)送顯性位,通知發(fā)送單元正常接收結束,這個過程叫發(fā)送ACK/返回ACK。發(fā)送ACK 的是所有接收單元中接收到正常消息的單元,所謂正常消息是指不含填充錯誤、格式錯誤、CRC 錯誤的消息,這些接收單元既不處于總線關閉態(tài)也不處于休眠態(tài)的所有接收單元中。
⑦、幀結束
最后就是幀結束段,標準格式和擴展格式相同,幀結束段結構如圖66.1.3.7 所示:
從圖66.1.3.7 可以看出,幀結束段很簡單,由7 位隱性位構成。
2、遙控幀
接收單元向發(fā)送單元請求數(shù)據(jù)的時候就用遙控幀,遙控幀由6 個段組成:
①、幀起始,表示數(shù)據(jù)幀開始的段。
②、仲裁段,表示該幀優(yōu)先級的段。
③、控制段,表示數(shù)據(jù)的字節(jié)數(shù)及保留位的段。
④、CRC 段,檢查幀的傳輸錯誤的段。
⑤、ACK 段,表示確認正常接收的段。
⑥、幀結束,表示數(shù)據(jù)幀結束的段。
遙控幀結構如圖66.1.3.8 所示:
從圖66.1.3.8 可以看出,遙控幀結構基本和數(shù)據(jù)幀一樣,最主要的區(qū)別就是遙控幀沒有數(shù)據(jù)段。遙控幀的RTR 位為隱性的,數(shù)據(jù)幀的RTR 位為顯性,因此可以通過RTR 位來區(qū)分遙控幀和沒有數(shù)據(jù)的數(shù)據(jù)幀。遙控幀沒有數(shù)據(jù),因此DLC 表示的是所請求的數(shù)據(jù)幀數(shù)據(jù)長度,遙控幀的其他段參考數(shù)據(jù)幀的描述即可。
3、錯誤幀
當接收或發(fā)送消息出錯的時候使用錯誤幀來通知,錯誤幀由錯誤標志和錯誤界定符兩部分組成,錯誤幀結構如圖66.1.3.9 所示:
錯誤標志有主動錯誤標志和被動錯誤標志兩種,主動錯誤標志是6 個顯性位,被動錯誤標志是6 個隱性位,錯誤界定符由8 個隱性位組成。
4、過載幀
接收單元尚未完成接收準備的話就會發(fā)送過載幀,過載幀由過載標志和過載界定符構成,過載幀結構如圖66.1.3.10 所示:
過載標志由6 個顯性位組成,與主動錯誤標志相同,過載界定符由8 個隱性位組成,與錯誤幀中的錯誤界定符構成相同。
5、幀間隔
幀間隔用于分隔數(shù)據(jù)幀和遙控幀,數(shù)據(jù)幀和遙控幀可以通過插入幀間隔來將本幀與前面的任何幀隔開,過載幀和錯誤幀前不能插入幀間隔,幀間隔結構如圖66.1.3.11 所示:
圖66.1.3.11 中間隔由3 個隱性位構成,總線空閑為隱性電平,長度沒有限制,本狀態(tài)下表示總線空閑,發(fā)送單元可以訪問總線。延遲發(fā)送由8 個隱性位構成,處于被動錯誤狀態(tài)的單元發(fā)送一個消息后的幀間隔中才會有延遲發(fā)送。
CAN 速率
CAN 總線以幀的形式發(fā)送數(shù)據(jù),但是最終到總線上的就是“0”和“1”這樣的二進制數(shù)據(jù),這里就涉及到了通信速率,也就是每秒鐘發(fā)送多少位數(shù)據(jù),前面說了CAN2.0 最高速度為1Mbps/S。對于CAN 總線,一個位分為4 段:
①、同步段(SS)
②、傳播時間段(PTS)
③、相位緩沖段1(PBS1)
④、相位緩沖段2(PBS2)
這些段由Tq(Time Quantum)組成,Tq 是CAN 總線的最小時間單位。幀由位構成,一個位由4 個段構成,每個段又由若干個Tq 組成,這個就是位時序。1 位由多少個Tq 構成、每個段又由多少個Tq 構成等,可以任意設定位時序。通過設定位時序,多個單元可同時采樣,也可任意設定采樣點。各段的作用和Tq 數(shù)如圖66.1.4.1 所示:
1 個位的構成如圖66.1.4.2 所示:
圖66.1.4.2 中的采樣點是指讀取總線電平,并將讀到的電平作為位值的點。位置在PBS1結束處。根據(jù)這個位時序,我們就可以計算CAN 通信的波特率了。具體計算方法,我們等下再介紹,前面提到的CAN 協(xié)議具有仲裁功能,下面我們來看看是如何實現(xiàn)的。
在總線空閑態(tài),最先開始發(fā)送消息的單元獲得發(fā)送權。
當多個單元同時開始發(fā)送時,各發(fā)送單元從仲裁段的第一位開始進行仲裁。連續(xù)輸出顯性電平最多的單元可繼續(xù)發(fā)送。實現(xiàn)過程,如圖66.1.4.3 所示:
圖66.1.4.3 中,單元1 和單元2 同時開始向總線發(fā)送數(shù)據(jù),開始部分他們的數(shù)據(jù)格式是一樣的,故無法區(qū)分優(yōu)先級,直到T 時刻,單元1 輸出隱性電平,而單元2 輸出顯性電平,此時單元1 仲裁失利,立刻轉入接收狀態(tài)工作,不再與單元2 競爭,而單元2 則順利獲得總線使用權,繼續(xù)發(fā)送自己的數(shù)據(jù)。這就實現(xiàn)了仲裁,讓連續(xù)發(fā)送顯性電平多的單元獲得總線使用權。
關于CAN 協(xié)議就講到這里,關于CAN 協(xié)議更詳細的內容請參考《CAN 入門教程》。
I.MX6ULL FlexCAN 簡介
I.MX6ULL 帶有CAN 控制器外設,叫做FlexCAN,FlexCAN 符合CAN2.0B 協(xié)議。FlexCAN完全符合CAN 協(xié)議,支持標準格式和擴展格式,支持64 個消息緩沖。I.MX6ULL 自帶的FlexCAN模塊特性如下:
①、支持CAN2.0B 協(xié)議,數(shù)據(jù)幀和遙控幀支持標準和擴展兩種格式,數(shù)據(jù)長度支持0~8 字節(jié),可編程速度,最高1Mbit/S。
②、靈活的消息郵箱,最高支持8 個字節(jié)。
③、每個消息郵箱可以配置為接收或發(fā)送,都支持標準和擴展這兩種格式的消息。
④、每個消息郵箱都有獨立的接收掩碼寄存器。
⑤、強大的接收FIFO ID 過濾。
⑥、未使用的空間可以用作通用RAM。
⑦、可編程的回測模式,用于進行自測。
⑧、可編程的優(yōu)先級組合。
……
FlexCAN 支持四種模式:正常模式(Normal)、凍結模式(Freeze)、僅監(jiān)聽模式(Listen-Only)和回環(huán)模式(Loop-Back),另外還有兩種低功耗模式:禁止模式(Disable)和停止模式(Stop)。
①、正常模式(Normal)
在正常模式下,FlexCAN 正常接收或發(fā)送消息幀,所有的CAN 協(xié)議功能都使能。
②、凍結模式(Freeze)
當MCR 寄存器的FRZ 位置1 的時候使能此模式,在此模式下無法進行幀的發(fā)送或接收,CAN 總線同步丟失。
③、僅監(jiān)聽模式(Listen-Onley)
當CTRL 寄存器的LOM 位置1 的時候使能此模式,在此模式下幀發(fā)送被禁止,所有錯誤計數(shù)器被凍結,CAN 控制器工作在被動錯誤模式,此時只會接收其他CAN 單元發(fā)出的ACK 消息。
④、回環(huán)模式(Loop-Back)
當CTRL 寄存器的LPB 位置1 的時候進入此模式,此模式下FlexCAN 工作在內部回環(huán)模式,一般用來進行自測。從模式下發(fā)送出來的數(shù)據(jù)流直接反饋給內部接收單元。
前面在講解CAN 協(xié)議的時候說過CAN 位時序,FlexCAN 支持CAN 協(xié)議的這些位時序,控制寄存器CTRL 用于設置這些位時序,CTRL 寄存器中的PRESDIV、PROPSEG、PSEG1、PSEG2 和RJW 這5 個位域用于設置CAN 位時序。
PRESDIV 為CAN 分頻值,也即是設置CAN 協(xié)議中的Tq 值,公式如下:
fCANCLK為FlexCAN 模塊時鐘,這個根據(jù)時鐘章節(jié)設置即可,設置好以后就是一個定值,因此只需要修改PRESDIV 即可修改FlexCAN 的Tq 頻率值。
Tq 定了以后我們結合圖66.1.4.1 中的各個段來看一下如何設置FlexCAN 的速率:
SS:同步段(Synchronization Segment),在I.MX6ULL 參考手冊中叫做SYNC_SEG,此段固定為1 個Tq 長度,因此不需要我們去設置。
PTS:傳播時間段(Propagatin Segment),FlexCAN 的CTRL 寄存器中的PROPSEG 位域設置此段,可以設置為0~ 7,對應1~8 個Tq。
PBS1:相位緩沖段1(Phase Buffer Segment 1),FlexCAN 的CRTL 寄存器中的PSEG1 位域設置此段,可以設置為0~ 7,對應1~8 個Tq。
PBS2:相位緩沖段2(Phase Buffer Segment 2),FlexCAN 的CRTL 寄存器中的PSEG2 位域設置此段,可以設置為1~ 7,對應2~8 個Tq。
SJW:再同步補償寬度(reSynchronization Jump Width),FlexCAN 的CRTL 寄存器中的RJW位域設置此段,可以設置0~ 3,對應1~4 個Tq。
FlexCAN 的CAN 位時序如圖66.1.5.1 所示:
根據(jù)圖66.1.5.1 所示,SYNC+SEG+(PROP_SEG+PSEG1+2)+(PSEG2+1)就是總的Tq,因此FlexCAN 的波特率就是:
關于I.MX6ULL 的FlexCAN 控制器就講解到這里,如果想更加詳細的了解FlexCAN,請參考《I.MX6ULL 參考手冊》的“Chapter 26 Flexible Controller Area Network(FLEXCAN)”章節(jié)。
硬件原理圖分析
正點原子I.MX6U-ALPHA 開發(fā)板CAN 接口原理圖如圖66.2.1 所示:
圖66.2.1 中TJA1050 是CAN 收發(fā)器,通過TJA1050向外界提供CAN_H 和CAN_L 總線,R10 是一個120 歐的端接匹配電阻;
CAN1_TX 和CAN1_RX 是I.MX6ULL FlexCAN1 的發(fā)送和接收引腳,對應I.MX6ULL 的UART3_CTS 和UART3_RTS 這兩個引腳。。
實驗程序編寫
修改設備樹
NXP 原廠提供的設備樹已經配置好了FlexCAN 的節(jié)點信息(FlexCAN1 和FlexCAN2),但是我們還是要來看一下如何配置I.MX6ULL 的CAN1 節(jié)點。首先看一下I.MX6ULL 的FlexCAN設備樹綁定文檔,打開Documentation/devicetree/bindings/net/can/ fsl-flexcan.txt,此文檔描述了FlexCAN 節(jié)點下的相關屬性信息,這里就不做介紹了,大家自行查閱。
1、FlexCAN1 引腳節(jié)點信息
首先肯定是CAN1 引腳配置信息,打開imx6ull-alientek-emmc.dts,找到如下所示內容:
第3 和第4 行將UART3_RTS 和UART3_CTS 這兩個引腳分別復用為FlexCAN1 的RX 和TX,電氣屬性都設置為0x1b020。
2、FlexCAN1 控制器節(jié)點信息
打開imx6ull.dtsi 文件,找到名為“flexcan1”的節(jié)點,內容如下:
注意示例代碼66.3.1.2 中的flexcan1 節(jié)點不需要我們修改,這里只是告訴大家FlexCAN1
完整節(jié)點信息。根據(jù)第2 行的compatible 屬性就可以找到I.MX6ULL 的FlexCAN 驅動源文件,
驅動文名為drivers/net/can/flexcan.c。第9 行的status 屬性為disabled,所以FlexCAN1 默認關閉
的。在imx6ull-alientek-emmc.dts 中添加使能FlexCAN1 的相關操作,找到如下所示代碼:
第3 行指定FlexCAN1 所使用的pinctrl 節(jié)點為pinctrl_flecan1,也就是示例代碼66.3.1.1 中的pinctrl 節(jié)點。
第4 行xceiver-supply 屬性指定CAN 收發(fā)器的電壓為3.3V。
第5 行將flexcan1 節(jié)點的status 屬性改為“okay”,也就是使能FlexCAN1。
3、關閉FlexCAN2 相關節(jié)點
I.MX6ULL 帶有兩個CAN 控制器:FlexCAN1 和FlexCAN2,NXP 官方的EVK 開發(fā)板這兩個CAN 接口都用到了,因此NXP 官方的設備樹將這兩個CAN 接口都使能了。但是,正點原子的I.MX6U-ALPHA 開發(fā)板將FlexCAN2 的IO 分配給了ECSPI3,所以正點原子的I.MX6U-ALPHA 開發(fā)板就不能使用CAN2,否則的話ECSPI3 外設就無法使用。關閉FlexCAN2 節(jié)點很簡單,在imx6ull-alientek-emmc.dts 文件中找到名為“flexcan2”的節(jié)點,然后將其屏蔽掉即可。
重新編譯設備樹,我們還需要配置Linux 內核,使能內核里面的FlexCAN 驅動。
使能Linux 內核自帶的FlexCAN 驅動
NXP 官方提供的linux內核默認已經集成了I.MX6ULL 的FlexCAN 驅動,但是沒有使能,因此我們需要配置Linux 內核,打開FlexCAN 驅動,步驟如下:
1、使能CAN 總線
首先打開CAN 總線子系統(tǒng),在Linux 下CAN 總線是作為網絡子系統(tǒng)的,配置路徑如下:
如圖66.3.2.1 所示:
2、使能Freescale 系CPU 的FlexCAN 外設驅動
接著使能Freescale 系CPU 的FlexCAN 外設驅動,配置路徑如下:
配置如圖66.3.2.2 所示:
配置好以后重新編譯內核,然后使用新的內核和設備樹啟動開發(fā)板。
FlexCAN 測試
檢查CAN 網卡設備是否存在
使用新編譯的內核和設備樹啟動開發(fā)板,然后輸入如下命令:
ifconfig -a //查看所有網卡前面我們說了,Linux 系統(tǒng)中把CAN 總線接口設備作為網絡設備進行統(tǒng)一管理,因此如果FlexCAN 驅動工作正常的話就會看到CAN 對應的網卡接口,如圖66.4.1.1 所示:
從圖66.4.1.1 可以看出,有一個名為“can0”的網卡,這個就是I.MX6U-ALPHA 開發(fā)板上的CAN1 接口對應的can 網卡設備。如果使能了I.MX6ULL 上的FlexCAN2 的話也會出現(xiàn)一個 名為“can1”的can 網卡設備。
移植iproute2
在移植ip 命令的時候必須先對根文件系統(tǒng)做個備份!防止操作失誤導致系統(tǒng)啟動失敗!切記!筆者的血淚經驗教訓!
busybox 自帶的ip 命令并不支持對can 的操作,因此我們需要重新移植ip 命令,也就是iproute2,iproute2 源碼下載地址為:https://mirrors.edge.kernel.org/pub/linux/utils/net/iproute2/。這
里我們下載4.4.0 版本的,筆者試過最新的版本,但是編譯一直有問題。4.4.0 版本的iproute2 已經下載好放到了開發(fā)板光盤中,路徑為:1、例程源碼->7、第三方庫源碼-> iproute2-4.4.0.tar.gz。
將iproute2-4.4.0.tar.gz 發(fā)送到ubuntu 中并解壓,命令如下:
解壓完成以后會得到一個名為“iproute2-4.4.0”的目錄,進入此目錄中,打開Makefile 并修改。在Makefile 中找到下面這行:
CC := gcc改為
CC:=arm-linux-gnueabihf-gcc修改完成以后如圖66.4.2.1 所示:
Makefile 修改完成以后直接使用“make”命令編譯,編譯成功以后就會在iproute2 源碼的ip 目錄下得到一個名為“ip”的命令,如圖66.4.2.2 所示:
以下操作請嚴格按照教程步驟來!否則可能會導致系統(tǒng)無法啟動!
1、將交叉編譯得到的ip 拷貝到開發(fā)板中
首先將交叉編譯到的ip 命令拷貝到開發(fā)板中,先不要替換開發(fā)板根文件系統(tǒng)中原有的ip 命令!切記!切記!先拷貝到開發(fā)板根文件系統(tǒng)的其他目錄里面,比如我這里就拷貝到/lib/modules/4.1.15 這個目錄里面,命令如下:
拷貝完成以后在開發(fā)板上先執(zhí)行一下新的ip 命令,查看一下版本號,命令如下:
cd lib/modules/4.1.15/ ./ip -V //執(zhí)行新的ip 命令,查看版本號如果新編譯的ip 命令運行正確的話就會打印出其版本號,如圖66.4.2.3 所示:
2、在開發(fā)板根文件系統(tǒng)中用新的ip 命令替換原來的
注意,此步驟在開發(fā)板中執(zhí)行!開發(fā)板根文件系統(tǒng)中原來的ip 命令是busybox 自帶的,存放在/sbin 目錄下。接下來,我們使用新的ip 命令替換原來的,在開發(fā)板中執(zhí)行如下命令:
拷貝完成以后將/lib/modules/4.1.15/目錄下的ip 命令刪除掉,重啟開發(fā)板,查看根文件系統(tǒng)是否可以正常啟動!如果正常啟動的話輸入如下命令查看ip 命令版本號:
ip -V //查看ip 命令版本號結果如圖66.4.2.4 所示:
至此,iproute2 中的ip 命令就已經移植好了,稍后的can 測試中我們會使用ip 命令來設置can0 網卡的相關信息。
3、替換ip 命令以后系統(tǒng)啟動失敗怎么辦?
如果在替換ip 命令的時候操作失誤可能會導致開發(fā)板系統(tǒng)啟動失敗,如圖66.4.2.5 所示:
從圖66.4.2.5 可以看出,系統(tǒng)啟動失敗,提示“Object “it” is unknown, try “ip help”.”,這是因為ip 命令替換錯誤導致的!所以說一定要嚴格按照本節(jié)教程講解的步驟替換ip 命令。遇到圖66.4.2.5 中的錯誤以后解決方法很簡單,把以前的ip 命令替換回來就行了,這就是前面強烈建議大家對根文件系統(tǒng)做個備份的原因!!!最簡單的方法就是用備份的根文件系統(tǒng)重新做一遍!
移植can-utils 工具
can0 網卡已經出現(xiàn)了,但是工作正不正常還不知道,必須要進行數(shù)據(jù)收發(fā)測試。這里我們使用can-utils 這個工具來對can0 網卡進行測試,因此要先移植can-utils 到我們的開發(fā)板根文件系統(tǒng)中。can-utils 源碼我們已經下載下來放到了開發(fā)板光盤中,路徑為:1、例程源碼->7、第三方庫源碼-> can-utils-2020.02.04.tar.gz。
在ubuntu 中新建一個名為“can-utils”的目錄來存放can-utils 的編譯結果。然后將can-utils源碼拷貝到ubuntu 中并解壓,命令如下:
tar -vxzf can-utils-2020.02.04.tar.gz //解壓解壓完成以后得到一個名為“can-utils-2020.02.04”的目錄,這個即使can-utils 源碼,進入到此目錄中,然后配置并編譯,命令如下:
cd can-utils-2020.02.04 //進入can-utils 源碼目錄 ./autogen.sh //先執(zhí)行autogen.sh,生成配置文件configure ./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --prefix=/home/zuozhongkai/linux/IMX6ULL/tool/can-utils --disable-static --enable-shared //配置 make //編譯 make install編譯完成以后就會前面創(chuàng)建的“can-utils”目錄下就會多出一個“bin”目錄,此目錄下保存著can-utils 的各種小工具,如圖66.4.3.1 所示:
將圖66.4.3.1 中的所有can-utils 小工具全部拷貝到開發(fā)板根文件系統(tǒng)下的/usr/bin 目錄下,命令如下:
拷貝完成以后我們就可以使用這些小工具來測試CAN 了。
CAN 通信測試
正點原子的I.MX6U-ALPHA 開發(fā)板上只有一個CAN 接口,因此我們還需要另外一個CAN設備,可以使用另一塊I.MX6U-ALPHA 開發(fā)板,或者USB 轉CAN 設備,這里我兩個都測試一下。
1、兩塊ALPHA 開發(fā)板連接測試
準備兩塊ALPHA 開發(fā)板,然后將CAN 接口連接起來,ALPHA 開發(fā)板上CAN 接線端子如圖66.4.4.1 所示:
將兩個開發(fā)板的CAN 接口連接起來,注意,CAN_H 接CAN_H,CAN_L 接CAN_L!
①、收發(fā)測試
首先使用ip 命令設置兩個開發(fā)板的CAN 接口,首先設置CAN 接口的速度,輸入如下所示命令:
上述命令設置can0 速度為500Kbit/S,兩個CAN 設備的速度要設置為一樣的!速度設置好以后打開can0 網卡,命令如下:
ifconfig can0 up //打開can0can0 打開以后就可以使用can-utils 里面的小工具進行數(shù)據(jù)收發(fā)測試了。一個開發(fā)板用來接收數(shù)據(jù),一個用來發(fā)送數(shù)據(jù),接收數(shù)據(jù)的開發(fā)板使用candump 命令,輸入如下命令:
candump can0 //接收數(shù)據(jù)發(fā)送數(shù)據(jù)的開發(fā)板使用cansend 命令向接收單元發(fā)送8 個字節(jié)的數(shù)據(jù):0X11、0X22、0X33、0X44、0X55、0X66、0X77、0X88。輸入如下命令:
cansend can0 5A1#11.22.33.44.55.66.77.88cansend 命令用于發(fā)送can 數(shù)據(jù),“5A1”是幀ID,“#”號后面的“11.22.33.44.55.66.77.88”就是要發(fā)送的數(shù)據(jù),十六進制。CAN2.0 一次最多發(fā)送8 個字節(jié)的數(shù)據(jù),8 個字節(jié)的數(shù)據(jù)之間用“.”隔開。
如果CAN 工作正常的話接收端就會接收到上面發(fā)送過來的這8 個字節(jié)的數(shù)據(jù),如圖66.4.4.2所示:
從圖66.4.4.2 可以看出,接收端的can0 接口接收到了8 個字節(jié)的數(shù)據(jù),幀ID 為5A1,說明CAN 驅動工作正常。
如果要關閉can0 的話輸入如下命令:
ifconfig can0 down②、回環(huán)測試
如果要在一個板子上進行CAN 回環(huán)測試,按照如下命令設置CAN:
如果回環(huán)測試成功的話那么開發(fā)板就會收到發(fā)送給自己的數(shù)據(jù),如圖66.4.4.3 所示:
2、USB 轉CAN 卡測試
接下來我們使用一個USB 轉CAN 卡與正點原子的I.MX6U-ALPHA 開發(fā)板進行數(shù)據(jù)收發(fā)測試,這里我使用的是周立功出品的USBCAN 設備,型號為“USBCAN-I+”,如圖66.4.4.4 所示:
首先設置開發(fā)板的can0 接口,速度為500Kbit/S,命令如下:
按照USBCAN 說明手冊設置好USB CAN 卡,速度設置為500Kbit,首先通過USBCAN 向ALPHA 發(fā)送數(shù)據(jù),發(fā)送的數(shù)據(jù)如圖66.4.4.5 所示:
從圖66.4.4.5 可以看出,USBCAN 發(fā)送了5 幀數(shù)據(jù)幀,幀類型為標準幀,這5 幀數(shù)據(jù)都是一樣的,幀ID 分別為0~4。開發(fā)板CAN 接口工作正常的話就會接收到這5 幀數(shù)據(jù),接收到的數(shù)據(jù)如圖66.4.4.6 所示:
從圖66.4.4.6 可以看出,開發(fā)板can0 接口接收到了5 幀數(shù)據(jù),和USBCAN 發(fā)送的一致。
也可以通過開發(fā)板向USBCAN 發(fā)送數(shù)據(jù),輸入如下命令發(fā)送數(shù)據(jù):
USBCAN 接收到數(shù)據(jù),如圖66.4.4.7 所示:
關于CAN 驅動就講解到這里,如果要編寫CAN 總線應用的話就直接使用Linux 提供的SocketCAN 接口,使用方法類似網絡通信,本教程不講解應用編程。
總結
以上是生活随笔為你收集整理的Linux CAN 驱动实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows Phone本地数据库(S
- 下一篇: 小米随身wifi驱动linux驱动下载,