要約:非同期UART (シリアルポート)は、多くのマイクロコントローラでよく使われており、2つのデバイスがシステムクロックレートを一致させることなく簡単に通信することができる方法です。このアプリケーションノートでは、2つの標準的なポートピンを使用してMAXQ3210マイクロコントローラに10ビットの非同期UARTをソフトウェアで実装する方法について説明します。この簡単な変更によって、シリアルポートは、RS-232およびRS-485のネットワークを経由して通信することができるようになり、あるいはPCのCOMポートに接続することができるようになります。
概要
標準的な非同期UARTすなわちシリアルポートは、多くのマイクロプロセッサおよびマイクロコントローラにおける一般的な機能です。非同期シリアルポートは、2つのマイクロコントローラ(またはマイクロコントローラとスレーブシリアルデバイス)がシステムのクロックレートを一致させることなく簡単に通信することができる方法です。適切な電圧レベルシフタを追加することによって、シリアルポートを使用して、RS-232およびRS-485のネットワークを経由して通信することができるようになり、あるいはPCのCOMポートに接続することができるようになります。フルデュープレックスのインタフェースを実装するのに必要なものは、2つの信号ライン(RXとTX)のみです。シリアルリンクの両側のデバイスが同じ電圧レベル、ビット形式、およびボーレートを使用する場合、デバイスは、お互いについて他に何も知らなくても、データを正常に転送することができます。
このアプリケーションノートでは、一般的な10ビット非同期シリアルポートのソフトウェア実装について説明します。ハードウェアのシリアルポートを搭載していない低電力のMAXQ3210マイクロコントローラが、ここでの例で示すように機能します。これらのデバイスのハードウェアベースのシリアルポートが特定のアプリケーションにとって不十分である場合、ここで示した手法を使用して、MAXQ2000のようなMAXQ®マイクロコントローラに1つまたは複数のシリアルポートを追加することも可能です。
ソフトウェアUARTの利点
多くのマイクロコントローラにハードウェアのシリアルポートが備わっているのに、なぜわざわざマイクロコントローラのポートピンを使用してソフトウェアでUARTを実装するのかと思われるかもしれませんが、それにはいくつかの理由があります。
多くのマイクロコントローラはハードウェアでUARTを実装していますが、そうでないものも多くあります。あるシステム設計でマイクロコントローラを選択するとき、すべての設計要件に最適なものを見つけることは困難です。必要な周辺機器をソフトウェアで実装することによってマイクロコントローラの機能の不足を補うことができるため、ある特定の設計に使えるマイクロコントローラの数が増大します。デバイスの選択範囲が増えると、設計の柔軟性が向上します。
マイクロコントローラには、極めて優れたハードウェアUARTを装備することができますが、アプリケーションを設計するにはそれだけでは不十分です。おそらくマイクロコントローラは、わずかに変更されたバージョンのシリアルプロトコルで動作する周辺機器とも通信する必要があります。またおそらく、ハードウェアUARTに設けられたビット数、パリティチェック機能、または入出力バッファは、アプリケーション要件に厳密には適合しないと思われます。ソフトウェアUARTを構築することによって、設計者はより柔軟にUART機能およびシリアルプロトコルの詳細を定義することができます。
マイクロコントローラは、アプリケーションに理想的なハードウェアのUARTを設けることが可能ですが、それだけでは不十分です。ただ単にシリアルポートの数を増やすためにのみ新しいチップを追加で設計するのですか?この新しいUARTは、ソフトウェアでマイクロコントローラの既存のUARTの性能と機能に匹敵する新たなUARTを簡単に追加することができます。
ソフトウェアのUARTがメインアプリケーションから帯域幅をどの程度消費するのかを考慮することも重要です。ハードウェアでUART (または他のシリアル通信の周辺機器)を実装する主な理由が、マイクロコントローラをシリアルプロトコルの低レベルな細部のタスクから解放することであることに多くの人は同意することでしょう。実際、この理由で、単調なビットサンプリング、タイムスロットのカウント、および入力と出力のビットシフトは、すべてハードウェアで処理されています。また、この理由で、UARTは、キャラクタを受信しているか、またはキャラクタを送信し終えたかをメインマイクロコントローラに(割込みまたは他のインジケータフラグによって)通知します。その後、直ちにマイクロコントローラは、UARTバッファからデータをロードまたはアンロードして、コアタスクに復帰することが可能です。
簡単に言えば、ソフトウェアUARTを実装することによって、アプリケーションがシリアル動作のポートピンを監視する間に、そこでかなりの時間を費やすことになった場合、ソフトウェアでUARTを実装する価値はないでしょう。
しかし、ソフトウェアでUARTを実装することによって、マイクロコントローラの重要な時間とリソースを消費することはありません。1つのキャラクタを送受信するときの標準的な10ビット非同期シリアルプロトコル(1スタートビット、1ストップビット、8データビット)について考えてみましょう(図1)。

図1. 10ビット非同期シリアルプロトコルの送信波形と受信波形
送信または受信動作がいったん開始すれば、シリアルUART (ソフトウェアまたはハードウェア形態のいずれも)は、I/Oラインを継続的にモニタする必要はありません。キャラクタを送信するとき、UARTに必要なことは、ビット周期ごとに送信ラインの状態を一度だけ駆動することです。つまりUARTは、スタートビットから8データビットを経てストップビットまで順番に各ビットのレベルを設定します。キャラクタを受信すると、UARTは最初の立下りエッジで動作を開始します。このポイントの後、UARTは、各ビットのタイムスロットの真ん中でビット当り少なくとも1回、受信ライン状態をサンプリングするだけです。
ソフトウェアUARTの機能の仕組み
ソフトウェアUARTの要求する動作は、1対のステートマシン、すなわち、1つのキャラクタ送信専用マシン、および1つのキャラクタ受信専用マシンとして表すことができます。フルデュープレックスUARTの場合、両方のステートマシンが並行して動作するため、2つの独立したタイマ割込みが必要です。どちらのステートマシンにも、アクティブと非アクティブのモードがあります。「送信」のステートマシンは、送信するキャラクタが与えられるとアイドル状態から移行し、ストップビットの送信後にアイドル状態に復帰します。「受信」のステートマシンは、受信ラインに立下りエッジを検出するとアイドル状態から移行します。受信のステートマシンがこの最初のロー状態(スタートビットが開始したことを示します)を確認すると、そのビットのタイムスロットを数え始め、必要に応じてビット(ストップビットを含む)ごとにラインをサンプリングします。
メインアプリケーションの時間を必要最小限だけ使うようにするため、UARTステートマシンは、周期的なタイマベースの割込みによって起動する必要があります。受信ラインの最初の立下りエッジ検出は、外部のエッジトリガの割込みによって別個に処理されます。ステートマシンのタイマがビット周期ごとに割込みを開始するよう設定されている場合、ステートマシンは、割込みがトリガされるたびに必要な動作を実行する(また、必要に応じて次のステートに進む)ことが可能です。ステートマシンの実装に必要なコードは、できる限り最適化する必要があります。ソフトウェアUARTがアクティブのときは必ずバックグラウンドで継続してコードが実行されるからです。
MAXQ3210について
このUARTの機能を実行するのに必要な処理能力を把握するために、MAXQ3210マイクロコントローラに実装されたソフトウェアUARTについて考えてみます。この5V、28ピンのマイクロコントローラは約3.57MIPSで動作し、15のポートピンが含まれていますが、UARTは内蔵されていません。更に、MAXQ3210には、その他の設計要件も含まれます。すなわち、送信と受信のステートマシンの割込みを生成することが可能な周期タイマ、および受信ラインの立下りエッジを検出するための外部割込みです。MAXQ3210には1つの汎用タイマしかないため、ソフトウェアUARTはハーフデュープレックス実装となります。つまり、キャラクタは同時ではなく別々の時刻にのみ送信または受信することができるということです。ただし、多くの通信および制御のプロトコルにとって、このハーフデュープレックス動作は問題にはなりません。
MAXQ3210の受信および送信ステートマシンは、モードを設定してキャラクタをロードおよびアンロードするためのサポートルーチンと合わせて、命令合計数が171のワードで実装することが可能です。たとえば、送信ステートマシンには、以下に示すように、3つのステート(データビット、ストップビット、およびアイドル復帰)だけが必要です。
intTX_bit:
move GRH, PSF
move GRL, AP
move T2CNB.3, #0 ; Clear timer 2 overflow flag
move AP, #5
rrc ; Start with least significant bit
jump C, intTX_bit_one
intTX_bit_zero:
move TXDO, #0
jump intTX_bit_next
intTX_bit_one:
move TXDO, #1
jump intTX_bit_next
intTX_bit_next:
djnz LC[1], intTX_bit_done
move IV, #intTX_stop
intTX_bit_done:
move AP, GRL
move PSF, GRH
reti
intTX_stop:
move T2CNB.3, #0 ; Clear timer 2 overflow flag
move TXDO, #1 ; Float high
move IV, #intTX_idle
reti
intTX_idle:
move A[4], #SER_MODE_TX_IDLE
move T2CNB.3, #0 ; Clear timer 2 overflow flag
move T2CNA.7, #0 ; Disable timer 2 interrupts
move T2CNA.3, #0 ; Stop timer
reti
このアプリケーションノートの全コードは、ダウンロードで入手することができます(ZIP、5.6kB)。
いずれのステートについてもワーストケースの割込み処理コードは、19の命令サイクルです。表1は、ボーレートに応じたワーストケースの帯域幅の推定値を示しています。キャラクタが連続して送信または受信されるときにのみ、ワーストケースの帯域幅が適用されることに留意してください。キャラクタの送信を完了すれば、UARTはシャットダウンするため、次のキャラクタ送信が開始されるまで割込みなしで、メインアプリケーションを動作させることができます。
表1. MAXQ3210のUART実装に必要な帯域幅
| Baud Rate |
Cycles per Timer Tick (at 3.57MHz) |
Worst-Case Interrupt Cycle Count |
Bandwidth Used by UART (%) |
| 9600 |
372 |
19 |
5 |
| 19200 |
186 |
19 |
10 |
| 28800 |
124 |
19 |
15 |
| 57600 |
62 |
19 |
31 |
結論
このアプリケーションノートでは、2つの標準的なポートピンを使用してソフトウェアで10ビット非同期UARTを実装することがいかに簡単であるかを示しています。この手法を使用して、マイクロコントローラに空いたポートピンが十分にある限り、SPI™からSMBus™、さらにはI²Cに至るまで、あらゆるタイプのシリアル周辺機器を実装することができます。
このテストケースでは、コアの処理リソースにほとんど影響しない、比較的低速のMAXQ3210マイクロコントローラを使用しています。MAXQ2000のような高速のマイクロコントローラや高速の8051互換デバイスは、メインアプリケーションから帯域幅を過剰に使うことなく、ハーフデュープレックスまたはフルデュープレックスモードの、1つまたは複数のUART (またはより一層複雑なシリアル通信周辺機器)をソフトウェアで実装することができます。最後に、ソフトウェアで通信周辺機器を実装することで、他のデバイスや進化する規格の変化に合わせてプロトコルのあらゆる側面を更新することが可能です。ソフトウェアでUARTを実装することによって、設計者は、極めて柔軟にそして迅速に新しい設計を開始することができるようになります。
同様の記事がEmbedded Systems Design誌の2007年2月号のオンライン版に掲載されています。
MAXQはMaxim Integrated Products, Inc.の登録商標です。

SMBusはIntel Corp.の商標です。

SPIはMotorola, Inc.の商標です。

| 関連製品 | |
APP 4041: Oct 16, 2007
|
|
|
自動アップデート
お客様が関心のある分野でアプリケーションノートが新規に掲載された際に自動通知Eメールの受信を希望する場合は、EE-Mail™にご登録ください。
フィードバックをお寄せください。 内容に満足されましたか、あるいは満足されていませんか?もっと良いページにできると思いますか?あるいは、単なるコメントでも結構です。フィードバックをお待ちしています。—マキシムはお客様からいただく訂正、提案を元に改善していきます。
このページを評価し、フィードバックを送信する。
|