Linux UART初始化:防止UART拉高RTS

Linux UART初始化:防止UART拉高RTS,linux,serial-port,arm,uart,Linux,Serial Port,Arm,Uart,我正在为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: // >>

我正在为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à
正如你所看到的

at91引脚PC8,0

RTS引脚上的上拉未激活

  • 为什么UART将RTS设置为高? 就因为这是标准 RS232模式下的行为

  • 这不是一个更好的标准吗 UART将保持沉默,直到 是否明确设置了操作模式


初始化后的高RTS信号似乎是许多平台上的标准行为。它主要取决于启动程序预期的接口串行操作模式

为了防止运行Linux的ATMEL AT91SAM9260板上出现RTS高电平,在将at91_set_X_periph()引脚多路复用并注册设备之前,必须将UART置于正确的模式

自Linux内核版本2.6.35以来,支持RS485模式。在该驱动程序中,UART在将引脚(GPIO)设置为该角色之前已正确配置

对于运行较旧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);
现在,可以将管脚与它们的角色混合

at91_设置_X_外围(RTS_引脚,0)