2011-02-10 5 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 모드에서 표준 동작일까요?

  • IT는
    동작 모드를 명시 적으로 설정 될 때까지 UART를위한 더 나은 표준 침묵을 유지하지 않을까요 ?

답변

3

초기화 후 높은 RTS 신호는 많은 플랫폼에서 표준 동작으로 보입니다. 맨 처음 시작 루틴이 인터페이스에 대해 예상하는 직렬 작동 모드에 따라 다릅니다.

Linux를 실행하는 ATMEL AT91SAM9260 보드에서 RTS-high를 방지하려면 핀을 muxing하고 장치를 등록하기 전에 UART를 올바른 모드로 설정해야합니다.

리눅스 커널 버전 2.6.35 이후 ATMEL serial driver은 RS485 모드를 지원합니다. 이 드라이버에서 핀 (GPIO)을 거기에 설정하기 전에 UART가 올바르게 구성되었습니다. 이제

/* 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);