RPi CM4 UART RS232 RS485 使用 啟用 開通
前言
本篇內容將base on RPi CM4來帶各位一步一步瞭解硬體驗證的流程與步驟,主要針對UART的啟用。
前提準備
在啟用USB 3.0之前我們要先把RPi架設好環境,請參考這篇文章->Base on RPi CM4 開發板 硬體驗證流程 教學 步驟 硬體驗證工程師 BSP工程師<-
RS232/RS485打通的方法
為了確認RS232設備是否有抓到,一開始我們可以先下這個指令看
$ ls -l /dev/ttyA*
crw-rw---- 1 root dialout 204, 64 Jun 16 11:30 /dev/ttyAMA0
看看有幾個ttyACMX,開通了幾個UART,這邊我只有看到一個UART,而從電路圖上看我公司板子還有額外使用UART2, UART3, UART4,我們知道晶片的GPIO會有Alternative function pin,也就是說一個pin腳,他可以設定成不同的作用或功能,我們看下圖CM4 Datasheet
從上圖中我們可以得知GPIO0可以設定成SDA0, SA5, PCLK, SPI3_CE0_N, TXD2, SDA6,不同的通訊協定,看當初產品設計有哪些周邊功能,來規劃每一個GPIO最為哪一個通訊協定,那我們只要看電路圖就可以得知那些腳為用到了哪些功能。
既然我們知道pin腳位功能可以設定,那接下來要講怎麼設定,一般來說要去改device tree的硬體描述設定,但RPi有另位做了overlap的機制,讓我們開發者只要修改config.txt檔,加上簡短幾個描述,就會把他原本又已經編譯好的device tree blob(dtb),overlap進去原本的dtb。
那我們看一下raspberry overlap的README從這裡我們可以知道要怎麼在/boot/config.txt裡面做設定,而這裡可以快速知道有哪些已經做好的dtb可以直接使用像是底下這圖。
也可以使用底下指令來快速查有哪些UART的設定
$ dtoverlay -a | grep uart
midi-uart0
midi-uart1
midi-uart2
midi-uart3
midi-uart4
midi-uart5
miniuart-bt
qca7000-uart0
uart0
uart1
uart2
uart3
uart4
uart5
ref: 树莓派 4 UART 多串口配置通信
UART他已經做好dtb,所以我們可以使用底下指令來確認UART的參數設定或是看上面的README
$ sudo dtoverlay -h uart2
Name: uart2
Info: Enable uart 2 on GPIOs 0-3. BCM2711 only.
Usage: dtoverlay=uart2,<param>
Params: ctsrts Enable CTS/RTS on GPIOs 2-3 (default off)
從剛剛上面的Alternative function pin中的TXD2, RXD2, CTS2即是代表UART2的腳位,而參數Params: ctsrts就是用來設定你的UART是只有TX/RX還是RS232有CTS腳位。
知道語法後我們依照公司的電路圖在config.txt加入底下語法來開啟相對應的UART Port。
# Enable UART Port
dtoverlay=uart2,ctsrts
dtoverlay=uart3,ctsrts
dtoverlay=uart4
設定完成後重新開機
我們在下達底下指令觀看結果
$ ls -l /dev/ttyA*
crw-rw---- 1 root dialout 204, 64 Jun 16 11:30 /dev/ttyAMA0
crw-rw---- 1 root dialout 204, 65 Jun 16 11:17 /dev/ttyAMA1
crw-rw---- 1 root dialout 204, 66 Jun 16 11:17 /dev/ttyAMA2
crw-rw---- 1 root dialout 204, 67 Jun 16 11:17 /dev/ttyAMA3
!!補充 雖然UART打開了,但我卻發現dmesg出現了錯誤訊息,我們底下再來看看
[ 19.566331] pinctrl-bcm2835 fe200000.gpio: pin gpio9 already requested by fe201800.serial; cannot claim for fe204000.spi
[ 19.566369] bcm2835_vc_sm_cma_probe: Videocore shared memory driver
[ 19.566370] pinctrl-bcm2835 fe200000.gpio: pin-9 (fe204000.spi) status -22
[ 19.566388] pinctrl-bcm2835 fe200000.gpio: could not request pin 9 (gpio9) from group gpio9 on device pinctrl-bcm2711
[ 19.566397] [vc_sm_connected_init]: start
[ 19.566407] spi-bcm2835 fe204000.spi: Error applying setting, reverse things back
從錯誤訊息來看猜測是SPI與UART發生衝突(GPIO9),這時候我就去查config.txt檔,沒有用到SPI的參數,所以Google搜尋相關問題查到 Setting alternate function for GPIO pins裡面說換另一個GPIO功能需要把driver modulr給關閉,如下指令
# cat blacklist spi-bcm2708 > /etc/modprobe.d/raspi-blacklist.conf
再重新開機問題就解決了,目前初步猜測是driver有用到SPI,詳細root cause需要花時間再下去看。
結語
硬體驗證就是這麼簡單有趣~
留言