Инициализация 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);