SSブログ
English Version

Z80GALの構想(その6)SPIインターフェースの実装 [Z80]

 前回の記事ではタイマ割込みを使ってシリアル通信を実現することでUART ICが不要になることを書きましたが、今回はソフトウェアでのSPIインターフェースの実装について書いてみます。
 もともとZ80GALの発想はZ80を高速(20MHz)で動作させ、必要なインターフェースをソフトウェアで実現することで最小限の構成のZ80ボードを作ることです。
 今回のSPIインターフェースを実現できれば、CP/M-80が動作するワンボードマイコンができます。

 それではハード関連の話からするとZ80やGALが5Vで動作していますが、SDカードは3.3Vで動作するのでレベル変換が必要になります。

 SDカードへ出力するチップセレクト(CS)、SPIのクロック(CLK)および出力データ(SDO)は 5V → 3.3V 変換が必要になります。
 これらの信号は低い電圧への変換であり数百KHz程度なので「レトロマイコン86ボードの構想(その23)16MHz動作実験3」で書いたような問題が発生する可能性は少ないと思います。

 しかし、上記記事の実験結果を踏まえて、アクティブ素子ではなく、高速スイッチング動作に適したショットキーバリアダイオードを使い、下図のような方式にしました。

5V -> 3.3Vレベル変換回路


 実際にクロック信号を観測した結果が下図です。
 黄色(ch1)がGALから出力されたクロック信号で水色(ch2)がSDカードに入力されるレベル変換後の信号です。
 lowレベルもGND付近まで下がっていて特に問題は無い状態です。

クロック信号のレベル変換状態


 また、SDカード側の出力のSPIデータは受け側のGALのHレベルの最小値が 2.0V なので直に接続しても問題ありません。


 次にSPIインターフェースのソフトでの実装についてですが、以前、PICを使ったZ80ボード(Pic24CPM)の検討時に書いた「レトロマイコンZ80ボードの構想(その7)SDカード2」に記載した波形が非常に参考になりました^^
 具体的な波形が判れば同じような出力になるようにソフトを作るだけですw

 上記の記事に載せているCMD0の波形が下図です。SDカード初期化処理時はクロックを333KHzにして通信し、初期化後に1MHzにクロックアップするようにしています。

Pic24CPMでのCMD0波形


 作成したSPIインターフェースでのCMD0コマンド出力波形が下図で、今回は初期化後のクロックの切り替えは行わず最初から最速で出力するようにしました。
 ソフト制御なので送信バイト間に少し隙間が空いています。また送信よりも受信の方が処理時間が掛かるので受信時(右側の出力が0xFFの部分)のクロックは少し遅くなっています。

今回作ったSPIでのCMD0波形


 今回の波形を拡大したものが下図で0.75us毎にクロックを反転していてビットレートは 666K です。
 SPIはマスター側がクロック提供していて、クロックは自由に変更できる(例えば割込み処理時は途中で停止する等)のでSPIの実装自体はそう難しくはありません。
 限られた条件の中で如何に速く通信するか・・を考えるのが楽しいところです(0.75usでどうやって制御しているか想像してみてください)

今回作ったSPIでのCMD0波形の拡大図


 上述のようにクロックはdutyを50%に保つ必要もないのでduty50%の条件を満たさない現時点での最速のCMD0波形が下図です。

現時点で最速のCMD0波形


 下図が拡大図でビットレートは762Kまで上がりました。

最速のCMD0波形の拡大図


 以上がSPIインターフェース実装の現状で、SPI通信はタイマ割込みを動作させた状態でも問題ありませんでした。もう少し整理した後はCP/Mの起動にチャレンジですね^^


★追記 2020/11/07
 SPI通信中にタイマ割込みが入った波形を追記します。タイマ割込みは8us弱程度ですね。

SPI通信中のタイマ割込み



[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。