Christian Dupaty 03/2021 Library and demo for BMM150 see datasheet here : https://www.bosch-sensortec.com/products/motion-sensors/magnetometers-bmm150/ Adaptation of BOSCH driver https://github.com/BoschSensortec/BMM150-Sensor-API for ARM MBED and tested on NUCLEO-L073RZ and GEOMAGNETIC CLICK https://www.mikroe.com/geomagnetic-click

Dependents:   BMM150_HelloWorld2

bmm150_defs.h

Committer:
cdupaty
Date:
2021-03-25
Revision:
1:9651fd7ee8f6
Parent:
0:ef20a9039c0c

File content as of revision 1:9651fd7ee8f6:

/*
Christian Dupaty 03/2021
Library and demo for BMM150 see datasheet here : https://www.bosch-sensortec.com/products/motion-sensors/magnetometers-bmm150/
Adaptation of BOSCH driver https://github.com/BoschSensortec/BMM150-Sensor-API
for ARM MBED and tested on NUCLEO-L073RZ and GEOMAGNETIC CLICK
https://www.mikroe.com/geomagnetic-click 
*/

#ifndef _BMM150_DEFS_H_
#define _BMM150_DEFS_H_

/**\name Macro definitions */
/*
typedef unsigned int unsigned int;
typedef int int; 
typedef unsigned char unsigned char;
typedef char char;
*/
/**\name API success code */
#define BMM150_OK	(0)

/**\name API error codes */
#define BMM150_E_ID_NOT_CONFORM		    (-1)
#define BMM150_E_INVALID_CONFIG         (-2)
// #define BMM150_E_ID_WRONG		    (-3)

/**\name API warning codes */
#define BMM150_W_NORMAL_SELF_TEST_YZ_FAIL	INT8_C(1)
#define BMM150_W_NORMAL_SELF_TEST_XZ_FAIL	INT8_C(2)
#define BMM150_W_NORMAL_SELF_TEST_Z_FAIL	INT8_C(3)
#define BMM150_W_NORMAL_SELF_TEST_XY_FAIL	INT8_C(4)
#define BMM150_W_NORMAL_SELF_TEST_Y_FAIL	INT8_C(5)
#define BMM150_W_NORMAL_SELF_TEST_X_FAIL	INT8_C(6)
#define BMM150_W_NORMAL_SELF_TEST_XYZ_FAIL	INT8_C(7)
#define BMM150_W_ADV_SELF_TEST_FAIL		INT8_C(8)

#define BMM150_I2C_Address  (0x13 << 1)
#define i2cWadr (BMM150_I2C_Address<<1)
#define i2cRadr (BMM150_I2C_Address<<1)+1
#define ACK	1
#define NACK 0

/**\name CHIP ID & SOFT RESET VALUES      */
#define BMM150_CHIP_ID              0x32
#define BMM150_SET_SOFT_RESET		0x82

/**\name POWER MODE DEFINTIONS      */
#define BMM150_NORMAL_MODE		0x00
#define BMM150_FORCED_MODE		0x01
#define BMM150_SLEEP_MODE		0x03
#define BMM150_SUSPEND_MODE		0x04

/**\name PRESET MODE DEFINITIONS  */
#define BMM150_PRESETMODE_LOWPOWER                 0x01
#define BMM150_PRESETMODE_REGULAR                  0x02
#define BMM150_PRESETMODE_HIGHACCURACY             0x03
#define BMM150_PRESETMODE_ENHANCED                 0x04

/**\name Power mode settings  */
#define	BMM150_POWER_CNTRL_DISABLE	0x00
#define	BMM150_POWER_CNTRL_ENABLE	0x01

/**\name Sensor delay time settings  */
#define BMM150_SOFT_RESET_wait_ms  (1)
#define BMM150_SOFT_RESET_DELAY		(1)
#define BMM150_NORMAL_SELF_TEST_DELAY	(2)
#define BMM150_START_UP_TIME		(3)
#define BMM150_ADV_SELF_TEST_DELAY	(4)

/**\name ENABLE/DISABLE DEFINITIONS  */
#define BMM150_XY_CHANNEL_ENABLE	0x00
#define BMM150_XY_CHANNEL_DISABLE	0x03

/**\name Register Address */
#define BMM150_CHIP_ID_ADDR		    0x40
#define BMM150_DATA_X_LSB		    0x42
#define BMM150_DATA_X_MSB		    0x43
#define BMM150_DATA_Y_LSB		    0x44
#define BMM150_DATA_Y_MSB		    0x45
#define BMM150_DATA_Z_LSB		    0x46
#define BMM150_DATA_Z_MSB		    0x47
#define BMM150_DATA_READY_STATUS	0x48
#define BMM150_INTERRUPT_STATUS		0x4A
#define BMM150_POWER_CONTROL_ADDR	0x4B
#define BMM150_OP_MODE_ADDR		    0x4C
#define BMM150_INT_CONFIG_ADDR		0x4D
#define BMM150_AXES_ENABLE_ADDR		0x4E
#define BMM150_LOW_THRESHOLD_ADDR	0x4F
#define BMM150_HIGH_THRESHOLD_ADDR	0x50
#define BMM150_REP_XY_ADDR		    0x51
#define BMM150_REP_Z_ADDR		    0x52

/**\name DATA RATE DEFINITIONS  */
#define BMM150_DATA_RATE_10HZ        (0x00)
#define BMM150_DATA_RATE_02HZ        (0x01)
#define BMM150_DATA_RATE_06HZ        (0x02)
#define BMM150_DATA_RATE_08HZ        (0x03)
#define BMM150_DATA_RATE_15HZ        (0x04)
#define BMM150_DATA_RATE_20HZ        (0x05)
#define BMM150_DATA_RATE_25HZ        (0x06)
#define BMM150_DATA_RATE_30HZ        (0x07)

/**\name TRIM REGISTERS      */
/* Trim Extended Registers */
#define BMM150_DIG_X1               uint8_t(0x5D)
#define BMM150_DIG_Y1               uint8_t(0x5E)
#define BMM150_DIG_Z4_LSB           uint8_t(0x62)
#define BMM150_DIG_Z4_MSB           uint8_t(0x63)
#define BMM150_DIG_X2               uint8_t(0x64)
#define BMM150_DIG_Y2               uint8_t(0x65)
#define BMM150_DIG_Z2_LSB           uint8_t(0x68)
#define BMM150_DIG_Z2_MSB           uint8_t(0x69)
#define BMM150_DIG_Z1_LSB           uint8_t(0x6A)
#define BMM150_DIG_Z1_MSB           uint8_t(0x6B)
#define BMM150_DIG_XYZ1_LSB         uint8_t(0x6C)
#define BMM150_DIG_XYZ1_MSB         uint8_t(0x6D)
#define BMM150_DIG_Z3_LSB           uint8_t(0x6E)
#define BMM150_DIG_Z3_MSB           uint8_t(0x6F)
#define BMM150_DIG_XY2              uint8_t(0x70)
#define BMM150_DIG_XY1              uint8_t(0x71)

/**\name PRESET MODES - REPETITIONS-XY RATES */
#define BMM150_LOWPOWER_REPXY                    (1)
#define BMM150_REGULAR_REPXY                     (4)
#define BMM150_ENHANCED_REPXY                    (7)
#define BMM150_HIGHACCURACY_REPXY                (23)

/**\name PRESET MODES - REPETITIONS-Z RATES */
#define BMM150_LOWPOWER_REPZ                     (2)
#define BMM150_REGULAR_REPZ                      (14)
#define BMM150_ENHANCED_REPZ                     (26)
#define BMM150_HIGHACCURACY_REPZ                 (82)

/**\name Macros for bit masking */
#define	BMM150_PWR_CNTRL_MSK		(0x01)

#define	BMM150_CONTROL_MEASURE_MSK	(0x38)
#define	BMM150_CONTROL_MEASURE_POS	(0x03)

#define BMM150_POWER_CONTROL_BIT_MSK	(0x01)
#define BMM150_POWER_CONTROL_BIT_POS	(0x00)

#define BMM150_OP_MODE_MSK		(0x06)
#define BMM150_OP_MODE_POS		(0x01)

#define BMM150_ODR_MSK			(0x38)
#define BMM150_ODR_POS			(0x03)

#define BMM150_DATA_X_MSK		(0xF8)
#define BMM150_DATA_X_POS		(0x03)

#define BMM150_DATA_Y_MSK		(0xF8)
#define BMM150_DATA_Y_POS		(0x03)

#define BMM150_DATA_Z_MSK		(0xFE)
#define BMM150_DATA_Z_POS		(0x01)

#define BMM150_DATA_RHALL_MSK		(0xFC)
#define BMM150_DATA_RHALL_POS		(0x02)

#define	BMM150_SELF_TEST_MSK		(0x01)

#define	BMM150_ADV_SELF_TEST_MSK	(0xC0)
#define	BMM150_ADV_SELF_TEST_POS	(0x06)

#define	BMM150_DRDY_EN_MSK		(0x80)
#define	BMM150_DRDY_EN_POS		(0x07)

#define	BMM150_INT_PIN_EN_MSK		(0x40)
#define	BMM150_INT_PIN_EN_POS		(0x06)

#define	BMM150_DRDY_POLARITY_MSK	(0x04)
#define	BMM150_DRDY_POLARITY_POS	(0x02)

#define	BMM150_INT_LATCH_MSK		(0x02)
#define	BMM150_INT_LATCH_POS		(0x01)

#define	BMM150_INT_POLARITY_MSK		(0x01)

#define	BMM150_DATA_OVERRUN_INT_MSK	(0x80)
#define	BMM150_DATA_OVERRUN_INT_POS	(0x07)

#define	BMM150_OVERFLOW_INT_MSK		(0x40)
#define	BMM150_OVERFLOW_INT_POS		(0x06)

#define	BMM150_HIGH_THRESHOLD_INT_MSK	(0x38)
#define	BMM150_HIGH_THRESHOLD_INT_POS	(0x03)

#define	BMM150_LOW_THRESHOLD_INT_MSK	(0x07)

#define	BMM150_DRDY_STATUS_MSK		(0x01)

/**\name OVERFLOW DEFINITIONS  */
#define BMM150_XYAXES_FLIP_OVERFLOW_ADCVAL	(-4096)
#define BMM150_ZAXIS_HALL_OVERFLOW_ADCVAL	  (-16384)
#define BMM150_OVERFLOW_OUTPUT			        (-32768)
#define BMM150_NEGATIVE_SATURATION_Z        (-32767)
#define BMM150_POSITIVE_SATURATION_Z        (32767)
#ifdef BMM150_USE_FLOATING_POINT
    #define BMM150_OVERFLOW_OUTPUT_FLOAT		0.0f
#endif

/**\name Register read lengths	*/
#define BMM150_SELF_TEST_LEN			(5)
#define BMM150_SETTING_DATA_LEN			(8)
#define BMM150_XYZR_DATA_LEN			(8)

/**\name Self test selection macros */
#define BMM150_NORMAL_SELF_TEST			(0)
#define BMM150_ADVANCED_SELF_TEST		(1)

/**\name Self test settings */
#define BMM150_DISABLE_XY_AXIS			(0x03)
#define BMM150_SELF_TEST_REP_Z			(0x04)

/**\name Advanced self-test current settings */
#define BMM150_DISABLE_SELF_TEST_CURRENT	(0x00)
#define BMM150_ENABLE_NEGATIVE_CURRENT		(0x02)
#define BMM150_ENABLE_POSITIVE_CURRENT		(0x03)

/**\name Normal self-test status */
#define BMM150_SELF_TEST_STATUS_XYZ_FAIL	(0x00)
#define BMM150_SELF_TEST_STATUS_SUCCESS		(0x07)

/**\name Macro to SET and GET BITS of a register*/
#define BMM150_SET_BITS(reg_data, bitname, data) \
    ((reg_data & ~(bitname##_MSK)) | \
     ((data << bitname##_POS) & bitname##_MSK))

#define BMM150_GET_BITS(reg_data, bitname)  ((reg_data & (bitname##_MSK)) >> \
        (bitname##_POS))

#define BMM150_SET_BITS_POS_0(reg_data, bitname, data) \
    ((reg_data & ~(bitname##_MSK)) | \
     (data & bitname##_MSK))

#define BMM150_GET_BITS_POS_0(reg_data, bitname)  (reg_data & (bitname##_MSK))


struct bmm150_mag_data {
    int x;
    int y;
    int z;
};

/*
    @brief bmm150 un-compensated (raw) magnetometer data
*/
struct bmm150_raw_mag_data {
    /*! Raw mag X data */
    int raw_datax;
    /*! Raw mag Y data */
    int raw_datay;
    /*! Raw mag Z data */
    int raw_dataz;
    /*! Raw mag resistance value */
    unsigned int raw_data_r;
};

/*!
    @brief bmm150 trim data structure
*/
struct bmm150_trim_registers {
    /*! trim x1 data */
    char dig_x1;
    /*! trim y1 data */
    char dig_y1;
    /*! trim x2 data */
    char dig_x2;
    /*! trim y2 data */
    char dig_y2;
    /*! trim z1 data */
    unsigned int dig_z1;
    /*! trim z2 data */
    int dig_z2;
    /*! trim z3 data */
    int dig_z3;
    /*! trim z4 data */
    int dig_z4;
    /*! trim xy1 data */
    unsigned char dig_xy1;
    /*! trim xy2 data */
    char dig_xy2;
    /*! trim xyz1 data */
    unsigned int dig_xyz1;
};

/**
    @brief bmm150 sensor settings
*/
struct bmm150_settings {
    /*! Control measurement of XYZ axes */
    unsigned char xyz_axes_control;
    /*! Power control bit value */
    unsigned char pwr_cntrl_bit;
    /*! Power control bit value */
    unsigned char pwr_mode;
    /*! Data rate value (ODR) */
    unsigned char data_rate;
    /*! XY Repetitions */
    unsigned char xy_rep;
    /*! Z Repetitions */
    unsigned char z_rep;
    /*! Preset mode of sensor */
    unsigned char preset_mode;
    /*! Interrupt configuration settings */
    // struct bmm150_int_ctrl_settings int_settings;
};

#endif