0

出力: - 私が得ているのは、すべてのレジスタ (磁力計に対応) の読み取りで 0xFF です。一方、加速度計とジャイロスコープのレジスタには完全にアクセスできます。i2c マスター モードを無効にし、i2c バイパス モードを有効にしてシステムを初期化しました。以下は、システムを初期化するために使用したコードです:-

single_byte_write(0x6B,0x01);
single_byte_write(0x19,0x01);
single_byte_write(0x1A,0x02);
single_byte_write(0x1B,0x11);
single_byte_write(0x1C,0x10);
single_byte_write(0x6A,0x00);
single_byte_write(0x37,0x02);

('single_byte_write(address,data) は、'address' をスレーブ アドレスとして 0x69' としてレジスタにデータ バイトを書き込みます)

accelのレジスタにアクセスしました。そしてジャイロ。次のように:- single_byte_read(0x75,wia_mpu); これは、who_i_am レジスタとして正しい 0x68 を返します。しかし、磁力計レジスタに次のようにアクセスしようとしたとき:- single_byte_read_compass(0x00,wia_compass); 0xFF を返しますが、0x48 を返す必要があります。

single_byte_read_compass()/single_byte_write_compass() が正しく動作することを確認するために、これらの関数を使用してスレーブ アドレスを変更し ('0x0C' から '0x69' に)、accel のレジスタにアクセスしました。そしてジャイロ。そしてそれは正しく機能しました。

(「single_byte_read()」と「single_byte_read_compass()」の違いは、前者はスレーブ アドレスを「0x69」として使用し、後者は「0x0C」をスレーブ アドレスとして使用することです。「0x0D」、「0x0E」も試しました。 ' および '0x0F' をスレーブ アドレスとして使用しましたが、出力は同じままでした)。

また、MPU9150 がパススルー モードになっているかどうかも確認しました。ピン 'ES_DA' (ピン 6) と SDA (ピン 24) の出力をオシロスコープを使用して確認しましたが、バイパス モードを有効にしてまったく同じであることがわかりました。マスター モードを無効にし、バイパス モードを無効にすると、'ES_DA' の出力は常にゼロになります。

上記と同じ手順を 1 つだけでなく多数の MPU9150 で試しましたが、出力は同じままでした。したがって、コードに何らかの問題がある可能性が高いです。

4

1 に答える 1

1

これは私が MPU9150 を初期化するために使用するコードであり、私にとってはうまくいきます (これはインターネットで見つけた変更された arduino バージョンです):

void MPU9150::initialize(){
   write(MPU9150_PWR_MGMT_1, 0); //Wake up

   initializeCompass();
}

void MPU9150::initializeCompass(){
  this->i2cDevice.address = this->i2cDevice.compass; // 0x0C or 0x0D

  write(0x0A, 0x00); //PowerDownMode
  write(0x0A, 0x0F); //SelfTest
  write(0x0A, 0x00); //PowerDownMode

  this->i2cDevice.address = this->i2cDevice.mpu; //0x68 or 0x69

  write(0x24, 0x40); //Wait for Data at Slave0
  write(0x25, 0x8C); //Set i2c address at slave0 at 0x0C
  write(0x26, 0x02); //Set where reading at slave 0 starts
  write(0x27, 0x88); //set offset at start reading and enable
  write(0x28, 0x0C); //set i2c address at slv1 at 0x0C
  write(0x29, 0x0A); //Set where reading at slave 1 starts
  write(0x2A, 0x81); //Enable at set length to 1
  write(0x64, 0x01); //overvride register
  write(0x67, 0x03); //set delay rate
  write(0x01, 0x80);

  write(0x34, 0x04); //set i2c slv4 delay
  write(0x64, 0x00); //override register
  write(0x6A, 0x00); //clear usr setting
  write(0x64, 0x01); //override register
  write(0x6A, 0x20); //enable master i2c mode
  write(0x34, 0x13); //disable slv4
}

そして、磁力計を読み取るには:

void MPU9150::readCompass()
{
    data.compass.x = read(MPU9150_CMPS_XOUT_L,MPU9150_CMPS_XOUT_H);
    data.compass.y = read(MPU9150_CMPS_YOUT_L,MPU9150_CMPS_YOUT_H);
    data.compass.z = read(MPU9150_CMPS_ZOUT_L,MPU9150_CMPS_ZOUT_H);
}

どこ:

//MPU9150 Compass
#define MPU9150_CMPS_XOUT_L        0x4A   // R
#define MPU9150_CMPS_XOUT_H        0x4B   // R
#define MPU9150_CMPS_YOUT_L        0x4C   // R
#define MPU9150_CMPS_YOUT_H        0x4D   // R
#define MPU9150_CMPS_ZOUT_L        0x4E   // R
#define MPU9150_CMPS_ZOUT_H        0x4F   // R
于 2014-09-21T08:30:20.167 に答える