Инициализация UART: предотвратить UART, чтобы поднять RTS высоко

Я пишу драйвер RS485 для платы ARM AT91SAM9260 в Linux.

Когда я инициализирую 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 хранить молчание до
    режим работы явно установлен?

1 ответ

Решение

Высокий сигнал RTS после инициализации кажется стандартным поведением на многих платформах. Это зависит от того, какой последовательный режим работы ожидает интерфейс запуска.

Чтобы предотвратить RTS-high на плате ATMEL AT91SAM9260, работающей под управлением Linux, вы должны перевести UART в правильный режим ПЕРЕД муксированием at91_set_X_periph() контактов и зарегистрировать устройство.

Начиная с версии ядра Linux 2.6.35, последовательный драйвер ATMEL поддерживает режим RS485. В этом драйвере UART правильно настроен перед установкой роли Pins (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_set_X_periph(RTS_PIN, 0);

Другие вопросы по тегам