みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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でスレーブデバイスの値を書き換えることが出来ますでしょうか?何卒ご教授よろしくお願い致します.

投稿日時 - 2017-05-16 19:40:10

QNo.9330052

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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;
}

投稿日時 - 2017-05-18 01:09:15

ANo.1

http://www.tij.co.jp/jp/lit/ds/symlink/ina231.pdf
0x4127の事例しか記載が無いけれど?

0x4227にする事で何の設定をしたいのでしょう?
頭の4はどーやら固定らしい?(解説が見当たらない?)
次の2はアベレージか?
でも2にしちゃうとVBUS CT: がゼロになるけど?
CONVERSION TIMEが140μsになるだけみたいだが
ただ、それが受け付けられていない可能性も否定できないし
と、言う訳で

ダメ元で
「0x4327」にしてみては?
アベレージのみ変更でその他はサンプルの通り

投稿日時 - 2017-05-16 21:43:02

お礼

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

投稿日時 - 2017-05-16 22:28:51

あなたにオススメの質問