So-net無料ブログ作成
検索選択

Raspberry Pi用pigpio Library - その8 [Raspberry Pi]

pigpioライブラリの概観(その1その2その3その4その5その6その7)の続き。今日はBitbang SPI、I2C、シリアルについて。

2.8  bit bang SPI

pigpioならではの機能で、正確なPWMを作るのと同じやり方で、任意のGPIOピンを使ってSPI通信ができる。要するにSoCはSPI用ハードウェアを持っているけど、ソフトウェアでエミュレートしようというもの。そういうのをbit bangというらしい。
int bbSPIOpen(unsigned CS, unsigned MISO, unsigned MOSI, unsigned SCLK, unsigned baud, unsigned spiFlags);
int bbSPIClose(unsigned CS);
int bbSPIXfer(unsigned CS, char *inBuf, char *outBuf, unsigned count);
まずbbSPIOpenでチップセレクト、MISO、MOSI、SCLKにどのピンを使うか、それからクロック周波数とフラグを指定する。

baudには50Hzから250kHzまで指定できるらしい。
spiFlagsは
21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
 0  0  0  0  0  0  R  T  0  0  0  0  0  0  0  0  0  0  0  p  m  m
で、spiOpen()でのサブセットである。

クローズではチップセレクトに使ったピン番号を指定すれば閉じることになっているらしい。

これを使うとそれなりのスピードではあるけど、Raspberry Pi1台で最大8束のSPIバスをバラバラに使えるということになる。何に使えるかというとなかなか思いつかないし、実際に8バスをそれぞれ別のスレッドでやり取りしたらCPUもかなり食うだろうと思うけど、まったくもって、面白い。

例えば16ビットぐらいの高精度だけど低速のA/Dコンバータをたくさんつなぎたい、という場合に使える、ということだろう。

2.9  I2C

pigpioライブラリでのSPIはレジスタを直接叩いていたけど、I2Cはカーネルモジュールを使っている。
int i2cOpen(unsigned i2cBus, unsigned i2cAddr, unsigned i2cFlags);
int i2cClose(unsigned handle);
int i2cWriteQuick(unsigned handle, unsigned bit);
int i2cWriteByte(unsigned handle, unsigned bVal);
int i2cReadByte(unsigned handle);
int i2cWriteByteData(unsigned handle, unsigned i2cReg, unsigned bVal);
int i2cWriteWordData(unsigned handle, unsigned i2cReg, unsigned wVal);
int i2cReadByteData(unsigned handle, unsigned i2cReg);
int i2cReadWordData(unsigned handle, unsigned i2cReg);
int i2cProcessCall(unsigned handle, unsigned i2cReg, unsigned wVal);
int i2cWriteBlockData(unsigned handle, unsigned i2cReg, char *buf, unsigned count);
int i2cReadBlockData(unsigned handle, unsigned i2cReg, char *buf);
int i2cBlockProcessCall(unsigned handle, unsigned i2cReg, char *buf, unsigned count);
int i2cReadI2CBlockData(unsigned handle, unsigned i2cReg, char *buf, unsigned count);
int i2cWriteI2CBlockData(unsigned handle, unsigned i2cReg, char *buf, unsigned count);
int i2cReadDevice(unsigned handle, char *buf, unsigned count);
int i2cWriteDevice(unsigned handle, char *buf, unsigned count);
void i2cSwitchCombined(int setting);
int i2cSegments(unsigned handle, pi_i2c_msg_t *segs, unsigned numSegs);
int i2cZip(unsigned handle, char *inBuf, unsigned inLen, char *outBuf, unsigned outLen);
僕はまだI2Cで通信するデバイスを使ったことがないので、よくわからないけど、だいたい何をしようとしてるのかぐらいはわかる。Raspberry PiでI2Cを普段から使ってる人には名前で十分理解できるだろうと思われる。

さらにSPIと同じようにbit bang I2Cがある。
int bbI2COpen(unsigned SDA, unsigned SCL, unsigned baud);
int bbI2CClose(unsigned SDA);
int bbI2CZip(unsigned SDA, char *inBuf, unsigned inLen, char *outBuf, unsigned outLen);
SDAとSCLに使うピン番号を指定する。ボーレートが500kbpsまでなのでI2C規格の400kbpsまでのfast modeならこのまま使えることになっている。普通のDIPパッケージのデバイスを繋ぐならbit bangで十分ということになる。

2.10  シリアル通信

シリアルデバイスの読み書き。
int serOpen(char *sertty, unsigned baud, unsigned serFlags);
int serClose(unsigned handle);
int serWriteByte(unsigned handle, unsigned bVal);
int serReadByte(unsigned handle);
int serWrite(unsigned handle, char *buf, unsigned count);
int serRead(unsigned handle, char *buf, unsigned count);
int serDataAvailable(unsigned handle);
これはデバイスファイルを指定するので、実質的にunixのopen()、read()、write()、close()のラッパである。

デバイスファイルとしては
/dev/tty
/dev/serial
で始まる名前のものだけ(例えば/dev/tty1とか/dev/ttyAMA0とか)しか使えないようになっている。

2.11  bit bangシリアル

そして当然例によってbit bang serialがある。
gpioSerialReadOpen(unsigned user_gpio, unsigned baud, unsigned data_bits);
int gpioSerialReadClose(unsigned user_gpio);
int gpioSerialReadInvert(unsigned user_gpio, unsigned invert);
int gpioSerialRead(unsigned user_gpio, void *buf, size_t bufSize);
しかし、なぜか読む関数しか用意されていない。書くのはこの後取り上げるwaveformでやればいい、ということになっているようである。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。
メッセージを送る