ムライボックス (5) --- エコノミー版 (3)

前回述べた、「時間窓」に必要とされるゲート信号のタイミングを得る方法として、

  • 送信 UART の送信シフトレジスタ・エンプティ/送信完了フラグをポーリング、あるいは割り込みを利用
  • 別の受信 UART を接続して受信完了割り込みを利用
  • ピン変化外部割込みおよびタイマ割り込みを利用

などが考えられます。
まず、送信シフトレジスタ・エンプティ/送信完了フラグ (以降「送信完了フラグ」と略記) の挙動を、これまで使用したことのある各社の UART について調べた結果をまとめた表を下に示します。

メーカー バイス
/シリーズ
送信完了
フラグ名
送信完了
割り込み
発生時期 次スタート
ビット開始位置
Atmel ATmega TXC0  Ο ストップビット
終端
次のボーレート
クロックエッジ
Microchip PIC16F TRMT  × ストップビット
終端
次のビット位置
STMicro STM32F TC  Ο ストップビット
中央
次のビット位置
NXP LPC111x TEMT  × ストップビット
中央
次のビット位置
Cypress PSoC4
SCB
(*1)  Ο ストップビット
中央
次の1/2ビット
位置
Cypress PSoC4
PSoc5LP
UDB
(*2)  Ο ストップビット
終端
次のボーレート
クロックエッジ

注:(*1)=SCB0_UART_DONE、 (*2)=UART_TX_STS_COMPLETE
PSoC4 / PSoC5LP については、送信完了フラグの名称が長すぎるので、注として欄外に表示してあります。
「発生時期」の欄は、送信完了フラグが立つタイミングがストップ・ビットの終了時点、つまり該当送信フレームが完全に終了してからなのか、ストップ・ビットの中央 (付近) なのかということを表しています。
「次のスタートビット開始位置」は、完全に送信完了して送信 UART がアイドル状態になった直後に送信バッファ・レジスタに送信データを書き込んだ場合、次の送信フレームのスタート・ビットがいつ開始するかということです。
「次のビット位置」は、すぐには送信は開始せず、アイドル状態が 1 ビット・タイム持続した後にスタート・ビットが開始するものです。
タイミングの例を下に示します。

CPU とのバスインターフェース部分を除く大部分の UART のロジック部分には、多くの場合にボーレートの 16 倍のクロックが供給されています。
16 倍のクロックでは図が細かくなりすぎるので、8 倍として表示してあります。
「UART_TX」信号が UART 送信信号です。
「TXC」が送信完了フラグであり、ストップ・ビットが終了してアイドル状態に移行すると発生します。
これを受けて、CPU が送信バッファ・レジスタ (Transmit Holding Register) に送信データを書き込むのを「THR WRITE」の波形で表現しています。
この場合、送信データが書き込まれてもすぐには次の送信は開始せず、アイドル状態が 1 ビット・タイム持続した後にスタート・ビットが開始します。
結局、ストップ・ビットが 2 ビットになったのと同様のタイミングになります。
上の表で「次のボーレートクロックエッジ」となっているのは、送信データの書き込みを 16 倍ボーレート・クロックで検出して次のキャラクタ送信に入ることを示しています。
その場合のタイミング・チャートを下に示します。

次の「ビット位置」まで待たずに、16 倍 (図では 8 倍) ボーレート・クロックで可能な限り早いタイミングで次のキャラクタ送信へ移行しています。
いずれの場合でも、ストップ・ビットの途中、つまり送信が完全に終了する前に次の送信データが送信バッファ・レジスタに書き込まれた場合には、余分なアイドル状態が挿入されることなく、ストップ・ビットとスタート・ビットが隣接した状態で送信されます。
したがって、ストップ・ビット中央付近で送信完了フラグが立ち、それを検出した後、ストップ・ビットが終了するまでの間に送信データを書き込み終えることができれば無駄がありません。
送信完了割り込み可能ならばさらに好都合なので、その点からいくと、上の表の中では STM32F シリーズと、PSoC4 SCB が優れています。
ストップ・ビット終端でフラグが立つデバイスの中では、送信完了割り込み可能な ATmega シリーズ (ATtiny2313 / ATtiny4313 を含む) と、PSoC4 / PSoC5LP の UDB 上にインプリメントした UART とが有利です。
PIC16F シリーズの UART は「ストップ・ビット終端/割り込みなし/次のビット位置」と最も成績が悪いのですが、実際に試したみたところ、実用上問題はありませんでした。

もし余分な UART があるなら送信 UART のフラグを使わずに、その受信 UART を利用することもできます。
送信 UART の出力を受信 UART の入力に接続して、UART 出力を「モニタ」する形にすれば、その受信完了割り込みはタイミング検出に求められる

  • ストップ・ビット中央付近でのフラグ発生
  • フラグによる割り込み発生

という条件を満たします。
受信したデータは捨てて、割り込みのタイミングだけを利用します。
この方法は UART が余っていないと実現できませんが、内蔵タイマなどを使って

  • ピン入力の立ち下りエッジで割り込み
  • その割り込みハンドラでタイマ起動
  • 9.5 ビット・タイム後に割り込み

で UART 動作を「エミュレート」することで受信完了割り込み相当のタイミングを得ることができます。 ただし、安定した動作をさせるには手間がかかるかも知れません。