4

Linux で ARM AT91SAM9260 ボード用の RS485 ドライバーを作成しています。

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 が沈黙を保つことがより良い標準ではないでしょうか?

4

1 に答える 1

3

初期化後の高い RTS シグナルは、多くのプラットフォームでの標準的な動作のようです。これは、スタートアップ ルーチンがインターフェイスに対して想定するシリアル動作モードに大きく依存します。

Linux を実行している ATMEL AT91SAM9260 ボードで RTS-high を防ぐには、at91_set_X_periph() ピンを多重化し、デバイスを登録する前に、UART を正しいモードにする必要があります。

Linux カーネル バージョン 2.6.35 以降、ATMEL シリアル ドライバーは 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);

于 2011-03-07T09:52:57.567 に答える