5VのArduino UNO等で使用できる様、SDカードI/F回路を手作り(「#6-5 microSDカードI/Fを自作する」)したのですが、時々、動作が不安定になることがありました。
全く関係のない回路設計をしていた時に気が付いたのは、「やっぱりレベルシフタ(L/S)のスピードが足りないのでは?」と、言う事。SPI通信を使うSDライブラリは、SPIクロックがデフォルトで4MHz、クロック周波数を指定すると8MHzまで高速化できます。オープンドレイン&プルアップの双方向L/S(下図)では、スピードが足りないのではないか?という不安は、前からありました。
LTspiceでSPI(8MHzクロック)を想定したL/Sのシミュレーションを実施して、現在の状態を確認してみます。
L/Sの動作シミュレーションをLTspiceで実行するため、必要な部品(ライブラリやモデル)を収集しなければなりません。使用しているL/Sの回路は、以下図の様になっています。
抵抗は、いつもの様にデフォルトのモデルをそのまま使うとして、回路の肝でもあるエンハンスメントモードのFET、BSS138のモデルが無いと話になりません(上図青破線内の素子)。
BSS138のspiceモデルを検索(別ウインドウが開きます)
モデルが見つかったら、「#6-2 オペアンプにspice」でLM358のモデルを組み込んだ手順に倣って、BSS138モデルを組み込みました。
モデルが組み込めたところで、前節で示したL/Sの回路をLTspiceでエントリして、シミュレーションしてみました。確認すべき信号線は、大きく2種類です。
シミュレーション結果は以下図の通りとなりました。
やっぱりね<(1^_^💦)>。
このL/Sは、信号をHIGHに駆動する回路を持たず、HIGH出力はプルアップに頼っているので、HIGH→LOWの遷移は速いのですが、LOW→HIGHの遷移は遅いのが特徴です。
プルアップが必ずしも悪いわけでは無くて、要は、電流が足りないのですよ。前節で示した回路の様に、プルアップに10kΩの抵抗が入っているので、5V出力端子には、精々5V/10kΩ=500μA程度の電流しか流せないことになります。
500μA程度の電流で、負荷回路の既成容量等に充電しない限り5Vまで上昇できないので、時間がかかる → 遅い、という構図です。もっと電流供給能力を増やしてあげれば、高速化できるはずです。
そう、プルアップなので、並列にプルアップ抵抗を追加すると、合成抵抗は10kΩより小さくすることができるので、電流を流せる様に修正することができます。L/Sの外付けに、プルアップ抵抗を追加した、改定後の回路図を以下に示します。
縦の青破線の内側がL/Sの回路で、その外に追加したRa1、Ra2が追加のプルアップ抵抗です。改定後のシミュレーション波形を確認しておきます。
LTspiceでの確認結果に従って、SDカードI/Fの回路を改定しておきます(下図)。
ちょっと多めに電流を消費するようにはなったけど、安定してくれるといいなぁ。
以下、改定後の回路をブレッドボードに作り込んで実験した時の様子です。
以下の様なアプリケーションで動作を再確認しました。
改定前の回路では、起動時にSDカードが認識できないケースが時々あったのですが、少なくとも、今回試した範囲では、一度も遭遇しませんでした。改定前の回路でも、「実力」でそこそこ動いてはいたので、改定の効果を明確に実感するには至りませんでした。まあ、シミュレーションで明らかな様に、スペック未達だったところが向上しているので、デグレイドはしていないはず。
※「デグレイド」で心配なのは、電流が増えた点。特に、UNOの3.3V出力で使う場合。かえって悪影響を及ぼす可能性も0ではない。以下図の様な外部電源回路を使うのが正。ちなみに、下図の電源モジュールは、UNOから5Vを供給すると、そこから3.3Vだけを作ってくれるので、3.3V電源が欲しいだけならACアダプタ無しで使用可能です。
DIYなのだから、「スペック満たしていなくても、実力で動くのなら、問題ない」と、言う考え方もありだと思います。現に、故意犯でスペック外使用する場合もありますから。でも、結果として動作不安定で、使い難くなってしまう様であれば、「問題あり」です。これからも、気が付いたところで、改定して行きたいと思いますm(1__)m。