【ATU Book-i.MX8 系列-RS485】NXP i.MX8MQ 之使用 RS485 與 PC 傳輸資料實作 ( 下 )

前言

世平集團針對 RS485 相關技術整理了一系列博文,下圖為詳細的博文索引架構;筆者希望能夠透過這些博文協助大家更了解如何在 i.MX8 相關平台上使用 RS485,未來筆者也會持續更新此系列的相關博文還懇請支持!而本篇博文會針對 RS485 相關技術索引架構中的【ATU Book-i.MX8 系列-RS485】NXP i.MX8MQ 之使用 RS485 與 PC 傳輸資料實作 ( 下 ) 這篇文章做介紹。文章中會敘述如何修改以及編譯 RS485 相關程式,看完本篇文章後讀者們可以了解到「如何在 Linux 系統上下命令與 PC 端做資料傳輸」,再來讓我們繼續看下去吧!

博文架構



二. RS485 相關軟體修改

本篇文章使用的開發板為世平集團自行製作的 OP-Doflamingo,此開發板使用的 SOC 為 i.MX8MQ;軟體版本為 Linux 5.10.9_1.0.0。本篇文章將會介紹如何修改 Device Tree,開啟平台對 RS485 的 Support,達成在 OP-Doflamingo 開發板上 ( i.MX8MQ ) 使用 RS485 的目的。接著請讓我們繼續看修改的部分吧。

a. 修改 Device Tree

以下將會敘述如何修改 Device Tree。

請先移動到 Kernel 目錄下。( 筆者的目錄在 "~/imx-yocto-bsp-5.10.9_1.0.0/wayland-imx8mqevk-multimedia/tmp/work-shared/imx8mqevk/kernel-source" )
mv Kernel

打開 "imx8mq-evk.dts"。
vim arch/arm64/boot/dts/freescale/imx8mq-evk.dts

請參照以下 Diff,修改 "imx8mq-evk.dts" 文件。
--- a/arch/arm64/boot/dts/freescale/imx8mq-evk.dts
+++ b/arch/arm64/boot/dts/freescale/imx8mq-evk.dts
@@ -550,6 +550,7 @@
reg = <0x11>;
reset-gpios = <&gpio3 16 GPIO_ACTIVE_HIGH>;
dsd-path = <1>;
+ status = "disabled";
};

adv_bridge: adv7535@3d {
@@ -766,6 +767,19 @@
status = "okay";
};

+
+&uart2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_uart2>;
+ assigned-clocks = <&clk IMX8MQ_CLK_UART2>;
+ assigned-clock-parents = <&clk IMX8MQ_SYS1_PLL_80M>;
+ linux,rs485-enabled-at-boot-time;
+ //fsl,uart-has-rtscts;
+ rs485-rx-during-tx;
+ rts-gpios = <&gpio3 16 GPIO_ACTIVE_HIGH>;
+ status = "okay";
+};
+
&uart3 { /* BT */
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart3>;
@@ -1074,6 +1088,13 @@
>;
};

+ pinctrl_uart2: uart2grp {
+ fsl,pins = <
+ MX8MQ_IOMUXC_UART2_TXD_UART2_DCE_TX 0x49
+ MX8MQ_IOMUXC_UART2_RXD_UART2_DCE_RX 0x49
+ >;
+ };
+
pinctrl_uart3: uart3grp {
fsl,pins = <
MX8MQ_IOMUXC_UART3_TXD_UART3_DCE_TX 0x49

以下將會針對上述修改做解釋:

(1) 透過以上修改 Linux 系統將會開啟 UART2 介面,改完開機以後可在系統中看到 4 組 UART 介面 ( 分別為 "/dev/ttymxc0" 到 "/dev/ttymxc3" ),當中的 "/dev/ttymxc1" 指的就是 UART2。
補充:Default 程式不修改的情況,只會看到 3 組 UART 介面。

(2) 由於 UART2 這 2 根 Pin 腳為 Multi-Function Pin,所以需要透過 "pinctrl" 描述確實的將 UART2_TX 及 UART2_RX 這 2 根 Pin 腳做正確的設置。
補充:i.MX 系列 SOC 支援 Multi-Function Pin ( Pin Mux ) 功能,我們可透過這個特性將某根 Pin 腳設置為某種功能。( 例如把 UART2 設置為 GPIO 功能 )

(3) 以上 Patch 會將 UART2 開啟並讓平台支援 RS485 功能。而此段邏輯的程式碼實作在 "drivers/tty/serial/serial_core.c" 中。( 可參考程式碼的 uart_get_rs485_mode() )

補充:如果在 Device Tree 中填寫 "linux,rs485-enabled-at-boot-time" 參數,就會設置 SER_RS485_ENABLED Flag。後續程式碼中也會根據此 Flag 決定 RS485 相關行為。
SER_RS485_ENABLED

(4) 設置 GPIO3_IO16 為 RS485 Transceiver IC 的控制 Pin 腳。
補充:從【ATU Book-i.MX8 系列-RS485】NXP i.MX8MQ 之使用 RS485 與 PC 傳輸資料實作 ( 上 ) 這篇文章中可以了解到本篇文章使用 SP3088E 這顆 RS485 Transceiver IC。而使用 SP3088E 這顆 IC 至少需要使用 1 根 Pin 腳來控制 RS485 Transceiver IC 上的 RE 腳與 DE 腳

以上 Patch 修改完畢後,後續章節將會介紹如何針對上述修改的部分做程式編譯,請各位讀者繼續看下去吧。

b. 編譯 Kernel

以下將會敘述如何編譯 Kernel 並產出相關檔案。

請先回到專案目錄下。( 筆者的目錄在 "~/imx-yocto-bsp-5.10.9_1.0.0/wayland-imx8mqevk-multimedia" )

透過 "bitbake" 命令編譯 Kernel。
bitbake linux-imx -f -c compile
compile

透過 "bitbake" 命令打包 Kernel Image 與 "dtb"。
bitbake linux-imx -f -c deploy
deploy

由於本篇文章修改的地方只有 Device Tree 的部分,因此我們可以去 "tmp/deploy/images/imx8mqevk" 下找到產出結果。( 產出的檔名為 "imx8mq-evk.dtb" )
產出

c. 小結

透過以上修改 Device Tree 章節可以了解到如何修改 Device Tree 並設置 UART2 的 RS485 相關能力,最終讓 Linux 系統長出 "/dev/ttymxc1" 這個 Node。後續章節將會用實驗來驗證此 RS485 設置沒問題並透過 "/dev/ttymxc1" 這個 Node 與 PC 端做傳輸資料。接著請各位讀者繼續看下去吧!



三. 實驗

本篇文章使用的開發板為世平集團自製作的開發板 OP-Doflamingo。此開發板使用的 SOC 為 i.MX8MQ;系統開機方式為 SD Boot,以下將會介紹如何使用此開發板 OP-Doflamingo 透過 RS485 與 PC 端相互傳遞資料。

a. 環境設置

(1) 替換 Device Tree

本篇文章主要是將 Image 燒到 SD Card 中並在開發板端使用此張 SD Card 開機。把 Image 燒入 SD Card 中的方式有很多種包含有 "dd" 或 "uuu" 等方法,在此不對燒寫 SD Card 議題多做說明若有 SD Card 燒錄相關疑問可以上網搜尋【ATU Book-i.MX8系列】相關博文,接著以下會敘述如何替換 SD Card 中的 Device Tree。

請先將 SD Card 插入 PC 中,系統會自動掛載 SD Card。

接著請將上述編譯 Kernel 章節編譯出來的 "imx8mq-evk.dtb" 放入 SD Card 目錄中做替換。此 "imx8mq-evk.dtb" 的路徑位於 Codebase 中的 "tmp/deploy/images/imx8mqevk" 目錄下面。
Change DTB

(2) 硬體環境設置

由於此開發板 OP-Doflamingo 裡有上件 RS485 相關元件因此可以透過 RS485 協議與 PC 端做資料傳輸 ( 關於 RS485 相關元件使用議題可參考【ATU Book-i.MX8 系列-RS485】NXP i.MX8MQ 之使用 RS485 與 PC 傳輸資料實作 ( 上 ) 這篇文章 ),以下將會介紹如何實際使用 RS485 相關工具將 PC 與 OP-Doflamingo ( i.MX8MQ ) 對接起來。

筆者使用的硬體設備有:

① OP-Doflamingo 開發板一片。 ( i.MX8MQ )

② PC 一台。

③ USB To RS485 Converter Cable。( 讀者們可自行上網搜尋購買 )

④ DB9 To RS485 6 Pin 接頭。( 讀者們可自行上網搜尋購買 )

此 USB To RS485 Converter Cable 主要是安裝在 PC 上面,再透過 DB9 To RS485 6 Pin 接頭與 OP-Doflamingo ( i.MX8MQ ) 做連接。( 接法如下圖所示 )

架構圖

由於 OP-Doflamingo 的 RS485 Connector 是採用 PicoBlade 6 Pin 接頭,剛好筆者做此實驗的時候手上沒有 PicoBlade 6 Pin 接頭,所以就自己焊 Data+ 與 Data- 這 2 條線來與 DB9 接頭連接。( 示意圖如下 )

對接圖

b. 驗證資料傳遞
稍早章節介紹了如何將 PC 與 OP-Doflamingo ( i.MX8MQ ) 透過 RS485 相關硬體裝置對接,再來將會實際 Demo 如何透過 RS485 傳遞資料。

下圖為本篇文章的 Console 設置概況,主要會使用板子裡的 "/dev/ttymxc1" 與 PC 上的 COM12 來與對方溝通。
COM Port Layout

(1) 設置 PC 端 Console:( 筆者使用的是 "Putty" 這個 Software Tool 來收發 RS485 訊息 )

① 在 PC 上打開 "Putty" 程式。
Putty

② 設置 Baud Rate 為 115200。 ( 筆者 PC 的 COM Port 為 COM12,而這裡的 COM12 指的是 RS485 這個 COM Port )
COM Port

設置完畢後會看到如下畫面。
COM Putty

(2) 設置開發板端 Console

設置好開發板 OP-Doflamingo ( i.MX8MQ ) 的 Baud Rate 並開啟 Console 將開發板開機。( 筆者 PC 上顯示的 Port 號為 "/dev/ttyUSB0",指的是 i.MX8MQ )
BOOT

(3) 開發板端發送訊號:( PC 收訊號 )

① 在 OP-Doflamingo ( i.MX8MQ ) 的 Console 中設置開發板 RS485 這個 Port 的 Baud Rate,本文章的範例是設置 RS485 這 Port 的 Baud Rate 為 115200。 ( 這裡的 "/dev/ttymxc1" 指的是開發板裡的 RS485 這個 Port )
stty -F /dev/ttymxc1 115200​

② 透過開發板的 RS485 這個 Port 下命令。
echo “imx8 send” > /dev/ttymxc1​

接著 PC 端的 Console ( COM12 ) 就會看到來自 OP-Doflamingo ( i.MX8MQ ) 送出的訊息了。
Send

(4) PC 端發送訊號: ( 開發板收訊號 )

① 在 OP-Doflamingo ( i.MX8MQ ) 端下命令做接收訊號的動作。( 這裡的 "/dev/ttymxc1" 指的是開發板裡的 RS485 這個 Port )
cat /dev/ttymxc1​

② 接著在 PC 端 Console ( COM12 ) 輸入任意字串之後按 "Enter" 送出。( 本篇文章的範例是在 PC 端 Console 輸入 "pc send" 字串給開發板端 )
pc send​

接著就可以從 OP-Doflamingo ( i.MX8MQ ) 端收到,來自 PC 發送的訊息了。
PC Send

透過以上操作我們了解到:

① 如何透過 i.MX8MQ 端 ( OP-Doflamingo ) 的 Console 發送資料到 PC 端

② 如何透過 i.MX8MQ 端 ( OP-Doflamingo ) 的 Console 接收來自 PC 端的資料

在這裡再稍微提及一下【ATU Book-i.MX8 系列-RS485】NXP i.MX8MQ 之使用 RS485 與 PC 傳輸資料實作 ( 上 ) 這篇文章提到的 RS485 半雙功特性。i.MX8MQ 端裝置 ( OP-Doflamingo ) 與 PC 端裝置之間雖然可以透過 RS485 互相傳遞資料,但是由於半雙功特性的緣故所以在 1 個時間內只能夠有 1 個裝置能做資料的發送或接收;比方說當 i.MX8MQ 端裝置 ( OP-Doflamingo ) 發送資料的時候 PC 端裝置不能傳送資料,若是 PC 端裝置想要傳送資料則須等待 i.MX8MQ 端裝置 ( OP-Doflamingo ) 的資料傳送完成以後 PC 端裝置才可以做事。



四. 結語

世平集團針對 RS485 相關技術整理了一系列博文,而本篇文章是以世平集團自行製作的 OP-Doflamingo ( i.MX8MQ ) 開發板為例子「示範如何與 PC 端透過 RS485 做資料的傳輸」,希望本篇文章的內容可以讓各位讀者對 RS485 相關技術有更深入的體會,若未來讀者們有 RS485 的相關問題歡迎隨時與世平集團做討論,之後筆者將會繼續撰寫「RS485 的進階應用」相關博文,請各位讀者拭目以待。



五. 參考文件

★博文內容參考自 網站,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

參考來源

評論