I2C通信の波形をオシロスコープで測定してみました。
i2cdetectを行い、該当のアドレス箇所での信号を確認しています。
実際のI2C通信のクロックとデータの波形を詳細に紹介します。
I2Cの波形をオシロスコープで確認してみた
I2Cの波形をオシロスコープで確認してみました。
ラズベリーパイとI2CデバイスのEEPROMの通信時を測定しています。
実際にSCL(クロック)とSDA(データ)を測定しています。
オシロスコープのデコード機能を使い、I2C通信を解析しています。
i2cdetectを行い、該当のアドレス箇所での信号を確認しています。
I2C通信の仕組みを実際のオシロスコープの波形交えて分かりやすく紹介します。
I2C通信の基礎
I2C通信の基礎を簡単に説明します。
I2Cの信号線はSCL(クロック)とSDA(データ)の2本となります。
CPUとデバイス間でデータのやり取りを行います。
実際にデバイスを接続する形だと「3.3V」と「GND」も繋げています。
今回のラズベリーパイとEEPROMをI2C接続する回路としては下記形となります。
実際のI2C通信(Read)の波形例としては下記形となります。
「黄色のSCL(クロック)」を基準に「青線のSDA(データ)」が動いています。
下記例だと青線は2進数「1010000」つまり16進数だと「0x50」となります。
オシロスコープのデコード機能の値と実際の波形が一致しています。
もしI2C通信のデータを詳細に解析したい場合はアナライザが便利です。
応答信号であるACK/NACKまで解析してくれます。
下記記事では個人で購入可能なアナライザを使ってI2C通信を解析しています。
1000円程度で簡単に手に入ります。(記事のリンク先はこちら)
I2CとSPIの違い
I2C以外にも汎用的な通信IFとしてはSPIがあります。
SPIは一般的に4本の信号線があり、I2Cと比べて比較的多くのデータ量が送れます。
(通信速度・送信方法によってデータ量が変わるので一概には言えないですが…)
SPI通信の波形例としては下記です。
I2Cと比べると信号線が増えますので、配線・接続は少し手間になります。
SPI通信の波形については下記記事で紹介しています。
PythonでSPI通信を制御して色々なパターンの波形を確認しています。(リンク先はこちら)
i2cdetectの波形をオシロスコープで確認してみる
ラズベリーパイとI2CデバイスであるEEPROMを接続して波形を確認します。
今回のI2C通信としては一番簡単な「i2cdetect」を使います。
コマンド一つでラズパイ接続されているI2Cの全てのアドレスが分かります。
EEPROMのI2Cのスレーブアドレスとしては「0x50」と「0x58」になります。
実際のコマンド結果は下記となります。
「0x03」から「0x77」までのアドレスを検索していることが分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
pi@raspberrypi:~ $ sudo i2cdetect -r 1 WARNING! This program can confuse your I2C bus, cause data loss and worse! I will probe file /dev/i2c-1 using receive byte commands. I will probe address range 0x03-0x77. Continue? [Y/n] y 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: 50 -- -- -- -- -- -- -- 58 -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- |
PythonでもI2C通信は可能です
今回は使いませんが、Pythonでも簡単にI2Cのプログラミングが可能です。
下記記事でラズパイとPythonでI2C通信を紹介しています。
I2Cデバイスの加速度センサ情報をReadしたり、アドレスを変えたりしています。
よろしければ一緒にご覧ください。(リンク先はこちら)
i2cdetectをオシロスコープで解析をする
ラズパイで「i2cdetect」実施中にオシロスコープで波形測定します。
SCL(クロック)とSDA(データ)をプローブに接続します。
「i2cdetect」が開始して終わるまでの時間で捉えたのが下記波形です。
「0x03」から「0x77」までのアドレスを総当たりでReadしています。
波形をアップして、I2C通信を確認していきます。
EEPROMのアドレスに該当する「0x50」の箇所をアップしています
「黄色のSCL(クロック)」を基準に「青線のSDA(データ)」が動いています。
この例ではアドレス「0x50」に「Read」して「ACK」応答の波形となります。
0-7bitでアドレスの2進数「1010000」16進数だと「0x50」を指定しています。
8bitの箇所でRead/Writeを示し、9bitの箇所でACK/NACKを意味します。
ACKの波形
接続先のアドレスがいたACK応答後の波形を確認します。
EEPROMのアドレスに該当している「0x50」ならばACK(応答信号)の波形が確認できます。
i2cdetectでACK応答後は8bit分データ「0xFF」が返ってきています。
NACKの波形
接続先のアドレスがいないNACK応答後の波形を確認します。
今回は「0x51」のアドレス箇所で確認します。
NACK後はデータが無く、またその後は次のアドレス「0x52」をReadします
まとめ
今回はI2Cの波形を紹介させていただきました。
記事をまとめますと下記になります。
筆者のオシロのRIGOL DS1054Zは趣味の波形測定・解析が十分に測定が可能です。
今回のI2CだけでなくSPI、UARTなど多くの通信に対応できます。
下記記事でまとめて紹介していますので、よろしければご覧ください。(リンク先はこちらから)
コメント