前回、Z80 PIOを使ったKZ80マイコンのソフトウェアI2C通信でI2C RTC(DS3231)モジュールとの通信に成功したので、こんどはKZ80-IOBでも装備している8255PPIを使ったI2C通信をしてみたいと思います。
Z80 PIOと8255の動作の違い
前回、I2C通信を実施したZ80 PIOはビットモード(モード3)というものがありまして、信号線1本づつの入力、出力が変更できます。それを使って、HiZ(Hレベル)→OUTPUT(Lレベル)→HiZ(Hレベル)という感じでソフトウェアによるパルスを出すことができました。
今回使ってみたいと思っている8255は以下のような特徴があります。
(1) 8255はポートA(8ビット)、ポートB(8ビット)、ポートC上位4bit、ポートC下位4bitという4つの単位でしか入出力モードを変更できません。
(2) 出力ポートとして設定した際は、初期値として全ビットLレベルに設定されます。
(3) 入出力モードの変更ワードはA〜Cポートを一度に設定するため、ポートCだけ設定を変えたいとしても全ポートに設定が及んでしまいます。
ふだんは厄介な(2)の仕様ですが、今回はアウトプットモードにしたときにLレベルになれば良いので良い方向に働くのでは?と安易に考えて回路作成とプログラム作成をスタートしました。(いつもの見切り発車)
回路図
8255PPIでI2Cを実施するための回路は以下のとおりです。
Z80 PIOの場合と基本は一緒ですが、上記に書いたとおり入出力を変更できるグループ単位に1本づつ接続するためポートCのPC0とPC1を使用します。KZ80-IOBとつないでテストを考えていたので、こんどは2本の14ピンフラットケーブルで接続します。(豪華w)
SCL/SDAそれぞれの信号線を10kΩでプルアップして、ポートが入力(HiZ)のときにHレベル、出力のときにLレベルというかたちで信号線をパタパタするのはいっしょです。
I2Cドライブソフトウェアの変更
8255を使用したI2C通信部品もZ80 PIOのときといっしょでドライバーとしてZ80アセンブラで記述しました。以下のgithubにUPしています。(KZ80-ZilogI/Oのサンプルページですが…KZ80-IOBのサンプルプログラムとして掲載したほうが良いかも)
この部品を使うI2C RTC制御プログラムは変更の必要は無いと思うので、Z80 PIOのドライバー部品とサブルーチン名を合わせてあります。
変更点としては、LSIの初期化部分と、ポートの入力、出力を切り替えて信号線をパタパタするための制御部分が異なります。8255の初期化のためのコントロールワードでビット0とビット3がポートC上位/下位の入出力切り替えなので、そこをSET/RESしながら出力するかたちで制御しています。以下に引用したuPD8255のデータシートの左側を参照ください。
uPD8255データシート
I2C RTC(DS3231)モジュールからデータが読めた!
ドライバーソフト部分だけをZ80 PIO用から8255用へ変更したかたちで、前回読み取りに成功したI2C RTC(DS3231)モジュールからデータが読めました!! (1回目の読み出し時に文字化けしてますが、そこは気にしないでください。^^);;;)
今後に向けて…PC-8001へ
KZ80マイコンで8255PPIを使ってI2C通信に成功したので、これはPC-8001でもI2C通信ができるのでは? と思って、I2C通信テストボードを作ってみることにしました。(いろいろとハマったわけですが…) 続きは別記事で紹介したいと思います。
コメント