Инициализация UART: предотвратить UART, чтобы поднять RTS высоко - PullRequest
4 голосов
/ 10 февраля 2011

Я пишу драйвер 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 Ответ

3 голосов
/ 07 марта 2011

Высокий сигнал 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);

...