どうもミソジです。
今回は筆者が持っているラズベリーパイとI2Cデバイスをつなげてアナライザを使いI2CのACKとNACKの波形を見てみる」を紹介します

簡単にI2C通信でのACK,NACKを確認するまでの手順を紹介しています。
「自分でI2Cを色々解析してみたい!」という方におススメな記事となっています

目次
1.ラズベリーパイとI2Cデバイスをつなげてみる
2.アナライザを用意する
3.アナライザを使ってI2Cの波形を確認する
4.I2Cの解析してACK/NACKを見てみる
5.まとめ・感想

1.ラズベリーパイとI2Cデバイスをつなげてみる
まずはI2C通信の環境をラズベリーパイを使って作っていきます
ラズベリーパイでのI2Cの動かし方は既に先人たちにより多くの記事がありますので省略したいと思います。「ラズベリーパイ I2C」とググれば多くの参考になる記事がありますので、そちらを参考にしてください

実際につなげた写真がこちらとなります。
「ラズベリーパイ」「I2Cデバイスを2つ(EEPROMと加速度センサ)」接続しています
sP_20180512_095551.jpg

筆者のは少し型が古いラズベリーパイですが、I2Cをつなぐのは新旧ともに簡単にできます。

EEPROMの詳細は下記となります。
EasyWordMall AT24C256 I2C インターフェースEEPROMメモリモジュール
Apple Trees E-commerce co., LT






加速度センサの詳細は下記となります







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

そしてラズベリーパイを設定・起動して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: -- -- -- -- -- -- -- --      
~~~~~~~~~~~~~~~~~~~~~~~~~~~~


アナライザを使って波形を確認したのを次章から紹介してきたいと思います

2.アナライザを用意する
I2Cの波形を見たいと思いますが、今回はACKとNACKを見ますのでアナライザを使って確認していきます。最近はI2CやSPIなど数MHz,数十MHz程度の解析するアナライザが1000円足らずで買えます。

筆者は色々触りたかったのでモジュール化されていないアナライザの開発ボードを買いました。(値段は一番安く多くのピンで遊べますが、EEPROMなどの設定が必要ですのでマイコン初心者は少し難しいかもしれません)
sP_20171104_120005.jpg

本当にマイコン(サイプレス製CY7C68013A)が載っているだけのボードです。PCとUSB経由で接続して解析することができます。詳細は下記になります
MiniUSBケーブルとジャンパーワイヤは別で購入が必要です



但し数百円の差ですので下記のようなモジュールになっているアナライザを買った方が直ぐに測定できて楽できるかと思います。PCとUSB接続してI2C,UART,SPIなど多くの通信を解析できます。
USBケーブル、ジャンパーワイヤまで付いてきますので単に解析するだけならば筆者的には下記をおススメします





「スポンサーリンク」

3.アナライザを使ってI2Cの波形を確認する
アナライザをSCL、SDAの箇所に接続して「i2cdetect」しているときの波形を確認します。
実際行ったときの写真が下記です
sP_20180401_135924.jpg

回路ベースですと下記箇所「SDA」「SCL」をアナライザに繋げています。
i2c100.PNG

そして実際にとれた波形の一部が下記です。無事SDA、SCLの波形を取れました
i2c102.PNG

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


これでアナライザで無事波形取ることができました。

4.I2Cの解析してACK/NACKを見てみる
それではI2Cのデータの解析を行っていきます。解析する設定をI2Cに設定します
i2c101.PNG


解析設定するだけでI2Cのビット情報、そしてデータの「アドレス」「R/W」「ACK/NACK」が確認できました。
i2c104.PNG


これでACK,NACKが確認できるようになりました。
それではACK,NACK時のSDA,SCLの波形を確認していきたいと思います

先ほども記載しましたが、デバイスのアドレスがある箇所はi2cdetectで読み取れている(ACKが返ってきている)ということなので、今回の例では下記2例を見ていきたいと思います
①ACKが出てると思われるアドレス「50」
②NACKになっているアドレス「03」

赤字の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: -- -- -- -- -- -- -- --      
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

①ACKが出てると思われるアドレス「50」
狙い通りEEPROMから「ACK」が返ってきてデバイスがあることを確認できました。
i2c105.PNG

ACKの箇所のアップが下記となります。
Readの後にデバイス側からSDAをLow(1⇒0)に出力していて、ACKが返ってきている形となっています
i2c106.PNG


②NACKが出ているアドレス「03」
やはり何もデバイスが無いためReadしても何も反応がなくNACKと判断しています
i2c104.PNG

NACK箇所のアップは下記となります。
Read後にデバイス側から何も出力がされずHi(1)のままとなっておりNACKという形になっています
i2c107.PNG


5.まとめ・感想
どうでしたでしょうか、最近では1000円足らずでI2Cを測定・解析することができます。
今回はi2cdetect時のACKとNACKに焦点を当てていましたが、応用すればR/W時のI2Cのスタートからストップまでのデータも詳細に確認できます。

データシート見て確認するのもいいですが、やはり実物の波形見ることでよりI2Cの理解が深まると思います。よろしければ皆様もアナライザを購入して確認してみてください

<<20180813追記>>
I2Cとは別にSPIのCS,MOSI,MISO,SCLKの波形を見てみた記事をアップしました。

SPIのCS,MOSI,MISO,SCLKの波形を見てみた」
リンク先はこちらからです。よろしければこちらもご確認ください
sP_20180715_014939.jpg


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


1000円足らずでアナライザが購入できます
HiLetgo 24MHz 8チャンネル USBロジックアナライザ 8CHロジックアナライザ UART IIC SPI デバッグ MCU FPGA ARMに対応 [並行輸入品]
HiLetgo






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

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