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.
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);
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.
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?