denshikobo’s blog

PICプログラミングやPCの操作で感じた日々の由無し事を綴ります

BCM2835ライブラリのバグ?

(2015.10.24)
オシロジのJAVAプログラムはbcmlib_for_javaこれです)を使ってI2C通信を行っています。bcmlib_for_javaは、BCM2835ライブラリ(これ)をJAVAから呼び出すラッパーとして動作しますが、BCM2835ライブラリ(<==root権限で動作する)を直接JAVAプログラムから呼び出す訳ではありません。(子プロセスとして起動し、プロセス間通信を行っている)

オシロの計測データを読み出したとき、I2C通信に問題があることが判りました。

f:id:denshikobo:20151024174721p:plain

1024バイトずつデータを読み出す度に、おかしなことになっています。調べてみると1バイト余計に読み出していました。

この(I2C通信の)不具合が、BCM2835ライブラリのバグなのか、プロセス間の通信処理のバグなのか、はっきりしません。

プログラムを変更して、読み出すデータ数を1023バイトデータにしてみました。
for (int offset = 0; offset < OSCILLO_BUFF_SIZE;) {
//  ret = bcm2835.i2c_read(i2c_buff, 1024);
  ret = bcm2835.i2c_read(i2c_buff, 1023);
  for (int o = 0; o < 1024; o++) {
     oscillo_buff[offset++] = i2c_buff[o];
  }
}

f:id:denshikobo:20151024174712p:plain

改善しましたが、ときどき不連続な部分が現れます。1024バイト目の計測データを読み取っていないことが原因です。

I2Cを読み出し回数と転送データ数が何故一致しないのか?
ソース・コードを見ただけでは、不具合ヶ所は見つけられません。orz

そこで、次善の策として読み出しポインタを一つ戻すコマンド"RCV N"を設け、1024バイト読み出す度に、"RCV N"コマンドを送るようにしてみました。

for (int offset = 0; offset < OSCILLO_BUFF_SIZE;) {
  ret = bcm2835.i2c_read(i2c_buff, 1024);
  for (int o = 0; o < 1024; o++) {
     oscillo_buff[offset++] = i2c_buff[o];
  }
  ret = bcm2835.i2c_write("RCV N" + '\0', 6);
}

f:id:denshikobo:20151024174732p:plain


どうやら、連続した計測データを分割して読み取ることが出来るようになりました。
あくまで緊急避難的な処置ですが、とりあえずこのまま開発を続けようと思います。

オシロジが完成したところで、(I2C通信の信号をモニタしながら)あらためてデバッグします。