2011-02-10 3 views
4

Я пишу драйвер RS485 для платы ARM AT91SAM9260 на Linux.Инициализация UART: предотвращение UART для вытягивания RTS high

Когда я инициализирую UART, сигнальная линия RTS становится высокой (1). Я предполагаю, что это будет и должно быть стандартным поведением в режиме работы RS232. Однако в режиме RS485 это не требуется.

Я использую стандартные функции, предусмотренные секцией арматурной арки для инициализации 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?

  • Не было бы лучше стандарт для УАПП молчать, пока режим работы
    явно установлена?

ответ

3

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

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

С Linux Kernel версии 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); 

Теперь штыри могут быть мультиплексирование их роль

at91_set_X_periph (RTS_PIN, 0);