USART完全ガイド:仕組み・設定・実装・トラブルシューティングまで(深掘りコラム)

はじめに:USARTとは何か

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)は、シリアル通信インターフェースの一種で、同期式および非同期式の両方の動作モードをサポートするハードウェアコンポーネントです。組み込み機器やマイコン、通信モジュール間で広く利用されており、UART(Universal Asynchronous Receiver/Transmitter)と用語が混在して使われることがよくあります。本稿ではUSARTの内部動作、信号の構造、エラー要因、フロー制御、ハードウェア実装・設定例、デバッグ手法、設計上の注意点までを丁寧に深掘りします。

基本的な信号構造とフレーミング

非同期通信(UART/USARTの非同期モード)では、データは次のようなフレームで送られます。

  • スタートビット:1ビット(論理0)でフレーム開始を示す
  • データビット:通常5〜9ビット。多くの実装で8ビットが標準
  • パリティビット:オプション(None、Even、Oddなど)
  • ストップビット:1、1.5、2ビットなど(論理1)

送信はLSBファーストが一般的で、各ビットは事前に合意したボーレート(bps)で送られます。受信側はスタートビット検出後、ビット中心でサンプリングしてデータを復元します。典型的なサンプリングはボーレートの16倍(oversampling×16)ですが、8倍やその他の比率を使う実装もあります。サンプリングはビット中間点で行うことでジッタに対する許容性を高めます。

同期モードと非同期モードの違い

USARTの特長は同期(Synchronous)と非同期(Asynchronous)両方に対応できる点です。

  • 非同期モード:上記のフレーミングを用いる。クロック信号は別送しないため、双方がボーレートを事前に一致させる必要がある。
  • 同期モード:クロック線(例:SCK)を同時に送信して、ビットごとの同期を取る。同期モードは誤差許容が小さく、フレーム同期が容易なため高速や長連続データに向く。

同期モードはSPIに似た使われ方をすることがあり、USARTにクロック出力機能があるマイコンではSPI代替として利用可能です。

ボーレート生成とクロック精度

正確なボーレート生成は通信の成功に直結します。多くのマイコンは内部クロックと分周器(整数・分数)でボーレートを生成します。代表的な注意点:

  • クロック精度:発振器(内蔵RC、外部クリスタル、PLL)の精度が重要。誤差率(例えば±2%)が大きいと通信エラーが増える。
  • 分周の丸め誤差:整数分周のみだと希望ボーレートに微妙にずれるケースがあり、分数分周やブレイクダウンが可能なUSARTはより柔軟。
  • オーバーサンプリング:16×や8×を使うと許容誤差が変わる。たとえば双方が16×でないと互換性が落ちる実装もある。

エラーの種類と原因

USART通信でよく発生するエラーは次の通りです。

  • フレーミングエラー:受信した停止ビットが期待される論理1にならない場合。ボーレート不一致やラインがノイズで破壊されると発生。
  • パリティエラー:パリティ検査に失敗した場合。通信データ破損の指標。
  • オーバランエラー:受信FIFOやレジスタを読み出す前に新しいデータが上書きされると発生。割り込み処理やDMAでの処理遅延が原因。
  • ノイズ検出:物理ラインの短時間のスパイクや電磁ノイズで誤検出される。

これらのエラーを監視し、必要に応じて再送やリンクリセットを行う設計が重要です。

フロー制御(ハード/ソフト)

フロー制御は送り手と受け手のバッファ管理のために必要です。

  • ハードウェアフロー制御(RTS/CTS):受信側がRTSで送信側に「受け取れる/受け取れない」を通知。低レベルで信頼性が高い。
  • ソフトウェアフロー制御(XON/XOFF):制御文字(XOFF=0x13, XON=0x11)で停止/再開を指示。ラインがテキストベースで使えるが制御文字を送るデータと衝突する場合がある。

物理層と電圧レベル

USART自体は論理信号のフォーマットを定めますが、物理インターフェースは別途定義されます。

  • TTL/CMOSレベル:マイコン間の直接接続で一般的(3.3V/5V)。レベルシフタに注意。
  • RS-232:±3〜±12Vなどの電圧レベルで長距離やPCシリアルに使われる。一方向では論理が反転する点に注意。
  • RS-485:差動信号で半二重や全二重に対応。産業用途でノイズ耐性と長距離に強い。

物理層変換にはトランシーバ(MAX232など)や差動ドライバが必要です。

ハードウェア実装:FIFO、割り込み、DMA

現代のUSARTハードは高機能で、次のような要素を持ちます。

  • 送受信FIFO:複数バイトをバッファし、CPU割り込み頻度を下げる。FIFOサイズは8〜512バイト等、実装差あり。
  • 割り込みとステータスフラグ:データ受信、送信完了、エラーなどで割り込みを発生させる。割り込みの優先度とハンドラの遅延を考慮する。
  • DMA連携:大量データをCPU介さずに送受信できるため高スループット向き。リングバッファやメモリ整列に注意。

組み込みでの実際の設定例(概念)

ここでは一般的な設定項目を列挙します。具体的なレジスタ名や手順はマイコンで異なります。

  • ボーレート(例えば115200bps)
  • データ長(8ビットが標準)
  • パリティ(None/Even/Odd)
  • ストップビット数(1/1.5/2)
  • フロー制御(None/RTS-CTS/XON-XOFF)
  • 割り込み有効化(RXNE、TXE、ERRORなど)またはDMA設定

実例:STM32系ではUSARTのBRRレジスタで分周比を設定し、CR1/CR2でデータ幅・パリティ・ストップビットを設定します。AVR系ではUBRRレジスタでボーレート、UCSRB/UCSRCで制御を行います。Linuxではtermios APIでボーレートやパリティを設定し、デバイス名はttyS*やttyUSB*となります。

デバッグと測定手法

USARTトラブルの解析には次のツールと方法が有効です。

  • ロジックアナライザ:各ビットタイミングを可視化し、ボーレート誤差やフレーミング欠損を検出。
  • オシロスコープ:物理レベルの電圧波形を確認してリフレクションやノイズ、電圧欠損を調査。
  • シリアルターミナル(minicom、PuTTY、screen):端末から通信テスト、エコーバック、制御文字の挙動確認。
  • ループバックテスト:TXとRXを短絡し、物理層以外の問題を切り分け。

最適化と高信頼化テクニック

実運用での信頼性向上やパフォーマンス最適化のポイント:

  • ボーレートの余裕を与える:相手方と共に誤差許容を確認し、内部クロックの安定化(外付クリスタル)を検討。
  • DMA+大きめFIFOを活用:CPU負荷を下げ、連続データ転送の安定性を確保。
  • CRCや上位プロトコルでの整合性チェック:単純なパリティでは不十分な場合があるため、CRCやシーケンス番号で再送を実装。
  • 物理層のアイソレーション:長距離やノイズの多い環境では差動(RS-485)やトランシーバのアイソレーションを行う。

設計上の注意点とよくある陥穽

設計や実装で見落としがちな点:

  • 電圧レベルの不整合:3.3Vと5Vのまま直接接続すると片方が破壊されることがある。必ずレベルシフタを使う。
  • 割り込み処理の遅れによるオーバラン:割り込み優先度や処理時間を見直す。DMAやRTOSの使用も検討。
  • フロー制御の未採用:速度が速くバッファが小さい状況ではフロー制御が必須。
  • クロック精度の見落とし:内蔵RC発振のままでは安定通信が難しいケースがある。外付けクリスタル/発振器を推奨。

セキュリティと近代的な置き換え

USARTは単純で効率が良い反面、暗号化や認証の仕組みを持たないため、機密性が必要な通信には上位レイヤで暗号化(TLS相当)を行うか、別プロトコルへ移行する必要があります。近年はUSB CDC、CAN FD、Ethernetなどの代替手段も増えていますが、シンプルさや遅延の少なさからUSARTは依然として組み込みで有力な選択肢です。

まとめ:USARTを設計で活かすために

USARTは基本を押さえれば強力で使いやすい通信手段です。重要なのはボーレートとクロック精度、物理層の整合、エラーとフロー制御の設計、そして割り込み/DMAを含むバッファ処理の適切な構築です。デバッグにはロジックアナライザやオシロスコープが不可欠であり、設計段階でこれらを想定した配線やテスト治具の準備を行うことが成功の鍵となります。

参考文献