ラズベリーパイとI2Cデバイスを複数つなげてみる
環境構築は前回記事と同じになります。詳細は下記リンク先をご確認ください
実際につなげた写真がこちらとなります。
「ラズベリーパイ」と「I2Cデバイスを2つ(EEPROMと加速度センサ)」接続しています
回路図的には下記の形になります。「3.3V」「GND」「SDA」「SCL」ブレッドボードにジャンパー接続するだけで簡単に可能です。※ラズベリーパイのGPIOピン配置は新しい型に合わせています
そしてラズベリーパイを設定・起動してI2C先にデバイスがいるか「i2cdetect」のコマンドで確認できます。
赤字の50,58がEEPROM、青字の68が加速度センサのアドレスになります
pi@raspberrypi ~ $ sudo i2cdetect -r -y 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
そしてアナライザを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は指定の周期でほぼずれなくデータやり取りしているんだろうな」と考えていましたがいざ実際に測定してみると、意外にバラつきなどがあり新たな発見でした。
データシート見て確認するのもいいですが、やはり実物の波形見て今一度現実と認識のずれを把握する重要ですね
<<20190428追記>>
I2Cの速度・アドレス変更時の波形をアナライザで確認しました。Pythonとraspberry piでテストして測定動画を撮っており、I2C通信の使い方を確認したい方におすすめです。(リンク先はこちらから)
今日はここまでにしたいと思います。どうもありがとうございました。
1000円足らずでアナライザが購入できます
コメント