I2C Toolsの簡単な使い方について
I2C Toolsには
- i2cget
- i2cset
- i2cdetect
- i2ctransfer
- i2cdump
というコマンドが同梱されているが、この内
- i2cget
- i2cset
- i2cdetect
についてコマンドの簡単な使い方を記しておく。
i2cdetect
i2cdetectの文法は次の通り:
i2cdetect -V i2cdetect -l i2cdetect -F i2cbus i2cdetect [-y] [-a] [-q|-r] i2cbus [first last]
i2cdetect -Vはバージョン情報を表示して終了する。
i2cdetect -lはI2Cのバスを列挙してくれる。
$ i2cdetect -l
i2c-1 i2c 21a4000.i2c I2C adapter
i2c-2 i2c 21a8000.i2c I2C adapter
i2c-0 i2c 21a0000.i2c I2C adapter
この表示されるi2c-1やi2c-2などのi2c-xのxの部分が接続されているI2Cバスの識別子となっている。
後のコマンドでi2cbusで指定すべきものはこのI2Cバスの識別子となっている。
i2cdetect -F i2cbusはi2cbusに指定されたI2Cバスが行える機能についての情報を表示してくれる
$ i2cdetect -F 1 I2C yes SMBus Quick Command yes SMBus Send Byte yes SMBus Receive Byte yes SMBus Write Byte yes SMBus Read Byte yes SMBus Write Word yes SMBus Read Word yes SMBus Process Call yes SMBus Block Write yes SMBus Block Read yes SMBus Block Process Call no SMBus PEC yes I2C Block Write yes I2C Block Read yes
i2cdetect [-y] [-a] [-q|-r] i2cbus [first last]は指定したi2cbusに対して(firstとlastが0x18などの16進数アドレスで指定されていればfirstからlastまで)Write要求を発行して、反応があったスレーブアドレスを表示する。
-yは対話形式にしないようにするためのオプションで、-aは特別な理由がない限り使わないので無視してよい。
-qはSMBusのQuick Command機能を利用してWriteするように試みているが、必要でなければ使わないほうがよい。
-rはSMBusのRead Byte機能を利用してWrite要求ではなくRead要求でスキャンを試みるているが、Write onlyなデバイスに対してRead要求を行うとロックされて反応が返ってこなくなる可能性があるため、必要にならない限りは使わない方が良い。
したがって基本的な使い方は
$ i2cdetect -y 1
となる。これを実行すると次のような結果が返ってくる
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- UU -- UU -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- 4a -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
4bitを境として、一番左の列はアドレスの上位桁(0x18なら0x10)を表しており、一番上の行はアドレスの下位4桁(0xf8なら0x0x8)を表している。
表中に表示されている4aは反応のあったアドレスを表しており、上位桁と下位桁を併せた表記がなされている。
逆に--は反応がなかったことを表している。
また、UUは反応があったが、ドライバなどによって使用されていることを表している。
i2cget
i2cgetの文法は次の通り:
i2cget -V i2cget [-f] [-y] i2cbus chip-address [data-address [mode]]
-Vはバージョン情報を表示して終了するだけなので、2つ目の文法についてここでは説明する。
i2cbusは/sys/bus/i2c/devicesの下にあるi2c-x(xは数字)というディレクトリのx部分か、i2cdetect -lを実行して表示されるi2c-xのxを指定する。
たとえば、自分の環境であれば、
$ ls /sys/bus/i2c/devices
i2c-0 i2c-1 i2c-2 i2c-3 i2c-4 i2c-5 i2c-6
があったので、i2cbusに1から6までを指定することができる。
-fは強制的に実行する際に用いる。
例えばi2cdetectでUUと表示されたアドレスに対して強制的にそのアドレスにあるスレーブデバイスから強制的に値を読みたい場合などに利用される。
-yはi2cdetectと同じで対話モードを無視するためのオプションとなっている。
chip-addressにはi2cdetectで調べたときに反応があったスレーブアドレスを指定する。
例えば
$ i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- UU -- UU -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- 4a -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
となっている場合には0x4aを指定したりする。
data-addressは利用できるスレーブアドレス下にあるデバイスに対してRead/Writeを行いたいアドレスを指定する。たとえば、WHO_AM_Iレジスタ(0x0f)を読みたい場合は次のようにする
$ i2cdetect -y 1 0x4a 0x0f
最後のmodeには
b: 1バイト読み込むw: 1ワード(16bit)読み込むc: 1ワード書き込んで読み込む
を指定でき、それぞれにプリフィクスとしてpをつけることができる(例: cp)。
pはPEC送信を有効にする場合につける。
i2cset
i2csetの文法は次の通り:
i2cset -V i2cset [-f] [-y] [-m mask] [-r] i2cbus chip-address data-address [value] ... [mode]
i2cset -Vは他と同様バージョン情報を表示して終了し。-f、-yオプションはi2cgetの-f、-yと同じものとなっている。
また、i2cbusやchip-address、data-addressもi2cgetと意味は同じため割愛する。
i2csetはレジスターに値をセットするために使用されるコマンドだが、使用する値はvalueを指定することで実現する。
ただし、複数のバイトを指定したいときにはmodeにsかiを指定する必要がある。
-m maskにはマスク値を指定することができる。
このオプションを指定すると、valueに指定されている値全てに指定したmask値がマスクされるようになっている。
最後のmodeに
- b: 1バイト書き込む
- w: 1ワード(16bit)書き込む
- s: SMBusブロックモードによる書き込み
- i: I2Cブロックモードによる書き込み
を指定することができ、iを除く3つにはpをプリフィクスとして付けることができる(例: cp)。
pはPEC送信を有効にする際に利用する。