2011-02-10 54 views
4

我正在爲Linux上的ARM AT91SAM9260開發板編寫RS485驅動程序。UART初始化:阻止UART將RTS拉高

當我初始化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一個更好的標準保持沉默?

回答

3

初始化後的高RTS信號似乎是許多平臺上的標準行爲。它很大程度上取決於啓動程序預期接口的串行操作模式。

爲防止運行Linux的ATMEL AT91SAM9260板上的RTS爲高電平,必須在將多個引腳複用at91_set_X_periph()之前將UART置於正確模式並註冊器件。

自Linux Kernel版本2.6.35開始,ATMEL serial driver支持RS485模式。在將該引腳(GPIO)設置爲該角色之前,在該驅動程序中正確配置了UART。

對於其運行的是老版本的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);