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」で書いたような問題が発生する可能性は少ないと思います。
しかし、上記記事の実験結果を踏まえて、アクティブ素子ではなく、高速スイッチング動作に適したショットキーバリアダイオードを使い、下図のような方式にしました。
実際にクロック信号を観測した結果が下図です。
黄色(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にクロックアップするようにしています。
作成したSPIインターフェースでのCMD0コマンド出力波形が下図で、今回は初期化後のクロックの切り替えは行わず最初から最速で出力するようにしました。
ソフト制御なので送信バイト間に少し隙間が空いています。また送信よりも受信の方が処理時間が掛かるので受信時(右側の出力が0xFFの部分)のクロックは少し遅くなっています。
今回の波形を拡大したものが下図で0.75us毎にクロックを反転していてビットレートは 666K です。
SPIはマスター側がクロック提供していて、クロックは自由に変更できる(例えば割込み処理時は途中で停止する等)のでSPIの実装自体はそう難しくはありません。
限られた条件の中で如何に速く通信するか・・を考えるのが楽しいところです(0.75usでどうやって制御しているか想像してみてください)
上述のようにクロックはdutyを50%に保つ必要もないのでduty50%の条件を満たさない現時点での最速のCMD0波形が下図です。
下図が拡大図でビットレートは762Kまで上がりました。
以上がSPIインターフェース実装の現状で、SPI通信はタイマ割込みを動作させた状態でも問題ありませんでした。もう少し整理した後はCP/Mの起動にチャレンジですね^^
★追記 2020/11/07
SPI通信中にタイマ割込みが入った波形を追記します。タイマ割込みは8us弱程度ですね。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
もともと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] [ 前へ ] 連載記事 [ 次へ ]
レトロマイコン86ボードの構想(その24)16MHz動作実験4 [8086]
PICからV20(クロックのhighレベルは規格上0.8xVdd=4V以上)へ供給するクロックの電圧レベル変換回路の検討中で、前回記事の「レトロマイコン86ボードの構想(その23)16MHz動作実験3」の末尾で書いたように手配していたFETが届いたので評価結果のダイジェストを書いてみます。
始めにFETを使ったレベル変換に関しては下記のレベル変換ボードの説明にあるように双方をそれぞれの電源電圧で吊り、更にゲートを低い方の電圧で釣ることで双方向のレベル変換に対応できます(電圧の低い側をソースに接続)。
ネット上でも「FETで異なる電圧のインターフェース」や「3.3V 5V レベル変換」に同様な回路が示されています(前者は方向固定の例で入力側のプルアップが省略されている)。
海外に注文していたNMOS FETの2N7002が届いたので(実はかなり前に届いていた^^;)下図の回路で評価してみました。
まずは 3.3V → 5V 変換からです。
下図が10KHzと100KHzの矩形波入力時の波形で黄色(ch1)が入力で水色(ch2)がレベル変換後の信号です。
左側の10KHzの方は問題ないように見えますが、右側の100KHzでは立上り時にFETのオフに遅延が発生して3.3V側に接続されている状態が発生しています。
下図の500KHzではプラス側の末尾の1/3で5Vへ向かって推移していますが始めの2/3は3.3Vのままの状態です。
上の100KHzの波形と合わせてみるとFETがONからOFFに推移し始めるのに1us弱の時間が掛かっているようです。
V20のクロックとして使用する8MHzと16MHzではプラス側の全領域が3.3Vになってしまっていてレベル変換回路の効果がなくなっています。
これらの現象は前回の記事で書いたトランジスタによるレベル変換回路で生じた現象と酷似しています。
トランジスタ回路ではベース抵抗にスピードアップコンデンサを付けて改善できましたがゲート抵抗はないのでもっと高速なFETを使うのがいい?(入力信号はきっちり立ち上がっているのでドライブ不足ではないと思う)
2N7002のデータシートを確認するとTurn-On Delay TimeとTurn-Off Delay TimeがどちらもMax 20nsになっているのでスペック的には問題なさそうなのですが・・
5V → 3.3Vの変換方も同様の傾向が見られます。
黄色(ch1)が入力側で水色(ch2)が3.3Vへの変換後の信号です。
因みに下図のような単純なプルアップ回路では500MHz時点で完全にスイッチングが追い付かない状態になりました。
他のFETでも試した方がいいかもしれませんが、やはり前回記事で書いたトランジスタ方式の方がいいかなぁ~ という感じです(実際16MHzでV20が動いているし)。
いっそトランジスタを2個使ってプッシュプルドライブ回路にでもしてみる?(でも部品が増えるのはちょっと)
一点気になることは・・・今回使用した海外から調達した2N7002のマーキングが「7002」になっていることです。
DIODESのデータシートでは下図のように書かれています(メーカーにより刻印文字は異なるのでしょうが)
SOT-23の小さなパッケージをリマークするのは手間賃の方が費用が掛かりそうなので本物だとは思うのですが・・
秋月さんのHPを見ると2N7002は2件ヒットし、2つとも”K72"と書いてあり下記のマーキング仕様に準拠してますね。
★追記 2020/11/03
neko Javaさんからプルアップ抵抗を小さくしてみては?とのコメントを頂いたので 3.3V -> 5V変換時の5V側のプルアップ抵抗を10Kから1Kに変更して確認してみました。
前回記事のトランジスタ回路ではプルアップ抵抗を色々変えて試していました(この時は解決策が1つも見つかっていなかったので)が今回は少し潔すぎたかもしれません^^;
下図が500KHzと1MHzでの確認結果で、500KHzでは10Kプルアップ時と同様に立上り直後にFETのON状態が残留し出力が3.3Vで、プルアップ抵抗を小さくしたことで立下りがかなり鈍っています。
1MHz側の立上りは最初から5Vに遷移する右上がりの状態になっていますが、これは入力がlowの時にFETが完全にONしきっていなかったためと思います。
下図は8MHzと16MHzの場合で、High側はかろうじて4Vに達していますが、Low側がプルアップ抵抗に引っ張られて1V以上になっています。
V20HLのクロックのlowレベルの規格は 0.15xVdd 以下なので今回の場合は0.75V以下にする必要があります。
また、16MHzのケースでは振動現象が現れ、その2、その3の図に示したように出力が一定周期で2V程度の幅で上下しました。
結果としてプルアップ抵抗を小さくすると立上り時の問題はほぼそのまま(5Vへの遷移開始タイミングは早くなった)でlowの時の電圧が上がってしまうということが判りました。
MOS FETは一般的にオン抵抗が小さいという印象でデータシートにもVgs=5V、Id=0.05AではTypicalで3.2Ωと記載されています。
データシートにあるオン領域特性グラフ(下図)からVgs=3.0Vの場合の線形領域を延長してFETの抵抗値を求めてみると20(=4/0.2)Ω程度になりますが、これはあくまでも静的特性であって、今回の様な過渡的な状態では当てはまらないということだと思います。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
始めにFETを使ったレベル変換に関しては下記のレベル変換ボードの説明にあるように双方をそれぞれの電源電圧で吊り、更にゲートを低い方の電圧で釣ることで双方向のレベル変換に対応できます(電圧の低い側をソースに接続)。
ネット上でも「FETで異なる電圧のインターフェース」や「3.3V 5V レベル変換」に同様な回路が示されています(前者は方向固定の例で入力側のプルアップが省略されている)。
レベル変換ボード説明書(抜粋) |
|
海外に注文していたNMOS FETの2N7002が届いたので(実はかなり前に届いていた^^;)下図の回路で評価してみました。
レベル変換評価回路 |
|
まずは 3.3V → 5V 変換からです。
下図が10KHzと100KHzの矩形波入力時の波形で黄色(ch1)が入力で水色(ch2)がレベル変換後の信号です。
左側の10KHzの方は問題ないように見えますが、右側の100KHzでは立上り時にFETのオフに遅延が発生して3.3V側に接続されている状態が発生しています。
3.3V -> 5V (10KHz) | 3.3V -> 5V (100KHz) |
|
|
下図の500KHzではプラス側の末尾の1/3で5Vへ向かって推移していますが始めの2/3は3.3Vのままの状態です。
上の100KHzの波形と合わせてみるとFETがONからOFFに推移し始めるのに1us弱の時間が掛かっているようです。
3.3V -> 5V (500KHz) |
|
V20のクロックとして使用する8MHzと16MHzではプラス側の全領域が3.3Vになってしまっていてレベル変換回路の効果がなくなっています。
3.3V -> 5V (8MHz) | 3.3V -> 5V (16MHz) |
|
|
これらの現象は前回の記事で書いたトランジスタによるレベル変換回路で生じた現象と酷似しています。
トランジスタ回路ではベース抵抗にスピードアップコンデンサを付けて改善できましたがゲート抵抗はないのでもっと高速なFETを使うのがいい?(入力信号はきっちり立ち上がっているのでドライブ不足ではないと思う)
2N7002のデータシートを確認するとTurn-On Delay TimeとTurn-Off Delay TimeがどちらもMax 20nsになっているのでスペック的には問題なさそうなのですが・・
5V → 3.3Vの変換方も同様の傾向が見られます。
黄色(ch1)が入力側で水色(ch2)が3.3Vへの変換後の信号です。
5V -> 3.3V (10KHz) | 5V -> 3.3V (100KHz) |
|
|
5V -> 3.3V (500KHz) |
|
因みに下図のような単純なプルアップ回路では500MHz時点で完全にスイッチングが追い付かない状態になりました。
単純なプルアップ回路 |
|
単純プルアップ(100KHz) | 単純プルアップ(500KHz) |
|
|
他のFETでも試した方がいいかもしれませんが、やはり前回記事で書いたトランジスタ方式の方がいいかなぁ~ という感じです(実際16MHzでV20が動いているし)。
いっそトランジスタを2個使ってプッシュプルドライブ回路にでもしてみる?(でも部品が増えるのはちょっと)
一点気になることは・・・今回使用した海外から調達した2N7002のマーキングが「7002」になっていることです。
DIODESのデータシートでは下図のように書かれています(メーカーにより刻印文字は異なるのでしょうが)
SOT-23の小さなパッケージをリマークするのは手間賃の方が費用が掛かりそうなので本物だとは思うのですが・・
秋月さんのHPを見ると2N7002は2件ヒットし、2つとも”K72"と書いてあり下記のマーキング仕様に準拠してますね。
2N7002のマーキング仕様(データシートからの抜粋) |
|
★追記 2020/11/03
neko Javaさんからプルアップ抵抗を小さくしてみては?とのコメントを頂いたので 3.3V -> 5V変換時の5V側のプルアップ抵抗を10Kから1Kに変更して確認してみました。
前回記事のトランジスタ回路ではプルアップ抵抗を色々変えて試していました(この時は解決策が1つも見つかっていなかったので)が今回は少し潔すぎたかもしれません^^;
下図が500KHzと1MHzでの確認結果で、500KHzでは10Kプルアップ時と同様に立上り直後にFETのON状態が残留し出力が3.3Vで、プルアップ抵抗を小さくしたことで立下りがかなり鈍っています。
1MHz側の立上りは最初から5Vに遷移する右上がりの状態になっていますが、これは入力がlowの時にFETが完全にONしきっていなかったためと思います。
3.3V->5V:Pull Up 1K (500KHz) | 3.3V->5V:Pull Up 1K (1MHz) |
|
|
下図は8MHzと16MHzの場合で、High側はかろうじて4Vに達していますが、Low側がプルアップ抵抗に引っ張られて1V以上になっています。
V20HLのクロックのlowレベルの規格は 0.15xVdd 以下なので今回の場合は0.75V以下にする必要があります。
また、16MHzのケースでは振動現象が現れ、その2、その3の図に示したように出力が一定周期で2V程度の幅で上下しました。
3.3V->5V:Pull Up 1K (8MHz) | 3.3V->5V:Pull Up 1K (16MHz) |
|
|
3.3V->5V:Pull Up 1K (16MHz)その2 | 3.3V->5V:Pull Up 1K (16MHz)その3 |
|
|
結果としてプルアップ抵抗を小さくすると立上り時の問題はほぼそのまま(5Vへの遷移開始タイミングは早くなった)でlowの時の電圧が上がってしまうということが判りました。
MOS FETは一般的にオン抵抗が小さいという印象でデータシートにもVgs=5V、Id=0.05AではTypicalで3.2Ωと記載されています。
データシートにあるオン領域特性グラフ(下図)からVgs=3.0Vの場合の線形領域を延長してFETの抵抗値を求めてみると20(=4/0.2)Ω程度になりますが、これはあくまでも静的特性であって、今回の様な過渡的な状態では当てはまらないということだと思います。
On-Region Characteristics (2N7002) |
|
[TOP] [ 前へ ] 連載記事 [ 次へ ]