Ubuntu 内核 5.7 在 RS485 传输上切换 USB 串行 XR21B1424 RTS# GPIOD7/RS485D,但更高版本没有(例如 5.17)

Ubuntu 内核 5.7 在 RS485 传输上切换 USB 串行 XR21B1424 RTS# GPIOD7/RS485D,但更高版本没有(例如 5.17)

Ubuntu Kernel 5.7 使用 cdc-acm USB/Serial 连接 Maxlinear XR21B1424,在传输期间切换芯片的 GPIOD7/RS485D 为高电平,在其它时间切换为低电平,以进行半双工控制,但较新的内核(例如 Kernel 5.17,使用 xr_serial USB/Serial 连接 Maxlinear XR21B1424)则不会。如何判断内核驱动程序是否有更新,使 XR21B1424 的 GPIOD7/RS485D 线始终保持为高电平或处于上拉状态?

Ubuntu 20.04.06 LTS,内核 5.7:传输过程中,GPIOD7/RS485D 切换为高电平,然后保持为低电平

Ubuntu 20.04.06 LTS,内核 5.17,GPIOD7/RS485D 始终为高,当 rtscts=1 时,传输输出被抑制

Ubuntu 23.10.1,内核 6.5.0-14-generic(在 VirtualBox/Windows 中)UART 传输,但 GPIOD7/RS485D 始终保持高位

import time
import serial
import serial.rs485

myPort = '/dev/ttyUSB2'

ser = serial.rs485.RS485(
port=myPort,
baudrate=4800,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
xonxoff=0,
rtscts=0,
timeout=1)

ser.rs485_mode = serial.rs485.RS485Settings(loopback = False, rts_level_for_tx = True, rts_level_for_rx = False)

myString = "This is an example of a string that is written to the serial Port"

myArray = myString.encode('utf-8')
print("Writing " +  str("'") + myString + str("'"))

ser.write(myArray)
ser.read(10)
ser.close

答案1

取代 cdc_acm 的新 xr_serial 驱动程序不启用“RS485”模式,该模式默认在 T/X 期间断言 GPIO7/RS485,而旧的 cdc_acm 驱动程序最初则这样做。

Ubuntu-V20 5.15.0-91-generic #101~20.04.1-Ubuntu SMP Thu Nov 16 14:22:28 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux) 中的 xr_serial 驱动程序使 GPIO7/RS485 处于芯片的默认状态,即 GPIO,并且在 T/X 期间不会断言。

为了启用该功能,必须使用较旧的 cdc_acm 或者更新或修改的驱动程序来启用此配置。

相关内容