【问题标题】:UART initialisation: Prevent UART to pull RTS highUART 初始化:防止 UART 将 RTS 拉高
【发布时间】:2011-06-24 18:59:01
【问题描述】:

我正在为 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_set_B_periph(AT91_PIN_PC8, 0);

RTS 引脚上的上拉电阻未激活。

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

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

【问题讨论】:

    标签: linux serial-port arm uart


    【解决方案1】:

    初始化后的高 RTS 信号似乎是许多平台上的标准行为。这在很大程度上取决于启动例程为接口预期的串行操作模式。

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

    自 Linux Kernel Version 2.6.35 起,ATMEL serial driver 支持 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);
    

    现在可以复用 Pins 的角色

    at91_set_X_periph(RTS_PIN, 0);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 2016-07-09
      • 2013-03-28
      相关资源
      最近更新 更多