2012年12月01日

UARTの設計(3)

  RS232C の確認用のプログラムを変更しました。

rs232c_5.zip


  修正点は、以下の通りです。

 ・RS232C割り込みベクタのスキップ先アドレスの変更
  mk2だと、変なアドレスに飛ぶため、妙な動きになる時があります。

 ・受信時のエラーを表示
  受信中に一度でもエラーがあると表示されます。

 ・送信時に EMPTY になったかどうかを表示
  送信時にEMPTYになるのは、シリアルデータが途切れた事を意味します。TxEMPTY はエラーフラグではないので、最悪は取り損ないます。

 ・送信時、TxEMPTY になってからデータをセットしていたものを修正

 ・8251のリセットを追加
  ボーレートを変更した時や、間違ったデータを受信した後などはリセットした方が無難です。

 ・ドキュメントを同梱



  このプログラムを使って、PC-6001F mk2 でどこまで送受信(特に受信)が可能かを試しました。

  受信側は 614400bps 、送信側は512000bps(TxEMPTY有なら、768000bps)まで正常に送受信できました。



  どこまで送受信が可能かを算出してみると...


  今のプログラムが1バイト受信するのに掛かる時間が 4MHz で 61クロック分です。送信は、83 クロック分です。

  パリティなし、ストップ1ビットとして、最高ボーレートを計算すると

  受信:4MHz / 61 * (8+1+1) = 655.7 Kbps
  送信:4MHz / 83 * (8+1+1) = 481.9 Kbps

  となり、受信側は結果と合っています。


  送信側は、計算値を超えていますが、多分TxEMPTY を検出できていないと思われます。
 (レジスタ読み込み→次のデータ書き込み、の間に、TxEMPTY が出ているんだと思います)



posted by えすび at 09:58| Comment(3) | FPGA化:RS232C | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
こんばんは。
疑問点があるので質問させてください。
>・送信時、TxEMPTY になってからデータをセットしていたものを修正
ここがよく分かりません。

rs232c.asm を読んでみたのですが、
TxRDY(とDSR)を待った後、in a (80h) で一度空読み?しているのは
TxEMPTYを拾うけれどチェックはしなくて良い、という意味なんでしょうか。
Posted by bookworm at 2013年12月06日 20:49
 ↓8251のマニュアルです。
 http://documentation.renesas.com/doc/DocumentServer/IC-6494D.pdf
 8251 のCMOS化したものですが、機能は同等です。


 で、このマニュアルによると、送信用バッファは2つあります。

 初期状態では、バッファ#1をCPUからの書き込み用、#2をシリアル出力用とすると

 CPUからバッファ#1に書き込む

 →バッファ#1と#2を入れ替える(#1シリアル出力用、#2CPU書き込み用)
 →バッファ#1からシリアルに出力する + CPUからバッファ#2に書き込む(同時進行)。
 →バッファ#1と#2を入れ替える(#1CPU書き込み用、#2シリアル出力用)
 →バッファ#2からシリアルに出力する + CPUからバッファ#1に書き込む(同時進行)。

 という具合に動作します。


 で、TxRDY と TxEMPTY の信号ですが、

 TxEMPTY:バッファ#1、#2の両方にデータが書き込まれていない時に”1”
 TxRDY:バッファ#1、バッファ#2の両方にデータが書き込まれている時に”0”

 です。


 状態の遷移は、

 TxEMPTY=1、TxRDY=1
 ↓CPUからデータを書き込む
 TxEMPTY=0、TxRDY=1
 ↓CPUからデータを書き込む
 TxEMPTY=0、TxRDY=0
 ↓CPUからデータを書き込むと溢れるので、書き込みを停止する。
 TxEMPTY=0、TxRDY=1
 ↓CPUからデータを書き込む

 :

 TxEMPTY=0、TxRDY=1
 ↓
 TxEMPTY=1、TxRDY=1


 という動作になります。


 通常、連続でデータを送信する際は、TxRDY=0かどうかを判断するだけでOKです。このプログラムで、TxEMPTYをチェックしている理由は、CPUの動作が遅いために、書き込みデータが間に合わないケースがあるためです。

 上の状態遷移の例だと、

 TxEMPTY=1、TxRDY=1
 ↓CPUからデータを書き込む
 TxEMPTY=0、TxRDY=1
 ↓CPUからデータを書き込むべきだけど間に合わない
 TxEMPTY=1、TxRDY=1
 ↓CPUからデータを書き込む
 TxEMPTY=0、TxRDY=1
 ↓CPUからデータを書き込むべきだけど間に合わない

 という事が発生します。


 非同期通信なので、バイト単位でデータが途切れても受信自体は出来ますが、パフォーマンスは落ちます。エラーとかが発生しないので、想定していたパフォーマンスが出ているかどうかが分かり難いので、送信側の方でチェックを掛けているわけです。


 質問の回答になっていないかも知れませんが...

Posted by えすび at 2013年12月06日 21:23
>エラーとかが発生しないので、想定していたパフォーマンスが出ているか
>どうかが分かり難いので、送信側の方でチェックを掛けているわけです。

納得しました。
送信の手続きに必要な動作なのかとちょっと悩んでしまっていました。

参考にした資料にはTxEMPTYは「送信完了で1」となっていたので、そういう理解でした。
やはり原本にも当たる必要ありますね。
詳しい説明どうもありがとうございました。
Posted by Bookworm at 2013年12月06日 22:09
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。