現在地

8251 USART


カテゴリー:

今回は80系の同期/非同期シリアル通信コントローラ8251 USART (Universal Synchronous Asynchronous Receiver Transmitter)の紹介です。


これはOKI電子デバイスのMSM82C51A-2、8251のC-MOS版です。

この8251、Z80 SIOが高価だったこともありZ80システムに使われることも多かったですね。
有名どころではNECのPC-8001, PC-8801の各シリーズのカセットインターフェイスやシリアルポートに使われています。これはまぁNECがZ80はCPUしか製造していなくて、8251は自社で製造していたという理由でしょうが。
雑誌等に掲載されたZ80システムの製作記事でもZ80 SIOより8251の方が多かったように思います。


これはPC-9801用のカセットインターフェイスに使用されていたもの、NEC製のμPD8251ACです。


これは自作のZ80ボード3号機に使用のもの、上と全く同じ型番ですがパッケージがツルツルタイプからザラザラタイプに変わっています。製造年が2年ほど違うせいなのか、工場が違うせいなのか。

ところで8251と言えばソフトからリセットを掛けるときの「おまじない」が有名です。論理的なソフトウェアに「おまじない」って何なんだと思いますが... リセットコマンド40Hの前にダミーの00Hを何回か書くという奴です。00Hを書く回数にいくつかの説があるのも何なんだと言うところです。

ということでこのリセットの方法について考えていきましょう。
まず8251のアドレスは2つしかないので、データ以外のモード設定・コマンド等は全て同じアドレスに書き込まなくてはいけません。そこでリセット直後の書き込みはモード設定と解釈され、その後モード毎に必要なデータを書き込むと初期設定が完了し、それ以後書き込まれたものはコマンドと解釈されるようになっています。正しくリセットを書けるためにはコマンド受付状態でリセットコマンドを発行すればよいわけですが、初期化の途中なのか初期化が済んでコマンド待ちになっているのかはわからないので、ダミーデータを書き込んで確実にコマンド待ちにしてからリセットコマンドを書き込むというのがあの「おまじない」の正体なのです。

ではダミーとして何をどれだけ書き込めばよいのでしょうか?
まず何を書き込むかですが、ダミーを書いている途中で初期化が完了する(コマンド待ちになる)可能性が高い(というか通常は初期化は完了します)のでコマンドとして解釈されてもリセットされないデータである必要があります。ダミーでリセットがかかると最後の本物のリセットコマンドの書き込み時にコマンド待ちであることが保証できなくなってしまいますから。リセットはビット6が1の場合なので、ビット6が0なら何でも良いのですが普通は00Hを使うことが多いですね。これは多くのプロセッサでレジスタに任意の値をセットするより0にするほうが簡単なためです。

次に何回書き込む必要があるかです。リセットからコマンド待ちになるまでに書き込む必要があるのは

非同期モード ビット[1:0]が00以外 / /
同期(1キャラクター) ビット[1:0]=00,ビット7=1 1st同期キャラクタ(値は任意) /
同期(2キャラクター) ビット[1:0]=00,ビット7=0 1st同期キャラクタ(値は任意) 2nd同期キャラクタ(値は任意)

なので、最悪はリセットされた直後の場合で3回の書き込みが必要になります。
ということでダミーの00Hを3回書いた後にリセットコマンド40Hを書き込むとなります。

ダミーを00Hではなく80Hにすれば2回で済みますね。

00Hが3回必要になるのはリセット直後の場合で、上表の3行目のコースを辿るからです。ダミーを80Hにすれば2行目のコースになるので2回でコマンド待ちになります。

でも、01Hとか03Hにしても1回にはできませんよ。

参考文献・関連図書: 
8251Aデータシート, Intel.

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。