UART initialisation: Prevent UART to pull RTS high

你说的曾经没有我的故事 提交于 2019-12-12 12:07:09

问题


I'm writing a RS485 driver for an ARM AT91SAM9260 board on Linux.

When I initialise the UART, the RTS signal line gets high (1). I guess this would and should be the standard behaviour in RS232 operation mode. In RS485 mode however this is not wanted.

I'm using the standard functions provided by the arm-arch section to initialise the UART. Therefore the significant steps are:

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à

As you can see with

at91_set_B_periph(AT91_PIN_PC8, 0);

the pull-up on the RTS pin isn't activated.

  • Why does the UART set the RTS high? Just because this would be the standard behaviour in RS232 mode?

  • Wouldn't it be a better standard for the UART to keep silent till the
    operation mode is explicitly set?


回答1:


A high RTS signal after initialisation seems to be the standard behaviour on many platforms. It manly depends which serial operation mode the start-up routines anticipates for the interface.

To prevent RTS-high on a ATMEL AT91SAM9260 board running Linux, you have to put the UART into the right mode BEFORE muxing at91_set_X_periph() the Pins and register the device.

Since Linux Kernel Version 2.6.35, the ATMEL serial driver supports the RS485 mode. In this driver the UART is properly configured before setting the Pins (GPIO) to there role.

For my embedded device which is running an older Linux version, I solved the problem with the following line of codes:

/* 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);

Now the Pins can be muxed the their role

at91_set_X_periph(RTS_PIN, 0);



来源:https://stackoverflow.com/questions/4956379/uart-initialisation-prevent-uart-to-pull-rts-high

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!