一. 前言
世平集團針對 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" )
打開 "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 相關行為。
(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
透過 "bitbake" 命令打包 Kernel Image 與 "dtb"。
bitbake linux-imx -f -c 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" 目錄下面。
(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 來與對方溝通。
(1) 設置 PC 端 Console:( 筆者使用的是 "Putty" 這個 Software Tool 來收發 RS485 訊息 )
下圖為本篇文章的 Console 設置概況,主要會使用板子裡的 "/dev/ttymxc1" 與 PC 上的 COM12 來與對方溝通。
(1) 設置 PC 端 Console:( 筆者使用的是 "Putty" 這個 Software Tool 來收發 RS485 訊息 )
① 在 PC 上打開 "Putty" 程式。
② 設置 Baud Rate 為 115200。 ( 筆者 PC 的 COM Port 為 COM12,而這裡的 COM12 指的是 RS485 這個 COM Port )
設置完畢後會看到如下畫面。
② 設置 Baud Rate 為 115200。 ( 筆者 PC 的 COM Port 為 COM12,而這裡的 COM12 指的是 RS485 這個 COM Port )
設置完畢後會看到如下畫面。
(2) 設置開發板端 Console:
設置好開發板 OP-Doflamingo ( i.MX8MQ ) 的 Baud Rate 並開啟 Console 將開發板開機。( 筆者 PC 上顯示的 Port 號為 "/dev/ttyUSB0",指的是 i.MX8MQ )
(3) 開發板端發送訊號:( PC 收訊號 )
① 在 OP-Doflamingo ( i.MX8MQ ) 的 Console 中設置開發板 RS485 這個 Port 的 Baud Rate,本文章的範例是設置 RS485 這 Port 的 Baud Rate 為 115200。 ( 這裡的 "/dev/ttymxc1" 指的是開發板裡的 RS485 這個 Port )
② 透過開發板的 RS485 這個 Port 下命令。
接著 PC 端的 Console ( COM12 ) 就會看到來自 OP-Doflamingo ( i.MX8MQ ) 送出的訊息了。
stty -F /dev/ttymxc1 115200?
② 透過開發板的 RS485 這個 Port 下命令。
echo “imx8 send” > /dev/ttymxc1?
接著 PC 端的 Console ( COM12 ) 就會看到來自 OP-Doflamingo ( i.MX8MQ ) 送出的訊息了。
(4) PC 端發送訊號: ( 開發板收訊號 )
① 在 OP-Doflamingo ( i.MX8MQ ) 端下命令做接收訊號的動作。( 這裡的 "/dev/ttymxc1" 指的是開發板裡的 RS485 這個 Port )
② 接著在 PC 端 Console ( COM12 ) 輸入任意字串之後按 "Enter" 送出。( 本篇文章的範例是在 PC 端 Console 輸入 "pc send" 字串給開發板端 )
接著就可以從 OP-Doflamingo ( i.MX8MQ ) 端收到,來自 PC 發送的訊息了。
cat /dev/ttymxc1?
② 接著在 PC 端 Console ( COM12 ) 輸入任意字串之後按 "Enter" 送出。( 本篇文章的範例是在 PC 端 Console 輸入 "pc send" 字串給開發板端 )
pc send?
接著就可以從 OP-Doflamingo ( i.MX8MQ ) 端收到,來自 PC 發送的訊息了。
透過以上操作我們了解到:
① 如何透過 i.MX8MQ 端 ( OP-Doflamingo ) 的 Console 發送資料到 PC 端。
② 如何透過 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 的進階應用」相關博文,請各位讀者拭目以待。
五. 參考文件
參考來源