Rasberry PIのI2Cコマンド詳解

Contents:

はじめに

RasberryPIは容易にI2Cバスに機器が容易に接続でき、また、 Linuxからのアクセスコマンドが充実している。

i2cget等のコマンドについて、実際にどのようなI2Cコマンドが発行されているのかを知る。

i2cget

構文

i2cget [-f] [-y] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]

c MODE - 書きこんでから読みだし

../_images/pi_i2c_001.jpg
sudo i2cget -y 1 0x20 0x02 c

このオプションは特定のアドレスに指定したバイトを書き込んでから、そのアドレスからデータを読み込む。 例では、0x20というスレーブに0x02を書き込んだ後、0x20に対してRead要求を発行する。

まず、マスタ側から指定したデータのWriteが送られる。 スレーブはWriteの次のビットでSDAをLOWに固定し、A-ACK(Addressに対するACK)を返す。 次にアドレスへの書き込みデータが送信される。 スレーブはWriteの次のビットでSDAをLOWに固定し、D-ACK(DATAに対するACK)を返す。 マスタは以上でスレーブへの書き込みを行う。

次に、マスタ側から指定したデータのReadが送られる スレーブはReadの次のビットでSDAをLOWに固定し、A-ACK(Addressに対するACK)を返す。 次にスレーブはデータを帰す。 その後、マスターはNACKを返す。 マスタは以上でスレーブからの読み込みを行う。

オプションなし - 読み込みのみ

sudo i2cget -y 1 0x20

マスタ側からRead要求がデバイスに対して発効される。 直後に(図ではReadの次の)スレーブからACKが返ってきて、 引き続き、スレーブはデータを返す。

i2cset

b MODE - バイトでの通常書き込み

../_images/pi_i2c_003.jpg
i2cset [-f] [-y] [-m MASK] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]
sudo i2cset -y 1 0x20 0xff 0x01 b

マスタ側からWrite要求がスレーブに対して発行される。 その直後、マスタ側からアドレスの指定が為され、 引き続き、アドレスへの書き込みデータが送信される。

i MODE - 連続した書き込み

../_images/pi_i2c_004.jpg
sudo i2cset -y 1 0x20 0xff 0x01 0x02  i

マスタ側からWrite要求がスレーブに対して発行される。 その直後、マスタ側からアドレスの指定が為され、 引き続き、アドレスへの書き込みデータが「連続して」なされる。

e mode

../_images/pi_i2c_005.jpg
sudo i2cset -y 1 0x20 0xff 0xff 0x88 e
// 以下のコマンドと等価
sudo i2cset -y 1 0x20 0xff 0x02 0xff 0x88 i

基本的にはiと同様の送出が行われる。 ただし、アドレス送出の後、0x02というバイト列が送出される。 実効的に0x02を送出したコマンドと同様になる。

i2cdump

../_images/pi_i2c_006.jpg
sudo i2cdump -y 1 0x20

このコマンドは特定のスレーブアドレスに対して0x00から0xffまで、Read命令を連続的に送出する。 図のスレーブデバイスはread要求したアドレスをそのまま返すため、 同じデータを返している。

i2cdetect

通常モード

../_images/pi_i2c_007.jpg
sudo i2cdetect -y 1 0x1c 0x22                       [~]
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:
10:                                     -- -- -- --
20: 20 -- --
30:
40:
50:
60:
70:

マスタは書くアドレスに対してWrite要求を送出する。 図では0x1cから0x22までをdetectでスキャンしている。 スレーブデバイスはWrite要求に応答できる場合、 Write要求に対してSDAをLOWに固定(ACK)する。 マスタは書くアドレスLWrite要求送出後の SDAがHIGHの場合、NACK(=スレーブデバイスがいない)とし、 SDAがLLOWの場合、ACK(=スレーブデバイスがいる)とする。 そして、その結果を出力している。g

r MODE - Readでの試行

../_images/pi_i2c_008.jpg
sudo i2cdetect -y -r 1 0x1c 0x22

この命令はWrite要求の代わりに、Read要求で同様の処理を行う。 ただし、Read要求では、スレーブはACKを返した(=SDAをLOWにひっぱる)後にデータを返す。