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).
って、いかにも 0xB4
と 0xB5
が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と話せていそう。