Differences between MPU9150 and MPU9250 for accessing the compass (magnetometer)

By barakman , 21 January 2016

Hi.

I am using the same code (register read/write operations) for both MPU9150 and MPU9250.

I am able to access the accelerometer and the gyroscope on both devices, but I am unable to access the magnetometer (compass) on MPU9250.

My initialization code is very simple:

1. Register PWR_MGMT_1: Reset all the internal registers of the MPU to their default values
WriteReg(0x68, 0x6B, 0x80); Delay_ms(100);
2. Register INT_PIN_CFG: Allow the host application processor to directly access the auxiliary I2C bus of the MPU
WriteReg(0x68, 0x37, 0x02); Delay_ms(100);
3. Register PWR_MGMT_1: Set the MPU clock source to one of the gyroscope clocks (more accurate), and disable the temperature sensor
WriteReg(0x68, 0x6B, 0x09); Delay_ms(100);

After that, my initial attempt to access the compass completes successfully on MPU9150 but never returns on MPU9250:

1. Register CNTL1: Power-down mode
WriteReg(0x0C, 0x0A, 0x00);

I have compared the register contents of each device after the initialization procedure.

<table class="tg">
<tr>
<th class="tg-yw4l">MPU9150 Register Contents</th>
<th class="tg-yw4l">MPU9250 Register Contents</th>
</tr>
<tr>
<td class="tg-yw4l">837F04CD E4CE01D8 F63D02B8 E96F6F94</td>
<td class="tg-yw4l">C5CEDDED 9813DD4F E5F1FFFC 005F5A87</td>
</tr>
<tr>
<td class="tg-yw4l">37000000 00000000 00000000 00000000</td>
<td class="tg-yw4l">B0AAB900 00000000 00000000 00000000</td>
</tr>
<tr>
<td class="tg-yw4l">00000000 00000000 00000000 00000000</td>
<td class="tg-yw4l">00000000 00000000 00000000 00000000</td>
</tr>
<tr>
<td class="tg-yw4l">00000000 00000002 00000501 A0FBDC3F</td>
<td class="tg-yw4l">00000000 00000002 0000057F FF0508B7</td>
</tr>
<tr>
<td class="tg-yw4l">B0000000 DFFF1900 8C000000 00000000</td>
<td class="tg-yw4l">4412F0FF FC006300 74000000 00000000</td>
</tr>
<tr>
<td class="tg-yw4l">00000000 00000000 00000000 00000000</td>
<td class="tg-yw4l">00000000 00000000 00000000 00000000</td>
</tr>
<tr>
<td class="tg-yw4l">00000000 00000000 00000009 00000000</td>
<td class="tg-yw4l">00000100 00000000 00000009 00000000</td>
</tr>
<tr>
<td class="tg-yw4l">B4B5F3FB 4DD9ED7F 7B7D0F3F 3EE9EB6F</td>
<td class="tg-yw4l">319A5AF4 0D009206 00009BC9 4D20558A</td>
</tr>
</table>

The only differences in writable registers are given below:

<table class="tg">
<tr>
<th class="tg-yw4l">Address</th>
<th class="tg-yw4l">Value on MPU9150</th>
<th class="tg-yw4l">Value on MPU9250</th>
<th class="tg-yw4l">Description for MPU9150</th>
<th class="tg-yw4l">Description for MPU9250</th>
</tr>
<tr>
<td class="tg-yw4l">0x00</td>
<td class="tg-yw4l">0x83</td>
<td class="tg-yw4l">0xC5</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l">SELF_TEST_X_GYRO</td>
</tr>
<tr>
<td class="tg-yw4l">0x01</td>
<td class="tg-yw4l">0x7F</td>
<td class="tg-yw4l">0xCE</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l">SELF_TEST_Y_GYRO</td>
</tr>
<tr>
<td class="tg-yw4l">0x02</td>
<td class="tg-yw4l">0x04</td>
<td class="tg-yw4l">0xDD</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l">SELF_TEST_Z_GYRO</td>
</tr>
<tr>
<td class="tg-yw4l">0x03</td>
<td class="tg-yw4l">0xCD</td>
<td class="tg-yw4l">0xED</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x04</td>
<td class="tg-yw4l">0xE4</td>
<td class="tg-yw4l">0x98</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x05</td>
<td class="tg-yw4l">0xCE</td>
<td class="tg-yw4l">0x13</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x06</td>
<td class="tg-yw4l">0x01</td>
<td class="tg-yw4l">0xDD</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x07</td>
<td class="tg-yw4l">0xD8</td>
<td class="tg-yw4l">0x4F</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x08</td>
<td class="tg-yw4l">0xF6</td>
<td class="tg-yw4l">0xE5</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x09</td>
<td class="tg-yw4l">0x3D</td>
<td class="tg-yw4l">0xF1</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x0A</td>
<td class="tg-yw4l">0x02</td>
<td class="tg-yw4l">0xFF</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x0B</td>
<td class="tg-yw4l">0xB8</td>
<td class="tg-yw4l">0xFC</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x0C</td>
<td class="tg-yw4l">0xE9</td>
<td class="tg-yw4l">0x00</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x0D</td>
<td class="tg-yw4l">0x6F</td>
<td class="tg-yw4l">0x5F</td>
<td class="tg-yw4l">SELF_TEST_X</td>
<td class="tg-yw4l">SELF_TEST_X_ACCEL</td>
</tr>
<tr>
<td class="tg-yw4l">0x0E</td>
<td class="tg-yw4l">0x6F</td>
<td class="tg-yw4l">0x5A</td>
<td class="tg-yw4l">SELF_TEST_Y</td>
<td class="tg-yw4l">SELF_TEST_Y_ACCEL</td>
</tr>
<tr>
<td class="tg-yw4l">0x0F</td>
<td class="tg-yw4l">0x94</td>
<td class="tg-yw4l">0x87</td>
<td class="tg-yw4l">SELF_TEST_Z</td>
<td class="tg-yw4l">SELF_TEST_Z_ACCEL</td>
</tr>
<tr>
<td class="tg-yw4l">0x10</td>
<td class="tg-yw4l">0x37</td>
<td class="tg-yw4l">0xB0</td>
<td class="tg-yw4l">SELF_TEST_A</td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x11</td>
<td class="tg-yw4l">0x00</td>
<td class="tg-yw4l">0xAA</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x12</td>
<td class="tg-yw4l">0x00</td>
<td class="tg-yw4l">0xB9</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x62</td>
<td class="tg-yw4l">0x00</td>
<td class="tg-yw4l">0x01</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x70</td>
<td class="tg-yw4l">0xB4</td>
<td class="tg-yw4l">0x31</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x71</td>
<td class="tg-yw4l">0xB5</td>
<td class="tg-yw4l">0x9A</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x72</td>
<td class="tg-yw4l">0xF3</td>
<td class="tg-yw4l">0x5A</td>
<td class="tg-yw4l">FIFO_COUNTH</td>
<td class="tg-yw4l">FIFO_COUNTH</td>
</tr>
<tr>
<td class="tg-yw4l">0x73</td>
<td class="tg-yw4l">0xFB</td>
<td class="tg-yw4l">0xF4</td>
<td class="tg-yw4l">FIFO_COUNTL</td>
<td class="tg-yw4l">FIFO_COUNTL</td>
</tr>
<tr>
<td class="tg-yw4l">0x74</td>
<td class="tg-yw4l">0x4D</td>
<td class="tg-yw4l">0x0D</td>
<td class="tg-yw4l">FIFO_R_W</td>
<td class="tg-yw4l">FIFO_R_W</td>
</tr>
<tr>
<td class="tg-yw4l">0x75</td>
<td class="tg-yw4l">0xD9</td>
<td class="tg-yw4l">0x00</td>
<td class="tg-yw4l">WHO_AM_I</td>
<td class="tg-yw4l">WHO_AM_I</td>
</tr>
<tr>
<td class="tg-yw4l">0x76</td>
<td class="tg-yw4l">0xED</td>
<td class="tg-yw4l">0x92</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x77</td>
<td class="tg-yw4l">0x7F</td>
<td class="tg-yw4l">0x06</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l">XA_OFFSET_H</td>
</tr>
<tr>
<td class="tg-yw4l">0x78</td>
<td class="tg-yw4l">0x7B</td>
<td class="tg-yw4l">0x00</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l">XA_OFFSET_L</td>
</tr>
<tr>
<td class="tg-yw4l">0x79</td>
<td class="tg-yw4l">0x7D</td>
<td class="tg-yw4l">0x00</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x7A</td>
<td class="tg-yw4l">0x0F</td>
<td class="tg-yw4l">0x9B</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l">YA_OFFSET_H</td>
</tr>
<tr>
<td class="tg-yw4l">0x7B</td>
<td class="tg-yw4l">0x3F</td>
<td class="tg-yw4l">0xC9</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l">YA_OFFSET_H</td>
</tr>
<tr>
<td class="tg-yw4l">0x7C</td>
<td class="tg-yw4l">0x3E</td>
<td class="tg-yw4l">0x4D</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
<tr>
<td class="tg-yw4l">0x7D</td>
<td class="tg-yw4l">0xE9</td>
<td class="tg-yw4l">0x20</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l">ZA_OFFSET_H</td>
</tr>
<tr>
<td class="tg-yw4l">0x7E</td>
<td class="tg-yw4l">0xEB</td>
<td class="tg-yw4l">0x55</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l">ZA_OFFSET_H</td>
</tr>
<tr>
<td class="tg-yw4l">0X7F</td>
<td class="tg-yw4l">0x6F</td>
<td class="tg-yw4l">0x8A</td>
<td class="tg-yw4l"></td>
<td class="tg-yw4l"></td>
</tr>
</table>

Please note that I also included the read-only WHO_AM_I register, because:

1. It is within that segment of different registers (between 0x70 and 0x7F)

2. It shows a value different from what the data-sheet specifies (0x68 on MPU9150 and 0x71 on MPU9250)

I have taken each one of the following actions in an attempt to resolve the problem, but none of them seemed to show any positive results:

1. Before accessing the compass on MPU9250, I wrote the entire register contents that I had previously read from MPU9150 into MPU9250

2. When accessing the compass on MPU9250, instead of using 0x0C as the address of the AKM device on the I2C bus, I tried addresses 0x0D, 0x0E and 0x0F
I found a driver which was using 0x0C<<1 instead of 0x0C, so I tried addresses 0x0C<<1, 0x0D<<1, 0x0E<<1 and 0x0F<<1 (0x18, 0x19, 0x1A and 0x1B) as well

I admit that I have not tried to combine both of the actions above, because at that point, I was pretty sure that something else was fundamentally wrong.

Again - the general question is:
Are there any differences between MPU9150 and MPU9250 for accessing the compass, that I am missing?
Or is my initialization code wrong (or partially incomplete), in a manner that somehow allows me to access the compass on MPU9150 but not on MPU9250?

Thanks

phpbb Topic ID
32918