I2Cをケーブルで伸ばす場合の注意点
I2Cのネタです。
I2C接続のセンサーをメインCPU基板と分離して使用したい場面があると思いますが、ちょっとした落とし穴があったので、メモしておきます。
今回、TMP006モジュールというサーモパイルの温度センサーモジュールのI2C接続をケーブルを使用して延長したのですが、長いケーブルになると通信できなくなったり、データが化けたりするという問題がありました。
結論的には、シールド線を使用しないとノイズの影響が強くでるということでした。
以下のパターンで波形を確認しました。
<1> ブレッドボード上での接続
<2> フラットケーブル 1m
<3> フラットケーブル 2m
<4> シールドケーブル 2m
<1> ブレッドボード上での接続
ブレッドボードにさして普通に使用した場合、以下の波形が得られました。
<2> フラットケーブル 1m
長さ1mのフラットケーブルを使って接続したところ、このような波形になりました。
使用したケーブルは千石通商で売っているカラーケーブルです。波形が乱れているのと、ノイズが乗っているように見えます。この状態だと、動くときと動かないときがありました。
<3> フラットケーブル 2m
ケーブルをさらに伸ばす。
I2Cの読みとり側ではデータがばけていたり、温度情報が取得できない時がある、という感じになりました。以下の波形は10kbpsに落とたものですが、微妙なひげが出てきているのと、SCLがあやしくなっています。
SCLの信号を詰まっている部分が発生しており、明らかに変なところがあります。
<4> シールドケーブル 2m
シールドケーブルに変更するとデータの読み込みは安定していました。
波形を見るとなまっている感じですが、クロックがつまるような現象はありませんでした。
ケーブル延長した時の問題について色々調べてましたが、電線自体がそれぞれの電線に影響してしまう点が問題ということでした。フラットケーブルで信号線を流した場合、それぞれが干渉するので問題が起こるということのようでした。
ノイズへの対策としては以下の方法があるようです。
(1) フラットケーブルで、信号線の間にGND線を設ける
(GSGSG)などの線の並び配列にする
(2) シールドケーブルにする 。(または、ケーブルにアルミホイルをまく)
(3) Ether Cat6 ケーブルを使用する。(対ノイズ性が高いようです。)
Ether ケーブルでI2Cの接続を行い、実験された方のブログ
こちらにプルアップ抵抗の決め方について記載がありました。
http://www.picfun.com/midi2c02.html
ーーーーーーーーーーーーーー
IICの仕様書に計算方法など色々書いてありますよ。
http://www.nxp.com/documents/user_manual/UM10204_JA.pdf
例えば一般的なフラットケーブル(いわゆる、すだれケーブル)を使って、信号線をGNDで挟んだ場合(GSGSG)
1メートル当たり60pF程度なので、5メートルで300pFになります。
さらに、ケーブル容量に基板上の容量を足して合計400pF程度と見込んで計算すると、 Standardモード(~100Kbps)ならTr=1000nsecなので、Rpmax=1000nsec/(0.8473*400pF)=2.95KΩ
プルアップ抵抗を2.95KΩとすればOKです。
プルアップ抵抗はICが許す限り値を小さくすれば(1Kとか470Ωとか)ノイズ耐性やマージン確保に役立つと思います。
ーーーーーーーーーー
信号線のノイズ対策 シールドされたケーブルにする。
https://japan.renesasrulz.com/cafe_rene/f/forum19/3619/i2c?pi4368=1
cat6 ケーブルのうんちくはこのあたり
https://www.sanwa.co.jp/lan/cable6.html
おまけ
<I2Cパスの延長について>
以下のリンクで、PCA9600Dというものが紹介されていました。400kbpsで16mまで動作確認できているようです。