• 締切済み

ArduinoのI2Cで書き込み

Arduino(Lazurite)を用いてINA231というICとI2Cで通信するプログラムを作成しています.マスタがArduino,スレーブがINA231です. INA231のレジスタアドレスの値を読み取ることはできましたが,レジスタの値を書き換えることが出来ません. 書き込み用の関数は以下のsetINA231になります. void setINA231(char SlaveAddress,const unsigned char *WriteData,char s){ Wire.begin(); Wire.beginTransmission(SlaveAddress); Wire.write(WriteData,s); Serial.write_byte(Wire.endTransmission(true)); } 上記関数を使用して,例えばスレーブアドレス0x40のレジスタアドレス0x00の値を0x4227に書き換えるように値を設定して関数を実行したところ,添付図の波形を取得出来,問題なく通信出来ているように感じます. どのようにすればI2Cでスレーブデバイスの値を書き換えることが出来ますでしょうか?何卒ご教授よろしくお願い致します.

みんなの回答

  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.2

Wire.begin(); は、初期設定なので、setup() 内に記述します reg_read() , reg_write() 関数サンプルを書いてみました ( arduino master <-> slave でテスト) void reg_write( unsigned char adr , unsigned int dat ){ Wire.beginTransmission( sla_adr ); Wire.write( adr ); Wire.write( highByte( dat ) ); Wire.write( lowByte( dat ) ); Wire.endTransmission(); } unsigned int reg_read( unsigned char adr ){ unsigned int dat=0; Wire.beginTransmission( sla_adr ); // reg address set Wire.write( adr ); Wire.endTransmission(); Wire.requestFrom( sla_adr , 2 ); // reg data read if ( Wire.available() >= 2 ){ dat = Wire.read()*256 + Wire.read(); } return dat; }

  • lumiheart
  • ベストアンサー率47% (1141/2405)
回答No.1

http://www.tij.co.jp/jp/lit/ds/symlink/ina231.pdf 0x4127の事例しか記載が無いけれど? 0x4227にする事で何の設定をしたいのでしょう? 頭の4はどーやら固定らしい?(解説が見当たらない?) 次の2はアベレージか? でも2にしちゃうとVBUS CT: がゼロになるけど? CONVERSION TIMEが140μsになるだけみたいだが ただ、それが受け付けられていない可能性も否定できないし と、言う訳で ダメ元で 「0x4327」にしてみては? アベレージのみ変更でその他はサンプルの通り

con014057
質問者

お礼

ご回答ありがとうございます. 設定上無効な値を書き込もうとしたため,書き込めないという可能性を考えておりませんでした. しかし,試しに0x4327を書き込んでみましたが,結果は変わらず0x4127が返ってきました... 頭はICのリセットを実行する時以外は4のようです.

関連するQ&A