我正在为 Linux 上的 ARM AT91SAM9260 板编写 RS485 驱动程序。
当我初始化 UART 时,RTS 信号线变高 (1)。我想这会也应该是 RS232 操作模式下的标准行为。然而,在 RS485 模式下,这是不想要的。
我正在使用 arm-arch 部分提供的标准函数来初始化 UART。因此,重要的步骤是:
at91_register_uart(AT91SAM9260_ID_US2, 3, ATMEL_UART_CTS | ATMEL_UART_RTS);
//consisting of:
// >> configure/mux the pins
at91_set_A_periph(AT91_PIN_PB10, 1); /* TXD */
at91_set_A_periph(AT91_PIN_PB11, 0); /* RXD */
if (pins & ATMEL_UART_RTS)
at91_set_B_periph(AT91_PIN_PC8, 0); /* RTS */
if (pins & ATMEL_UART_CTS)
at91_set_B_periph(AT91_PIN_PC10, 0); /* CTS */
// >> associate the clock
axm_clock_associate("usart3_clk", &pdev->dev, "usart");
// >> et voilà
正如你所看到的
RTS 引脚上的上拉未激活。
只是因为这将是标准
RS232 模式下的行为?
UART 保持沉默直到
操作模式是否明确设置?
最佳答案
初始化后的高 RTS 信号似乎是许多平台上的标准行为。这主要取决于启动例程为接口(interface)预期哪种串行操作模式。
为了防止在运行 Linux 的 ATMEL AT91SAM9260 板上出现 RTS 高电平,您必须在对 91_set_X_periph() 引脚进行多路复用并注册设备之前将 UART 置于正确的模式。
从 Linux Kernel Version 2.6.35 开始,ATMEL serial driver 支持 RS485 模式。在此驱动程序中,在将引脚 (GPIO) 设置为角色之前正确配置了 UART。
对于运行较旧 Linux 版本的嵌入式设备,我使用以下代码行解决了该问题:
/* write control flags */
control |= ATMEL_US_RTSEN;
mode |= ATMEL_US_USMODE_RS485;
UART_PUT(uartbaseaddr, ATMEL_US_CR, control);
UART_PUT(uartbaseaddr, ATMEL_US_MR,mode);
现在引脚可以混合它们的角色
关于linux - UART 初始化 : Prevent UART to pull RTS high,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4956379/