I2Cセンサーの種類 |
高ドライブ電流型のI2C バスバッファ |
|
主な機能 |
I2CのSCL/SDAの通信ラインの延長バッファ |
|
I2Cデバイス名 |
PCA9600D |
|
写真
|
||
開発したデバイスの入手先 製品名 品番・型番 |
スイッチサイエンス PCA9600D 高ドライブ電流I2Cバスバッファ基板(SSCI-023764) |
|
デバイスのData-Sheet ケーブルを延長したい時は?
プルアップ抵抗の計算式 アクテイブプルアップIC |
http://www.nxp.com/documents/data_sheet/PCA9600.pdf http://www.nxp.com/documents/application_note/AN10658.pdf http://www.nxp.com/documents/application_note/AN10364.pdf |
|
デバイスの主な仕様
|
電源電圧 I2Cアドレス 全出力時規格 I2C通信速度 ドライブ電流 |
2.5V~15V NON I2Cの通信速度が1Mbpsで20m迄延長可能(Data-Sheet) 1Mbps 60mA |
説明 |
I2Cの規格の最大の難点は、I2Cバスの負荷容量が400pFと小さく、I2Cデバイスが延長して接続できない点に有ります。 そもそも、プリント基板の外にケーブルで延長して接続すると言うケースを想定していない規格なのでしょう。 我々は、それでは困ります。そこで見つけたのがPCA9600Dです。Data-Sheetでは 1Mbpsの速度で20m延長でき、負荷容量も4000pFに増大と書いて有ります。 やっている事は簡単明瞭で、CPU回りの回路設計経験者ならピンと来ると思いますが I2Cデバイスが低電圧、低電流、低消費電力を重視している為に、バスのインピーダンスが高く、少ない電流でバスをスイッチングしているので、容量性負荷に弱いバスに成ってしまっています。 PCA9600では、60mA/15Vまでシンク電流が流せるのでプルアップ電圧を高く、プルアップ抵抗値を下げて、I2Cバスにガンガン電流を流し、立上り・立下りの速度を力ずくで早めると言う方法です。 この方法だと、バスインピーダンスも下がる為、耐ノイズ性も当然向上します。 電池駆動のシステムの場合、このバスを駆動する為には、結構な電力を消費しますので不向きと思います。
|
|
|
|
|
開発・テスト風景
Ras-PiのI2Cを、PCA9600を介して16mのLANケーブルで接続し PCA9600で受けてBME280のセンサーを接続 |
16m直結では、当然通信不能ですが、PCA9600を介すると 400Kbpsで問題無く接続できました。 |
実験回路
プルアップのVDDラインを3.3Vですが、手持ちの16mのCAT-5のケーブル接続で動作を確認しました。LCRメータ測定するとケーブル容量は約800pFです。バスインピーダンスは約500Ωです。 この回路構成で、注意しなけば成らないのがアンダーシュートを吸収する為のショットキーバリアダイオードです。 折角PCA9600を用いる事で、負荷容量が10倍の4000pFに増大しても、I2Cライン上に居るショットキーバリアの接合容量Cd、Cjの問題です。 アプリケーションノートでは、何気なく、NXPのBAT54Aと書いて有りますが、10pFでTrrが5nSです。通常の小電力信号用でも50pFあり、整流用ではData-Sheetに記載の無い物まで有ります。もし50pFの物を選択しても両端にある為、100pFに成ってしまいます。芋づるで接続すればするほど、ショットキーバリアで容量が増加してしまい、本末転倒です。今回の実験ではBAT54Aは入手できず、BAT43を使用しました。7pFでTrrが5nSです。
|
どこの何が問題なのか?
上の図は、I2Cのバスマニュアルで400Kbps時のバス・タイミングを赤文字で書き入れた図です。 皆さんは、Data-Sheetを見るときタイミングチャートを読み飛ばしていませんでしょうか?? この中で、一番シビアな条件が、SDA/SCL共にL→H、H→Lへの変位は20nS~300nS以内で無ければ成らない点です。 他は、SCLがLに成ってから1300nS以内にSDAのデータ更新すれば、1320nS~1600nS後にSCLがHになりSDAが、そこから600nSの間データを保持する(この間にI2Cデバイスがデータを取得する)。またSCLがLに成ってから1300nS以内にSDAがデータ更新すれば良い宇の繰り返しです。 問題は、データをセットする許容時間が1300nSに対し、H→L、L→Hの変化の許容時間が300nSで、この時間内に0.3VDD→0.7VDDへの変化させる点です。これを実現する為に弊害に成るのが配線の静電容量です。 つまり、配線のプラスとマイナスの間に電気が貯まりながら徐々に電圧が上がって行きます。その為、立上りの信号が「なまり」ます。 配線が長く成れば成るほど、静電容量が増加し充電時間が長くなり、この300nS以内が実現できなくなります。 その為、充電を早くする為、急速充電すれば良く、その為にはプルアップ抵抗を小さくして大きな電流で充電すれば、早くなります。 あまり小さくし過ぎると、I2Cデバイスのシンク電流の最大値が越え、デバイスが壊れます。シンク電流最大が3mAですので、3.3V時は1KΩ位が限界です。 今度は立下りのH→Lです。配線に充電された電気を直ぐに使い切る必要が有ります。それを行うのがI2Cデバイスの自身ですが、I2Cデバイス自身は流せる(消費する)電流(3mA)に限界があります。「ちょろちょろ」しか使わないと、なかなか使い切れず、時間内に0.3vDDの値まで使い切れません。その為、PCA9600(60mA)の様に、ガンガンと電流が流れるICを使って消費し、0.3VDD以下にします。 プルアップ抵抗の計算式は、http://www.ti.com/lit/an/slva689/slva689.pdf に有ります。
|
他の方式
当社でも、I2Cデバイスの産業利用を考えるとI2Cのケーブル延長が最大の課題です。その為、様々な実験、検証を行っています。 CANやRS485等の物理層のみ使ってDI/Oを伝送しようとする邪道な方法です。
I2Cインターフェース・ドライバーとは、あまり関係しないのでここまで、面白い情報が有れば教えて下さい。 |
I2Cバスについて、 その他・・・・いろいろ ・なぜ、400pFなのか? I2Cバスの仕様書 (日本語版) http://www.nxp.com/documents/user_manual/UM10204_JA.pdf
ケーブルで接続しI2Cバスを延長しようとすると、この400pF問題が壁となります。400Kbpsの速度を前提とします。 これは、I2CデバイスがI2Cバスをシンクできる電流量から知る事ができます。(私が規格制定者でないので憶測です) I2Cデバイスはオープンドレインの構造で、SDA、SCLの通信ラインは、デバイスがON(スイッチON)する事でLowレベルにする事はできます。デバイスがOFFになるとHiレベルに成ります。 しかし、Hiレベルは、デバイス自身が電圧を出力してHiレベルにしているのでは無く、I2Cバスと電源に接続されたプルアップ抵抗でHiレベルに成ります。つまりHiレベルにしているのはプルアップ抵抗だけです。 I2Cバスをはじめとし、配線には全て静電容量(浮遊容量)のコンデンサ(電池)と同じ効果があり、これの充電完了がHiレベルです。 この充電完了する迄の時間の規定が、「400Kbps通信時のタイミングチャート」で説明した300nSです。 つまり、配線が長くなると静電容量が多くなり、同じ電流で充電すると容量が多い分時間を要してしまい300nSを超えてしまいます。 「だったら、その分、多い電流で充電すればいいじゃん!」と成る訳です。 そこで、問題となれるのが、デバイスがONした時の流せる電流の最小値の3mAです。プルアップ抵抗を小さくして10mAで充電しようとすると、デバイスがONした時も10mAがデバイスに流れてしまいます。これじゃダメなので3mAにするしか有りません。 だったら、3mAの電流で300nS以内に充電完了となる容量は?と計算すると400pFと言う訳です。
当然、I2Cバスの通信速度を遅い100Kbpsにすれば300nSの縛りから抜けられる、速度が1/4だから、時間は4倍の1200nSで距離も4倍????と考えますが、「チョット待った」です。 100kbpsの立上り時間(充電時間)は1000nSで3倍に成りますが、立下り時間は300nSのままです。静電容量も400pFのままです。「なに?この規格、、意味あるの???」と思います。規格制定者に意図を聞いてみたいですね。 ちなみに、1Mbpsの速度の場合、最大120nS以内の立上り/立下りで、静電容量が550pFと容量は増えています。理由は最小の電流値が3mAから20mAに増えているからです。1Mbps対応のI2Cデバイスは、この20mAシンク電流に対応しなければ成りません。プルアップの抵抗値が3.3Vで1KΩ限界が200Ω位まで下げる事ができ、ガンガン電流を流せるからです。I2CのデバイスよりI2Cの通信ラインの方が電気を多用しますね。
他のバスバッファ P82B96 http://www.nxp.com/documents/data_sheet/P82B96.pdf あちこちの資料を見ていると、バス延長やドライブ能力向上にP82B96が紹介されています。 PCA9600と同じ機能を持っています。ドライブ能力も4000pFに対応していますが、スイッチング速度が遅く、対応できるI2Cの バススピードは400Kbpsです。
アクティブ・プルアップ LTC-4311 http://cds.linear.com/docs/en/datasheet/4311fa.pdf
I2Cデバイスを色々と探していると、やはり400kbps対応の物が多く、1Mbpsの物は余り数が多くありません。 結局、1Mbpsを断念して400Kに逆戻りに成るケースが多いと思います。 しかし、ケーブルを延ばしたい、しかし、PCA9600を使うと伸ばしたケーブルの先にI2Cデバイスが2個に成ってしまう懸念が有ります。そこでアクティブ・プルアップです。 I2Cの通信ラインを監視していて、LowからHiに切り替わるのを検出するとプルアップの抵抗値を小さくして電流を多く流し立上り を早めます。車で言うターボの様な動きです。この時のI2CデバイスがOFFなのでデバイスには電流は流れず、デバイスは壊れません。このアクテブ・プルアップは、I2Cのバスラインに一個だけ居れば大丈夫です。LTC-4311ではこのターボ電流は平均5mAで、 思ったよりは、ガンガンでは無い感じかな?
I2Cバス速度の混在 I2Cの通信速度は、100KbpsのStandard、400KのFast mode、1MのFast
・100Kbps Standard-mode I2C通信のベースの規格です。オープンドレイン接続でシンクできる電流は3mAで400pFの壁が有ります。
・400Kbps Fast mode Standard-modeの速度を400Kbps版です、立上り時間程度のタイミング変更です、大きくは変わりません。
・1Mbps Fast mode + 配線の対応できる静電容量負荷が400pFから560pFに増加し、シンク電流を20mAに増加させています。信号のタイミングも短くなっています。300nSの立上り/立下りが120nS以内への変更等。
・3.4Mbps Hi Speed mode さすがに、この速度になるとオープンドレインの構成が難しくなり、SCL/SDAの信号ラインがSCLH/SDAHの信号名称も変わり互換性が無く、デバイス内部にも小細工回路が付加されています。3.4M時のI2Cバスの負荷容量も100pFで400k時の1/3、クロックの立上り/立下りも40nS以内と1/8と短く成っています。 オンボード内配線では、問題無いと思いますが、ケーブル延長には厳しい数値です。
・5Mbps Ultra Fast mode 何??この規格って・・・I2Cなの?? SDA/SCLの2本を使っているだけで、全く別物です。 LEDドライバー等、動作結果を返事する必要が無い、一方的な指示のみで済むデバイスでUltra Fast modeに対応している物が限 られます。Data-Sheetでは、I2Cと言いつつも、オープンドレインでのI2Cバス構成では無く、プッシュプル回路でバスをドラ イブし、当然、I2Cバスのクロックストレッチも機能も使えません。プッシュプル駆動なので競合検出もできないのでマルチマス タ構成も使えず、他の低速のI2Cデバイスも駆動回路の違いから混在できません。全くの別物ですが、なぜI2C規格なのか??? 理解できません。
Ultra Fast
I2Cアドレス変換 LTC-4316 http://cds.linear.com/docs/en/datasheet/4316fa.pdf
I2Cのバス延長の目鼻がついたタイミングで次の壁が、I2Cのアドレス重複問題です。I2CのアドレスはNXPがメーカーコードの様な物を割り振っていて、同じデバイスを使わない限り、重複問題は発生しませんが、データロガー等、同じデバイスを数使う場合に、この重複が発生します。 LTC-4316は、この問題を解決するアドレス変換用デバイスです。アドレス設定には、外付け抵抗の抵抗値でアドレスが決定するので スタートアップ時に、何か設定等の必要は有りません。しかし、I2Cの通信プロトコルでの10bitアドレス指定等のサポートしていないプロトコルも有るので注意が必要です。
I2Cマルチプレクサ PCA9544 http://www.nxp.com/documents/data_sheet/PCA9544A.pdf
I2Cのアドレス重複問題で、抵抗なんか半田付けしてられない!!。と言う場合にマスタCPUのI2CバスをPCA9544で二つに分けて、I2C-A側、I2C-B側と二つに分割して接続する方法が有ります。4系統まで分割できる奴も有ったと思います。 分割後の負荷容量も系統毎に400pFなのでケーブル延長には少し役立ちそうです。 しかし、このデバイスもI2Cデバイスなので、I2Cのアドレスを持ちます。各系統に居る子供達のアドレスと重複しない様にしなければ成りません。また、システムスタートアップ時はどの系統にも接続されませんので、一番最初にレジスタにパラメータを与え、イニシャライズの設定を行う必要が有ります。
I2Cバスマスター・セレクター PCA9541 http://www.nxp.com/documents/data_sheet/PCA9541A.pdf
ラズパイを産業用に??、大丈夫?、ハングアップしないの?、せめて2重化したら? と言う事が発生すると思います。完全クラスタ化、自動でバックアップが立ち上がる、データの100%継承等を望まない場合ですが I2CのCPU側の2重化するセレクターです。 Data-Sheetには、これでもか??と言う位の構成例が載っています。 I2Cバスではマルチマスタ化が可能なので、バックアップ側を同じI2Cに接続しておいて、トラブル時には、現在のマスター側の電源を切って、バックアップ側を入れて下さい。で済みそうな感じです。そこまで重要な部分に使うのかな??と思います。
CPU/MPU パラレルバス、I2Cインターフェース PCA9665 http://www.nxp.com/documents/data_sheet/PCA9665_PCA9665A.pdf ここの領域に達するには、大変の苦労が有ると思います。80C51等のDATA-バスが8bitパラレルバス+R/W信号、CS信号、INT信号等の接続して、その先にI2Cバスを接続しI2Cデバイスを接続する為のインターフェースICです。簡単に言えば8251等の接続対象がrs-232-cのI/F用ICと同じく、接続対象がI2Cと言う事です。 この領域の方は、本文を読まなくても、様々な課題解決は可能と思います。
|