バージョン管理された人

subversionで管理されてます

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-1i2c-2などのi2c-xxの部分が接続されているI2Cバスの識別子となっている。 後のコマンドでi2cbusで指定すべきものはこのI2Cバスの識別子となっている。

i2cdetect -F i2cbusi2cbusに指定された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に対して(firstlastが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-xxを指定する。 たとえば、自分の環境であれば、

$ ls /sys/bus/i2c/devices
i2c-0  i2c-1  i2c-2  i2c-3  i2c-4  i2c-5  i2c-6

があったので、i2cbus1から6までを指定することができる。

-fは強制的に実行する際に用いる。 例えばi2cdetectUUと表示されたアドレスに対して強制的にそのアドレスにあるスレーブデバイスから強制的に値を読みたい場合などに利用される。

-yi2cdetectと同じで対話モードを無視するためのオプションとなっている。

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と同じものとなっている。 また、i2cbuschip-addressdata-addressi2cgetと意味は同じため割愛する。

i2csetレジスターに値をセットするために使用されるコマンドだが、使用する値はvalueを指定することで実現する。 ただし、複数のバイトを指定したいときにはmodesiを指定する必要がある。

-m maskにはマスク値を指定することができる。 このオプションを指定すると、valueに指定されている値全てに指定したmask値がマスクされるようになっている。

最後のmode

  • b: 1バイト書き込む
  • w: 1ワード(16bit)書き込む
  • s: SMBusブロックモードによる書き込み
  • i: I2Cブロックモードによる書き込み

を指定することができ、iを除く3つにはpをプリフィクスとして付けることができる(例: cp)。 pはPEC送信を有効にする際に利用する。