最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

IMX6ULL與STM32F103的CAN通信實現(xiàn)

2022-12-22 09:48 作者:17投47中  | 我要投稿

在上一篇博文中,我們利用USBCAN設(shè)備及其上位機軟件,測試了一塊以IMX6ULL為核心芯片的開發(fā)板的CAN通信收發(fā)功能,了解了在Linux應(yīng)用層基于套接字實現(xiàn)CAN網(wǎng)絡(luò)應(yīng)用的基本方法。本次我們將USBCAN替換為一塊以STM32F103ZET6為核心芯片的開發(fā)板,嘗試實現(xiàn)雙機之間的CAN通信基本功能。

  • 硬件連接

在硬件上,兩個板子各自均只留出1路CAN接口,只需將兩個CAN接口的CAN_H與CAN_L對應(yīng)連接起來即可。由于CAN信號是兩根線的差分信號,故不需要再連接其它。兩板的CAN收發(fā)器均采用經(jīng)典的TJA1050,器件連接的原理圖如下。用線連好后雙機的CAN通信連接示意圖如下。芯片內(nèi)部集成的CAN控制器與外接的CAN收發(fā)器交換CAN報文數(shù)據(jù),收發(fā)器是控制器與物理總線的中間媒介,負(fù)責(zé)在控制器的邏輯電平和總線的差分信號間做轉(zhuǎn)換。而CAN控制器的具體行為由相關(guān)寄存器的狀態(tài)決定,需要我們編寫程序來控制。兩個收發(fā)器之間的CAN_H和CAN_L兩條線的兩段之間,需要各自接一個120Ω的電阻,由原理圖可見板載已經(jīng)接入了該電阻,無需額外接入。兩個板子連接的實物圖如下。

  • 驅(qū)動層實現(xiàn)

這里所說的驅(qū)動層,是從Linux系統(tǒng)體系的角度而言的。Linux具有明顯的內(nèi)核與應(yīng)用層之分,對底層硬件的驅(qū)動程序是內(nèi)核的組成部分,在應(yīng)用層控制硬件工作的流程中充當(dāng)了一種“中間件”的作用,對上提供相關(guān)接口供應(yīng)用層調(diào)用,對下通過操作寄存器等真正操控硬件的行為。但對于STM32裸機的開發(fā)方式來說,程序并不需要明確劃分哪些部分屬于app、哪些屬于driver,所有的代碼是可以放在一起的。我們本次的開發(fā)基于ST官方提供的標(biāo)準(zhǔn)庫,所以這里把基于標(biāo)準(zhǔn)庫封裝開發(fā)所得的用于實現(xiàn)STM32的CAN外設(shè)基本功能的接口,稱為STM32的CAN“驅(qū)動層”。

[1]IMX6ULL

為驅(qū)動IMX6ULL上的CAN外設(shè),首先要找到描述該設(shè)備硬件信息的設(shè)備樹,其中外設(shè)引腳信息和控制器描述信息是必不可少的。我們在內(nèi)核源碼/arch/arm/boot/dts/目錄下找到有關(guān)該CAN外設(shè)的設(shè)備樹代碼如下:

上面CAN控制器的status為disabled,表示不可用,需要改成okay才能正常使用。一般我們不會直接去修改原控制器的默認(rèn)設(shè)置,而是采用“追加”的方式更改屬性值,如下為對flexcan1硬件信息的追加補充:

這樣設(shè)備樹的配置基本就完成了,然后需要使能IMX6ULL的flexcan驅(qū)動。一般而言,NXP在官方提供的內(nèi)核里已經(jīng)集成了多種類型外設(shè)的驅(qū)動,如果僅僅使用基礎(chǔ)通信等基本功能而不涉及復(fù)雜需求的實現(xiàn),那么大多數(shù)情況下直接使能內(nèi)核自帶驅(qū)動后就可以了。在內(nèi)核源碼頂層目錄下執(zhí)行內(nèi)核配置make menuconfig,依次進入Networking support、CAN bus subsystem support、CAN Device Driver,找到Support for Freescale FLEXCAN based chips選項,編譯類型選成編譯為內(nèi)核一部分即built-in,如下:

保存設(shè)置后CAN驅(qū)動的編譯選項就存在了編譯配置文件中,再編譯內(nèi)核就能使上面的設(shè)備樹配置和驅(qū)動配置生效了,將生成的Image和dtb文件載入IMX6ULL開發(fā)板,即可看到系統(tǒng)中的CAN設(shè)備,如下。在/sys/class/net/目錄下的can0即為我們配置的外設(shè),查看其控制器設(shè)備樹的status可見值為okay,和我們設(shè)置的一樣。

[2]STM32F103ZET6

要使用STM32F103的CAN外設(shè),我們需要考慮這些方面:①引腳配置,要考慮CAN_RX和CAN_TX所在引腳號、GPIO的時鐘使能、GPIO參數(shù)如何配置等;②CAN控制器配置,包括CAN外設(shè)時鐘使能、CAN工作模式、波特率、接收FIFO屬性等;③CAN過濾器配置,主要決定CAN的接收策略;④CAN外設(shè)的接收和發(fā)送接口;⑤在需要利用CAN中斷的場合,還應(yīng)該配置NVIC和CAN中斷類型。后面和IMX6ULL交互時需要用到CAN接收中斷,所以我們本次需要配置中斷?;赟T提供的標(biāo)準(zhǔn)庫,可以將上述幾方面開發(fā)成自己的接口,即為所謂的CAN“驅(qū)動層”。我們開發(fā)的接口主要代碼如下:

上面代碼中,CAN接收中斷號定義在文件stm32f10x.h中的枚舉類型IRQn_Type,該類型規(guī)定了STM32F10x的所有中斷號。CAN接收中斷服務(wù)函數(shù)的名稱定義在啟動文件start_up_stm32f10x_hd.s中。在CAN控制器配置函數(shù)中,設(shè)定了禁止FIFO鎖定模式,意味著FIFO溢出時新接收的報文會覆蓋舊的報文而不會被丟棄。由時間參數(shù)的設(shè)定可以得出,CAN波特率即為36MHz/(8*(1+5+3))=500kbps。在CAN過濾器的配置中,采用了32位掩碼模式,根據(jù)ID為0x123和掩碼為0xFFFF可知,這里設(shè)定了僅接受ID為0x123的報文,并且為標(biāo)準(zhǔn)ID和數(shù)據(jù)幀。使能了FIFO0的消息掛起中斷,即該郵箱中接收到消息就進入CAN接收服務(wù)函數(shù)。在CAN_SendTxMsg接口中,調(diào)用了庫函數(shù)CAN_Transmit進行發(fā)送,該函數(shù)返回有效的郵箱號或表示無可用郵箱的標(biāo)志。利用庫函數(shù)CAN_TransmitStatus檢查發(fā)送狀態(tài)是否為完成。

  • 應(yīng)用層實現(xiàn)

我們設(shè)計一個非常簡單的雙機交互流程,如下:

IMX6這邊首先發(fā)送ID為x0123的CAN報文,STM32接收到后回復(fù)ID為0x456的CAN報文,IMX6收到后繼續(xù)發(fā)送0x123,然后重復(fù)這個過程。

[1]IMX6ULL

關(guān)于IMX6ULL的CAN通信應(yīng)用層的基本知識,可參考之前的博文《imx6ull開發(fā)板的CAN通信》,這里不詳細說明了。我們設(shè)置2個線程分別處理發(fā)送和接收任務(wù),發(fā)送線程在收到報文后延時2秒發(fā)送,兩個線程之間使用簡單的標(biāo)志位同步。應(yīng)用層代碼如下:

[2]STM32F103ZET6

STM32側(cè)的接收是在CAN接收中斷服務(wù)函數(shù)中完成的,在文件stm32f10x_it.c中添加如下代碼:

有報文到來則FIFO0的消息掛起中斷觸發(fā),調(diào)用庫函數(shù)CAN_Receive實現(xiàn)接收,并且通過簡單的標(biāo)志位通知主函數(shù)消息收到。接收緩沖區(qū)和通知標(biāo)志均在主函數(shù)中聲明。主函數(shù)循環(huán)檢測該標(biāo)志,如檢測到被置1則通過串口把收到的數(shù)據(jù)打印出來,并立即發(fā)送報文給IMX6ULL。主函數(shù)的主要代碼如下:

  • 結(jié)果

兩邊編譯成功后燒寫到各自板子中,啟動IMX6側(cè)的應(yīng)用進程,可以看到STM32側(cè)打印的串口消息和IMX6側(cè)進程打印的接收消息如下??梢钥闯鯯TM32成功接收到了ID為0x123的標(biāo)準(zhǔn)數(shù)據(jù)幀,每次接收8字節(jié)0x01到0x08,IMX6ULL側(cè)成功接收到了ID為0x456的標(biāo)準(zhǔn)數(shù)據(jù)幀,每次接收8字節(jié):0x78、0x89、0x9a、0xab、0xbc、0xcd、0xde和0xef。


IMX6ULL與STM32F103的CAN通信實現(xiàn)的評論 (共 條)

分享到微博請遵守國家法律
天柱县| 西林县| 灌阳县| 浦江县| 青海省| 江门市| 平远县| 韶关市| 桂平市| 饶平县| 沧州市| 缙云县| 烟台市| 东平县| 泉州市| 永定县| 兴城市| 临江市| 霍林郭勒市| 长治县| 台东市| 那曲县| 赤壁市| 杭州市| 丹棱县| 古蔺县| 广宁县| 阳山县| 灵山县| 韶关市| 德保县| 津市市| 遂昌县| 嵊州市| 靖州| 桑植县| 河西区| 铜山县| 长兴县| 许昌市| 高密市|