UART(シリアルインターフェース)の活用

4.1. UARTとは

UARTは「Universal Asynchronous Receiver/Transmitter」の略で、主に機器間の通信に用いられる通信方式です。 [5]

一般的な接続方法を下図に示します。 なお、Armadillo-640では、CON3/4のRS232C、CON9/CON11のUARTバスを使用してPCや別のデバイスと通信できます。

images/bus_structures/uart.svg

図4.1 UARTの接続方法


信号線はTX(送信)を相手のRX(受信)に接続します。

UARTの主な特徴を以下に示します。

  • 各デバイスは対等
  • 1対1の通信
  • 信号線は送受信の2本
  • 9600bpsと115200bpsが標準(最高1Mbps程度)

信頼性の高い通信のため、通信相手の受信可否に合わせて送信できる構成にすることがあります。
これをフロー制御といい、ハードウェアフロー制御では主にRTS/CTSを使用してフロー制御を行います。

images/bus_structures/uart_hwfc.svg

図4.2 ハードウェアフロー制御の接続方法


簡単な回路でRS-232Cに変換しPC等と通信することもできます。

images/bus_structures/uart_rs232.svg

図4.3 RS232Cへの変換


UARTではボーレート[6]等に様々なバリエーションがあり、主に以下の設定を通信相手と合わせる必要があります。 よく選択される設定を強調で示します。

  • ボーレート : 4800, 9600, 19200, 38400, 115200
  • データビット数 : 7, 8, 9
  • ストップビット数 : 1, 1.5, 2
  • パリティビット : なし, Odd, Even
  • フロー制御 : なし, ハードウェア, ソフトウェア

UARTの波形は以下のようになっています。 I2CやSPIと異なり、LSBから送信されることに注意してください。 ハードウェアフロー制御を行う場合、送信側はCTSがHのときに送信を開始しません。

images/waveforms/uart.svg

図4.4 UARTプロトコル(データビット数8、ストップビット数1、パリティビットなし)


4.2. コンソールに使用するUARTを変更する

Armadillo-640は、標準状態でUART1(CON9)をコンソールとして使用します。 コンソールには、起動ログやカーネルメッセージなどが出力されるため、標準の設定ではUART1で使用しているピンに外部機器を接続して使用するといったことはできません。 ここでは、コンソールとして別のシリアルインターフェースを使用する方法について説明します。 例として、コンソールをUART3(CON3もしくはCON4)に変更します。

シリアルインターフェースとデバイスファイルの対応は、「Armadillo-640 製品マニュアル」の「Linux カーネル仕様」章「UART」項を参照してください。

「Armadillo入門編」の「起動の仕組み」でも説明したように、コンソールに文字を表示するプログラムには、ブートローダー(u-boot)、Linuxカーネル、ユーザーランドアプリケーションプログラムの3種類があります。

4.2.1. ブートローダーのコンソールに使用するUARTを変更する

ブートローダーでUART3をコンソールとして使うためにブートローダーコンフィギュレーションを変更してビルドを行います。

まず、Armadillo-640のデフォルトコンフィギュレーションを適用します。 以下のコマンドを実行してください。

[ATDE ~]$ cd u-boot-a600-v2018.03-at[version]
[ATDE ~/u-boot-a600-v2018.03-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- armadillo-640_defconfig

図4.5 デフォルトコンフィギュレーション適用


次に、コンソールとしてUART3を利用するようブートローダーのコンフィギュレーションを変更します。

以下のコマンドを実行し、「ARM architecture」→「Console UART select」で「UART3」を選択してください。

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

図4.6 menuconfigの実行


ARM architecture ->
  Console UART select (UART1) --->
  () UART1
  (X) UART3 <-を選択

図4.7 menuconfig


コンフィギュレーションの変更後、ブートローダーをビルドしてください。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

図4.8 ブートローダーをビルド


[armadillo ~]# ls u-boot.imx
u-boot.imx
[armadillo ~]# dd if=u-boot.imx of=/dev/mmcblk0 bs=1k seek=1 conv=fsync

図4.9 ブートローダーイメージ書き換え


[armadillo ~]# reboot

図4.10 再起動


4.2.2. Linuxのコンソールに使用するUARTを変更する

u-boot-a600-v2018.03-at3以降では、環境変数 optargs に設定されたパラメータがブートパラメータとしてLinuxカーネルに渡されます。

LinuxでUART3をコンソールとして使用するには、optargsに console=ttymxc2,115200を設定します。

=> editenv optargs
edit: console=ttymxc2,115200
=> printenv optargs
optargs=console=ttymxc2,115200
=> saveenv
Saving Environment to MMC... Writing to MMC(0)... OK  ←OKが出る

図4.11 ブートパラメータの設定




[5] 正確には「UART」は調歩同期方式通信を行うための回路を指しますが、その通信方式を指している場合が多いです。

[6] デジタルデータを変調・復調する速さ