出力: - 私が得ているのは、すべてのレジスタ (磁力計に対応) の読み取りで 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 で試しましたが、出力は同じままでした。したがって、コードに何らかの問題がある可能性が高いです。