I2C接続のデバイスのレジスタ内容表示

更新日 2021-10-04 (月) 10:51:31
作成日 2021年10月04日

ArdiunoにI2Cで接続しているデバイス(例 BEM-280)のレジスタの内容を表示する。
また、レジスタアドレスを指定して1Byteデータを書き込む

プログラム

I2Cのスレーブに書き込みのWireの手順

  1. Wire.beginTransmission(addr) : 接続するI2Cのモジュールのアドレスを指定
  2. Wire.write(reg) : I2Cのモジュールの書き込みレジスタアドレスを指定
  3. Wire.write(value) : 2.のレジスタにデータを書き込む
  4. Wire.endTransmission() : 送信を完了しI2Cバスを開放

I2Cのスレーブから読み込みのWireの手順

  1. Wire.beginTransmission(addr) : 接続するI2Cのモジュールのアドレスを指定
  2. Wire.write(reg) : I2Cのモジュールの読み込みレジスタアドレスを指定
  3. Wire.endTransmission(false) : 送信完了し、コネクションだけ維持させる
  4. Wire.requestFrom(adr, size) : IC2のモジュールから 2.で指定したアドレスから指定サイズ分のデータ取得を要求
  5. Wire.read() : 2.のレジスタからのデータを取得する。 4.で指定したサイズ分繰り返しで取得する
  6. Wire.endTransmission() : 送信を完了しI2Cバスを開放

注) アドレス指定してか書き込むときはレジスタアドレスは、小さいほうから書き込む必要があるみたい

  • IC2_ReadData.ino
// I2Cスレーブからデータの読み込み
// I2Cのアドレス 0x76
// レジスタアドレス 0x2F 0x4F 0x5Fに1byteデータを書き込む 
// レジスタ 00からFFまでを読み込んで表示する
//

#include <Wire.h>
int i =0;
char buf[8];
void setup() {

  Wire.begin();
  Serial.begin(9600);
 

  //以下のようにアドレス指定してか書き込むときはレジスタアドレスは
  //小さいほうから書き込む必要があるみたい
  
  //指定レジスタアドレス(0xF2)にデータ(0x01)を書き込む
  Wire.beginTransmission(0x76);
  Wire.write(0xF2);
  Wire.write(0x00);
  Wire.endTransmission();
  //指定レジスタアドレス(0xF4)にデータ(0x27)を書き込む
  Wire.beginTransmission(0x76);
  Wire.write(0xF4);
  Wire.write(0x01); // 0x01 センサー強制モード
  Wire.endTransmission();
  //指定レジスタアドレス(0xF5)にデータ(0xa0)を書き込む
  Wire.beginTransmission(0x76);
  Wire.write(0xF5);
  Wire.write(0x00);
  Wire.endTransmission();
 
  // Serial.println("\t 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f");
  }

void loop() {
  // I2Cのアドレスを指定
  Wire.beginTransmission(0x76);
  // 読み出すレジスタのアドレスを指定
  Wire.write(i);
  // 送信を完了するが、コネクションは維持する
  Wire.endTransmission(false);
  // I2Cのアドレス0x76から1Byteリクエスト
  Wire.requestFrom(0x76, 1);
  
 // while (Wire.available()) {
   //
    Wire.available();
    if ( i == 0) {
      Serial.println();
      Serial.println("\t ----------------------------------------------");
      Serial.println("\t 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F");    
    }
    if (i %16 == 0){
      
      Serial.println (" ");
      Serial.print ("    ");
      sprintf(buf,"%02x", i);
      Serial.print (buf);
      Serial.print (":  ");
    }
    
    //Wire.requestFromの指定内容を受信する
    byte val = Wire.read();
   
    sprintf(buf,"%02x", val);
    Serial.print(buf);
    Serial.print(" ");

    // 送信を完了しI2Cバスを開放
    Wire.endTransmission();

    i++;
    if (i == 256) i=0;
 // }
    
  delay(100);
}

実行結果

	 ----------------------------------------------
	 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F

   00:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  
   10:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  
   20:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  
   30:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  
   40:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  
   50:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  
   60:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  
   70:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  
   80:  87 70 89 53 a3 31 28 06 e8 6d 33 67 32 00 86 92  
   90:  1e d6 d0 0b 1a 25 70 ff f9 ff ac 26 0a d8 bd 10  
   a0:  00 4b 5c 00 00 00 00 00 00 00 00 00 33 00 00 c0  
   b0:  00 54 00 00 00 00 60 02 00 01 ff ff 1f 60 03 00  
   c0:  00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 00  
   d0:  60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  
   e0:  00 65 01 00 14 0c 00 1e 40 41 ff ff ff ff ff ff  
   f0:  ff 00 00 04 00 00 00 80 00 00 80 00 00 80 00 80 
	 ----------------------------------------------
	 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F

参考

BME-280データシート

I2Cでのアクセス


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-10-04 (月) 10:51:31 (12d)