Linux 上の LL で I2C する (Ruby)
なんとなく i2c-dev.h とかで定義されているAPIを呼ばないと使えないのかなあと思っていたけど、デバイスファイルの読み書きと ioctl だけで普通に使うことができた。
書きこみ
- /dev/i2c-1 とかを rw+ で open
- ioctl で I2C_SLAVE コマンドを使ってスレーブアドレスを指定する
- write する
I2C 的には START -> SLAVE + W -> DATA送信 -> STOP が行われる。
読みこみ
- /dev/i2c-1 とかを rw+ で open
- ioctl で I2C_SLAVE コマンドを使ってスレーブアドレスを指定する
- 読みこみたいアドレスを write する
- read す
I2C 的には START -> SLAVE + W -> DATA送信 -> ReSTART -> SLAVE + R -> DATA受信 -> STOP が行われる。
たぶん一度 write/read するたびに Repeated Start が送られるのかな。
Ruby での例
Ruby でやる場合以下のような感じでいけた。デバイスによってはうまくいかないかもしれない。
class I2CDevice
# ioctl command
# Ref. https://www.kernel.org/pub/linux/kernel/people/marcelo/linux-2.4/include/linux/i2c.h
I2C_SLAVE = 0x0703
attr_accessor :address
def initialize(address)
@address = address
end
def i2cget(address)
i2c = File.open("/dev/i2c-1", "r+")
i2c.ioctl(I2C_SLAVE, @address)
i2c.write(address.chr)
ret = i2c.read(1).ord
i2c.close
ret
end
def i2cset(*data)
i2c = File.open("/dev/i2c-1", "r+")
i2c.ioctl(I2C_SLAVE, @address)
i2c.write(data.pack("C*"))
i2c.close
end
end
関連エントリー
- AVR TWI (I2C) 用のライブラリ そこそこ使いやすい感じなのを学習しながら書いてみた。 https://github.com/cho45/avr-utils/blob/mas...
- ruby-serialport で任意のボーレートを設定するには (ただし Linux に限る) ruby serialport は、このあたりで設定できるボーレートを列挙していて、これら以外のボーレートを設定できないようです (unkn...
- GPIO (sysfs) を使ったソフトウェア I2C 普通の GPIO 経由で I2C できたらなんとなく嬉しいかなと思って作ってみた。つまりソフトウェアでピン状態をいじって I2C 通信すると...
- AVR で USB 接続の PC キーヤーを作る PC からモールス符号を発生させて無線機に入力するものが欲しいと思っていた。当然既にそういうのはあるんだけど、どうも気に入るのがないので、必...
- Ruby で sysfs 経由での GPIO 操作 GPIO の操作はいろいろやる方法があるみたいだけど、LL からだと sysfs への IO を行うのが一番簡単っぽい。以下のような感じでか...
