I2Cで複数スレーブ接続の波形を見てみた

I2C

どうもミソジです。

今回は筆者が持っているラズベリーパイとI2C複数デバイスをつなげてアナライザを使い「I2Cで複数スレーブ接続の波形を見てみた」を紹介します

 

CPUは1本のI2Cで複数デバイス接続している際でもしっかり何処にデバイスがあるか見つけてくれます。実際にどうやっているかをアナライザで確認してみました

 

ラズベリーパイとI2Cデバイスを複数つなげてみる

環境構築は前回記事と同じになります。詳細はこちらをご確認ください
実際につなげた写真がこちらとなります。

「ラズベリーパイ」「I2Cデバイスを2つ(EEPROMと加速度センサ)」接続しています

回路図的には下記の形になります。「3.3V」「GND」「SDA」「SCL」ブレッドボードにジャンパー接続するだけで簡単に可能です。
※ラズベリーパイのGPIOピン配置は新しい型に合わせています

そしてラズベリーパイを設定・起動してI2C先にデバイスがいるか「i2cdetect」のコマンドで確認できます。
赤字の50,58がEEPROM青字の68が加速度センサのアドレスになります

~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pi@raspberrypi ~ $ sudo i2cdetect -r -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          — — — — — — — — — — — — —
10: — — — — — — — — — — — UU — — — —
20: — — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: 50 — — — — — — — 58 — — — — — — —
60: — — — — — — — — 68 — — — — — — —
70: — — — — — — — —

~~~~~~~~~~~~~~~~~~~~~~~~~~~~

そしてアナライザをSCL、SDAの箇所に接続して「i2cdetect」しているときの波形を確認します。

 

i2cdetectが何を行っているのか確認する

それではi2cdetectで実際どのようにしてデバイスを検知しているのかを確認してみました

i2cdetectのコマンドのデフォルトでは0x03~0x77のアドレスにすべてRead命令してACKが返ってきたものに関してデバイスがあると認識しているようです。

上記のように「0x**」で各ブロックになっています

 

隣接するアドレス間の周期を確認してみる

今回はI2CのクロックのSCLは100kbps(100kHz)ですので1周期10μsになっていることが波形からも分かります

i2cdetectでの各アドレス間の周期はどうなっているのか確認してみます
まず連続でデータを取りにいっている0x20~0x2Fのアドレス周辺の周期を見てみました

5周期ほど確認しましたが結果は「290us,264us,221us,217us,230us」と一定ではありませんでした。
ラズベリーパイ内(Linux)でのデータのやり取り時間があるのですかね?もし今度機会があればRTOSでも確認してみたいと思います

 

離れたアドレス間の周期を確認してみる

あと離れたアドレスのブロックごとの周期を確認してみました。
下記のように「0x2*」~[0x3*]などの各ブロック周期を見てきます

こちらも5周期ほど確認しましたが、やはりこちらも「963us,797us,804us,822us,809us」とバラつきが多くありました。

 

まとめ・感想

「I2Cは指定の周期でほぼずれなくデータやり取りしているんだろうな」と考えていましたがいざ実際に測定してみると、意外にバラつきなどがあり新たな発見でした。

データシート見て確認するのもいいですが、やはり実物の波形見て今一度現実と認識のずれを把握する重要ですね

今日はここまでにしたいと思います
どうもありがとうございました

1000円足らずでアナライザが購入できます

ラズベリーパイで簡単にI2C通信ができます。


EEPROMの詳細は下記となります。

コメント