10-21-2019 12:21 PM - edited 10-21-2019 02:43 PM
there is an obvious discrepancy between the BMM150 datasheet and the reference driver on GitHub:
The magetometer data lower byte (here for X and Y axis) is
Bit 7: Data LSB <4>
Bit 6: Data LSB <3>
Bit 5: Data LSB <2>
Bit 4: Data LSB <1>
Bit 3: Data LSB <0>
Bit 2: Reserved - 0
Bit 1: Reserved - 0
However the reference code of the driver (here line 840 in bmm150.c) seems to assume that the lower byte of mag data contains significant mag data in bits 0-4, and bits 5-7 are 0:
msb_data = ((int16_t)((int8_t)reg_data)) * 32;
/* Raw mag X axis data */
raw_mag_data.raw_datax = (int16_t)(msb_data | reg_data);
Can one please explain the discrepancy?
Solved! Go to Solution.
10-21-2019 03:31 PM
I think what you are missing here, is the BMM_GET_BITS macro. This macro grabs the correct LSB bits and shifts them to the rightmost position. Both datasheet and API are correct.
/* Mag X axis data */ reg_data = BMM150_GET_BITS(reg_data, BMM150_DATA_X); /* Shift the MSB data to left by 5 bits */ /* Multiply by 32 to get the shift left by 5 value */ msb_data = ((int16_t)((int8_t)reg_data)) * 32; /* Raw mag X axis data */ raw_mag_data.raw_datax = (int16_t)(msb_data | reg_data);
10-21-2019 03:39 PM
Thanks a lot for the quick answer.
One additional question regarding BMX160: Are the MAG data transferred verbatim in the format as described for BMM150 by the MAG interface, or somehow processed? The BMX160 data sheet does not mention anything but just states high- and low-byte for the mag data.
10-21-2019 04:54 PM
The data read from the BMM150 is directly copied as it is to the register map of the BMX160.
10-21-2019 04:58 PM
Many thanks for the extreme quick turn-around.
Your support is truly outstanding.
May I suggest that you refer for the inner workings of the magnetometer in the BMX160 datasheet to BMI150?