(2014.5.15 作成)
Sparkfun社のレベルシフタBOB-08745またはBOB-12009で5Vのマイコンと3Vのセンサ間でのI2C通信が可能になるのですが、その動作をシミュレータで確認します。使用するシミュレータはLTSpiceです。
5V系と3V系を分断しているFETには
Fairchild Semiconductor社のBSS138が使用されています。Fairchild社ではSPICEモデルのダウンロードにユーザー登録が必要であるため、こちらのサイトのデータを使用します。
使用方法ですが、LTSpice上でComponent→nmosを選んで配置し、Ctrlを押しながら右クリックしてComponent Attribute Editorを開き PrefixをX, ValueをBSS138に変更します。
次にツールバーのopボタンを押してEditorを開き、".include"に続いてGunthard Kraus氏のサイトの設定ファイルのアドレスを記入します。この記事作成時はContent English →
My personal collection of SPICE-Models → Vender List → Fairchild → BS でたどり着けます。ここにおいてあるBSS138.libをダウンロードしてそのパスをEditorに記載しても大丈夫です。
Kraus氏のサイトはBS138に限らず非常に多くの電子部品のモデルが置かれているので、この方法は知っていて損はないと思います。
I2CのパーツをモデリングするためにはGNDとHi-Z状態を表現できる部品を使用します。ここではねがでぃぶろぐさんの方法を踏襲し、3ステートバッファを使用します。
3ステートバッファとはたとえばEN端子がGNDだと入力された0,1のデジタル信号をそのまま通し、EN端子が1だとHi-Zを出力するロジックICです(具体的にはICの種類により違います)。
この3ステートバッファはこちらのサイトの
Components Library and Circuitsにある
A Large LTspice Folder from Bordodynovの中に入っています。サイトからzipファイルをダウンロードし、LTSpiceのインストールフォルダのlibフォルダ以下に必要ファイルをコピーすることで使えるようになります。使用する場合はシンボルを設置した後FETと同じく.include命令を書かないとエラーになりました。
このライブラリには色々な部品が入っているので、インストールして損はないと思います。
最終的に右図のシミュレーションモデルが出来あがりました。このモデルはページ最後からダウンロードできます。
シミュレーション開始10us後から通信が始まり、100kHzでI2C通信を行うことを想定しています。
シミュレーション結果は左の通りとなりました。開始後10usまでは通信が行われない=MasterがバスをGNDに引っ張らないためHVバスラインは5Vにプルアップされ、LVバスラインは3.3Vにプルアップされています。またこの場合はFETはOFFになっているので電流が流れていません。
次に10us~15usまでの間はMasterがバスをGNDに引っ張っているためHVバスライン、LVバスラインともGNDになり、FETにもボディダイオードを通じて1mAの電流が流れていることがわかります。
このように5V系、3V系も異なる電圧レベルで同じ波形となっていることから通信が出来ていることがわかります。
3V系からの通信も同じようにシミュレーションを行うことが出来ます。こちらの場合もバスラインはHV/LVとも同じ動きをしており、うまく電圧変換が出来ていることがわかります。一方FETに流れる電流は先ほどと逆方向になっており、FETがONすることでソース/ドレインを通じて電流が流れていることがわかります。
シミュレーション結果は右図の通りです。HVバスラインが5Vまで上がらず、0出力時もGNDまで電圧が落ちていません。これでは通信が成立しないと思われます。
今回用いたモデルではArduinoとMPU-6050のプルアップ抵抗をモデルに入れているのですが、単なる抵抗分割だと使用しているI2Cデバイスの特性によって結果は変わると思われます。
このように抵抗分割だけではうまく動作しないことがあるため、BOB-08745は生産終了になってしまったのでしょうか?
今回使用したシミュレーションファイルは以下からダウンロード可能です。