Arduinoのi2c波形をロジアナで測定する
こんにちわ、くろべこです。
以前に格安中華のロジアナを使った記事を紹介しました。
フリーソフトは【PlseView】というものを使いましたが、意外とこれが使いやすくて様々な通信プロトコルに対応しておりました。
今回は、身近な通信方式I2C(Inter-Integrated Circuit)の波形を確認したいと思います。
本記事で紹介すること
- I2C通信フォーマット概要
- PluseViewでのI2C波形の確認方法(設定)
- PluseViewでのI2C波形の確認方法(測定)
I2C通信フォーマット概要
おなじみのI2C通信のおさらいになります。
I2Cとはシリアルバス通信の一種で主にセンサなどの近距離通信に使用されることが多いです。
通信速度は標準(100kbps),高速(400kbps)となっており、信号線は同期用のクロック(SCL)と読み書きを行うデータ(SDA)の2線通信になります。
スレーブは複数台バス接続可能であり、アドレスにより区別します。
そして本項の主題となる通信フォーマットなのですが、1バイト毎の通信方式であり基本フォーマットが決められております。
■I2C通信フォーマット(TCS34725データシート参考)
- Start condition: SCL(クロック)がHIGHの時にSDA(データ)がHIGH⇒LOW
- Stop condition: SCLがHIGHの時にSDAがLOW⇒HIGH
上記のStart condition ~ Stop conditionの間にデータのやり取りを行います。データはSCLのLOWの時にデータの変化を行いSCLがHIGHの時にデータが定義(1 or 0)されます。SCLがHIGHの時にDATAが変化するのはStart condition と Stop conditionのみです。
次に、I2Cの通信プロトコル(取り決め)は2番目の図になります。Start conditionの後は通信対象の7bitスレーブアドレスに接続を行い、LSBにWrite(書き込み)では0をRead(読み取り)では1を付けて8bitのデータとします。次に続くのはI2Cデバイス(ここではTCS34725)固有のコマンド⇒データになります。
以上がI2Cの通信方法でコマンドや書き込みデータ、レジスタ番号などは変わりますがI2Cフォーマットやプロトコルは基本的には変わりません。
ロジアナの設定(I2Cモニタ)
本題のI2C波形のモニタに入りたいと思います。使用するツールは【Pulse view】です。
デバイスのコネクションが完了し下記の画面からスタートします。まず、赤で囲んだ部分をクリックしましょう。
赤枠をクリックすると右端に検索ボックスが出ると思うので【i2c】と入力してみてください。以下のようなウィンドウが出ると思うので【Inter-Integrated-Circuit】をダブルクリックします。
波形画面にI2Cの列が出るかと思います。I2Cの矢印をクリックしてSCLとSDAをモニタしている番号を登録します。
これでI2C波形をモニタする準備は完了です。
I2C書き込み波形をモニタする
■固有IDを読み取ってみる
今回はデモ機として先ほども使用したカラーセンサ(TCS34725)を使用したいと思います。このI2Cデバイスには自分自身の固有IDを格納しているレジスタがあります(以下の図)。
今回は【TCS34725】を使用しているので0x44が格納されているはずです。では、早速確認していきます。I2Cプロトコルはレジスタ指定の読み取りになります。
<<デモコード:ID-Register(0x12)読み取り >>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <Wire.h> const int ADDRESS=0x29;//TCS34725アドレス uint8_t id; void setup() { Serial.begin(9600); Serial.print("I2Cアドレス:");Serial.println(ADDRESS,HEX); Wire.begin();//I2Cマスター初期化 Wire.beginTransmission(ADDRESS); Wire.write(0b10000000|0x12);//ID Register Wire.endTransmission(); Wire.requestFrom(ADDRESS, 1);//スレーブアドレスに1バイト読み取り要求 while(Wire.available()){ id = Wire.read(); } Serial.println(id,HEX);//TCS34725固有ID } void loop() { } |
<<I2C波形読み取り>>
S(Start condition), P(Stop condition)となっております。
まず、7bitアドレス(0x29)が書き込まれLSB(1)で読み取り指定されています。その後の読み取りデータが【0x44】となっており、ID-Registerの値が正常に読み取れたことが分かります。
ちなみに、ACK/NACKとは確認信号です。
上記の場合、スレーブアドレスの読み取り要求を書き込み、それに対してスレーブ側から【了解】の信号を返します。具体的にはスレーブがSDAをLOWに立ち下げることでACKとしています。
次に、マスター側がスレーブからIDのデータを1バイト受信要求しました。そして、正常に1バイト受信出来たらマスターは【完了】信号を返します。具体的にはマスターがSDAをHIGHにすることでNACKとしています。
■レジスタに書き込みを行ってみる
デモとしてControl Register (0x0F)への書き込みを行います。このレジスタはカラーセンサのゲインを決定するものです。ここはとりあえず4×gain(01)を書き込んでみます。
I2Cプロトコルはレジスタ指定の書き込みになります。
<<デモコード:Control-Register書き込み >>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <Wire.h> const int ADDRESS=0x29;//TCS34725アドレス uint8_t id; void setup() { Serial.begin(9600); Serial.print("I2Cアドレス:");Serial.println(ADDRESS,HEX); Wire.begin();//I2Cマスター初期化 Wire.beginTransmission(ADDRESS); Wire.write(0b10000000|0x0F);//Register指定コマンド+Control Register Wire.write(0b00000001);//4×gain指定。2bit~7bit:0 Wire.endTransmission(); } void loop() { } |
<<I2C波形読み取り>>
7bitスレーブアドレス+LSB(0)書き込みとなっており、続いてコントロールデータが送られています。そして、書き込みデータ【0x01】が書き込まれていることが分かります。
スレーブからも正常にACKも確認されており正常にI2C通信が行われております。
おわりに
今回は格安ロジアナでI2Cの読み取り/書き込み波形を読み取ってみました。
波形だけではなくStart condition/Stop conditionや各読み取り/書き込みデータも波形に記載してくれることはGOODですね。
I2CのほかにもSPIやUART信号にも対応しており電子工作にはとっても便利なツールになっています。ロジアナ自体も1000円くらいなので1個持っておくと結構便利だという事が分かりました!!
コメント