LinuxからI2Cをツンツンする

Posted on

ClearFogのmikroBusを叩きたいけど、Linux用のライブラリなんてものは無さそうなので直接I2Cを叩いてみる。

mikroBusとは

1列8ピンのソケットが2つ並んだ独自ピン配置を持つペリフェラル増設用の規格。 ピンには、SPI、UARTおよびI2C、GPIOと電源が出ている

試すボード

高輝度白色LEDを2発積んでいるボードを試してみた。基板上には、MicrochipのMIC2870を積んでいてI2Cで制御する。

Linux側の準備

1
2
3
4
5
6
7
8
$ demsg | grep i2c
[    0.664254] i2c /dev entries driver

$ lsmod | grep i2c
mdio_i2c               16384  1 sfp

$ ls /dev/i2c-*
/dev/i2c-0  /dev/i2c-1

なのでツールだけインストールしておく

1
$ sudo apt-get install i2c-tools

試しにI2Cポードを確認。

1
2
3
$ sudo i2cdetect -l
i2c-1    i2c       mv64xxx_i2c adapter             I2C adapter
i2c-0    i2c       mv64xxx_i2c adapter             I2C adapter

接続の確認とレジスタの読み出し

MIC2870のドキュメントには、

The MIC2870 responds to a slave address of hex 0xB4 and 0xB5 for write and read operations respectively, or binary 1011010X (where X is the read/write bit).

って、いかにも 0xB40xB5 がI2Cのスレーブアドレスかのように書いてあるけど、これは、Read/Writeのフラグも含めた値なので注意。最下位1ビットがRead/Writeのフラグなので 0FE でマスクして1ビット右にシフトするとアドレスになる。

1
(0xB4 & 0xFE) >> 1 = 0x5A

なので、MIC2870のスレーブアドレスは 0x5A ということになる。

i2cdetect コマンドでペリフェラルを一覧してみる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
$ sudo i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- 4c -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- 5a -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

今回のボード(5a)は /dev/i2c-1 にぶら下がっているのが分かる。MIC2870が実際にそこに居るか、レジスタを読んでみる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ sudo i2cget -y 1 0x5a 0
0x00

$ sudo i2cget -y 1 0x5a 1
0xe0

$ sudo i2cget -y 1 0x5a 2
0x00

$ sudo i2cget -y 1 0x5a 3
Error: Read failed

MIC2870の有効なレジスタアドレスは、0から3までなので、なんとなくMIC2870と話せていそう。