本文记录RK3566/RK3568通用异步串口(uart)的配置与调试过程
1. 配置uart节点
1.1 在rk3568.dtsi中已经定义了uart0,uart1...,根据电路图,确定需要使用的是哪个串口,比如我使用的是uart0,在另外一个与我们自己主板相关的dtsi文件(一般不在rk3568.dtsi中直接改,这个文件不要改动,我的是自己创建的,名为rk3566_test_base.dtsi,就这里修改),打开uart0:
&uart0 {
status = "okay";
//dma-names = "tx", "rx";
pinctrl-names = "default";
pinctrl-0 = <&uart0_xfer/* &uart0_ctsn &uart0_rtsn*/>;
};
1.2 注意pinctrl-0,里面的uart0_xfer在rk3568-pinctrl.dtsi(本文件也不要修改)中定义,可以看到下面信息:
这里实际上是GPIO0-PC0和GPIO0-PC1,这里必须要和电路上的uart通信线rx和tx一致。假如采用了硬件控制信号,还需要配置uart0_ctsn和uart0_rtsn,它们同样在rk3568-pinctrl.dtsi中定义。
2.测试串口
2.1 节点配置好后,烧录运行,一般会在/dev/下面看到类似ttyS0,ttyS1等设备文件,它对应的就是uart0,查看串口信息:
udevadm info /dev/ttyS0
通过上面命令,可以看到如下串口信息,注意地址,它与uart在dtsi中定义的地址对应,比如下面ttyS0地址对应uart0的0xfdd50000
2.2 串口波特率
stty -F /dev/ttyS0 查看波特率
stty -F /dev/ttyS0 115200 设置波特率为115200
2.3 linux命令对串口读写
cat /dev/ttyS0 读取串口收到的信息
echo "hello" >> /dev/ttyS0 向串口发送信息
3. python脚本测试串口
3.1 要向自动测试串口,使用python是一个不错的选择,需要安装python3串口支持:
sudo apt install python3-serial
3.2 编写测试脚本
import serial
import time
print("正在运行串口读取程序...")
com = '/dev/ttyS0'
ser = serial.Serial(com,115200,timeout=0.5)
print("Serial:",com," baud:",ser.baudrate)
ser.bytesize = serial.EIGHTBITS
ser.parity = serial.PARITY_NONE
ser.stopbits = serial.STOPBITS_ONE
print(ser.isOpen())
try:
while True:
if ser.in_waiting > 0:
a = ser.read()
print(a)
serial.write(a)
except KeyboardInterrupt:
print("程序退出!")
finally:
ser.close()
这个脚本就是从下位机接收数据并显示,同时发送接收到的数据,这样可以测试通信了
4.udev生成链接
很多软件,比如klipper需要在/dev/serial/py-id或/dev/serial/py-path下面找串口的连接,但通常情况下,uart是不会自动生成这个链接的,需要修改udev规则文件,在/lib/udev/rules.d/或者/etc/udev/rules.d/中找到60-serial.rules,有可能名字不是这个,但是,它与serial有关,搜一下,然后编辑规则。
由上图可见,原本系统只对ttyUSB*和ttyACM*作链接的,我们把串口ttyS*放进去即可,然后执行下面命令:
sudo udevadm control --reload-rules
这样就可以看到我们的串口被创建链接了: