LSM9DS1 SPI

Committer:
771_8bit
Date:
Thu Apr 25 04:04:04 2019 +0000
Revision:
0:cc9489570dd1
hello

Who changed what in which revision?

UserRevisionLine numberNew contents of line
771_8bit 0:cc9489570dd1 1 // Linear Acceleration: mg per LSB
771_8bit 0:cc9489570dd1 2 #define LSM9DS1_ACCEL_MG_LSB_2G (0.061F)
771_8bit 0:cc9489570dd1 3 #define LSM9DS1_ACCEL_MG_LSB_4G (0.122F)
771_8bit 0:cc9489570dd1 4 #define LSM9DS1_ACCEL_MG_LSB_8G (0.244F)
771_8bit 0:cc9489570dd1 5 #define LSM9DS1_ACCEL_MG_LSB_16G (0.732F)
771_8bit 0:cc9489570dd1 6
771_8bit 0:cc9489570dd1 7 // Magnetic Field Strength: gauss range
771_8bit 0:cc9489570dd1 8 #define LSM9DS1_MAG_MGAUSS_4GAUSS (0.14F)
771_8bit 0:cc9489570dd1 9 #define LSM9DS1_MAG_MGAUSS_8GAUSS (0.29F)
771_8bit 0:cc9489570dd1 10 #define LSM9DS1_MAG_MGAUSS_12GAUSS (0.43F)
771_8bit 0:cc9489570dd1 11 #define LSM9DS1_MAG_MGAUSS_16GAUSS (0.58F)
771_8bit 0:cc9489570dd1 12
771_8bit 0:cc9489570dd1 13 // Angular Rate: dps per LSB
771_8bit 0:cc9489570dd1 14 #define LSM9DS1_GYRO_DPS_DIGIT_245DPS (0.00875F)
771_8bit 0:cc9489570dd1 15 #define LSM9DS1_GYRO_DPS_DIGIT_500DPS (0.01750F)
771_8bit 0:cc9489570dd1 16 #define LSM9DS1_GYRO_DPS_DIGIT_2000DPS (0.07000F)
771_8bit 0:cc9489570dd1 17
771_8bit 0:cc9489570dd1 18 #include "mbed.h"
771_8bit 0:cc9489570dd1 19
771_8bit 0:cc9489570dd1 20 class LSM9DS1
771_8bit 0:cc9489570dd1 21 {
771_8bit 0:cc9489570dd1 22 SPI spi8;
771_8bit 0:cc9489570dd1 23 DigitalOut cs_AG;
771_8bit 0:cc9489570dd1 24 DigitalOut cs_M;
771_8bit 0:cc9489570dd1 25
771_8bit 0:cc9489570dd1 26 public:
771_8bit 0:cc9489570dd1 27
771_8bit 0:cc9489570dd1 28 LSM9DS1(PinName _mosi, PinName _miso, PinName _sclk, PinName _cs_AG, PinName _cs_M);
771_8bit 0:cc9489570dd1 29 float gyro_x;
771_8bit 0:cc9489570dd1 30 float gyro_y;
771_8bit 0:cc9489570dd1 31 float gyro_z;
771_8bit 0:cc9489570dd1 32 float accel_x;
771_8bit 0:cc9489570dd1 33 float accel_y;
771_8bit 0:cc9489570dd1 34 float accel_z;
771_8bit 0:cc9489570dd1 35 float mag_x;
771_8bit 0:cc9489570dd1 36 float mag_y;
771_8bit 0:cc9489570dd1 37 float mag_z;
771_8bit 0:cc9489570dd1 38
771_8bit 0:cc9489570dd1 39 typedef enum
771_8bit 0:cc9489570dd1 40 {
771_8bit 0:cc9489570dd1 41 LSM9DS1_cs_AG = 0,
771_8bit 0:cc9489570dd1 42 LSM9DS1_cs_M = 1,
771_8bit 0:cc9489570dd1 43
771_8bit 0:cc9489570dd1 44 } lsm9ds1ChipSelect_t;
771_8bit 0:cc9489570dd1 45
771_8bit 0:cc9489570dd1 46 typedef enum
771_8bit 0:cc9489570dd1 47 {
771_8bit 0:cc9489570dd1 48 LSM9DS1_REGISTER_WHO_AM_I_XG = 0x0F,
771_8bit 0:cc9489570dd1 49 LSM9DS1_REGISTER_CTRL_REG1_G = 0x10,
771_8bit 0:cc9489570dd1 50 LSM9DS1_REGISTER_CTRL_REG2_G = 0x11,
771_8bit 0:cc9489570dd1 51 LSM9DS1_REGISTER_CTRL_REG3_G = 0x12,
771_8bit 0:cc9489570dd1 52 LSM9DS1_REGISTER_TEMP_OUT_L = 0x15,
771_8bit 0:cc9489570dd1 53 LSM9DS1_REGISTER_TEMP_OUT_H = 0x16,
771_8bit 0:cc9489570dd1 54 LSM9DS1_REGISTER_STATUS_REG = 0x17,
771_8bit 0:cc9489570dd1 55 LSM9DS1_REGISTER_OUT_X_L_G = 0x18,
771_8bit 0:cc9489570dd1 56 LSM9DS1_REGISTER_OUT_X_H_G = 0x19,
771_8bit 0:cc9489570dd1 57 LSM9DS1_REGISTER_OUT_Y_L_G = 0x1A,
771_8bit 0:cc9489570dd1 58 LSM9DS1_REGISTER_OUT_Y_H_G = 0x1B,
771_8bit 0:cc9489570dd1 59 LSM9DS1_REGISTER_OUT_Z_L_G = 0x1C,
771_8bit 0:cc9489570dd1 60 LSM9DS1_REGISTER_OUT_Z_H_G = 0x1D,
771_8bit 0:cc9489570dd1 61 LSM9DS1_REGISTER_CTRL_REG4 = 0x1E,
771_8bit 0:cc9489570dd1 62 LSM9DS1_REGISTER_CTRL_REG5_XL = 0x1F,
771_8bit 0:cc9489570dd1 63 LSM9DS1_REGISTER_CTRL_REG6_XL = 0x20,
771_8bit 0:cc9489570dd1 64 LSM9DS1_REGISTER_CTRL_REG7_XL = 0x21,
771_8bit 0:cc9489570dd1 65 LSM9DS1_REGISTER_CTRL_REG8 = 0x22,
771_8bit 0:cc9489570dd1 66 LSM9DS1_REGISTER_CTRL_REG9 = 0x23,
771_8bit 0:cc9489570dd1 67 LSM9DS1_REGISTER_CTRL_REG10 = 0x24,
771_8bit 0:cc9489570dd1 68
771_8bit 0:cc9489570dd1 69 LSM9DS1_REGISTER_OUT_X_L_XL = 0x28,
771_8bit 0:cc9489570dd1 70 LSM9DS1_REGISTER_OUT_X_H_XL = 0x29,
771_8bit 0:cc9489570dd1 71 LSM9DS1_REGISTER_OUT_Y_L_XL = 0x2A,
771_8bit 0:cc9489570dd1 72 LSM9DS1_REGISTER_OUT_Y_H_XL = 0x2B,
771_8bit 0:cc9489570dd1 73 LSM9DS1_REGISTER_OUT_Z_L_XL = 0x2C,
771_8bit 0:cc9489570dd1 74 LSM9DS1_REGISTER_OUT_Z_H_XL = 0x2D,
771_8bit 0:cc9489570dd1 75
771_8bit 0:cc9489570dd1 76 } lsm9ds1AccGyroRegisters_t;
771_8bit 0:cc9489570dd1 77
771_8bit 0:cc9489570dd1 78 typedef enum
771_8bit 0:cc9489570dd1 79 {
771_8bit 0:cc9489570dd1 80 LSM9DS1_REGISTER_WHO_AM_I_M = 0x0F,
771_8bit 0:cc9489570dd1 81 LSM9DS1_REGISTER_CTRL_REG1_M = 0x20,
771_8bit 0:cc9489570dd1 82 LSM9DS1_REGISTER_CTRL_REG2_M = 0x21,
771_8bit 0:cc9489570dd1 83 LSM9DS1_REGISTER_CTRL_REG3_M = 0x22,
771_8bit 0:cc9489570dd1 84 LSM9DS1_REGISTER_CTRL_REG4_M = 0x23,
771_8bit 0:cc9489570dd1 85 LSM9DS1_REGISTER_CTRL_REG5_M = 0x24,
771_8bit 0:cc9489570dd1 86 LSM9DS1_REGISTER_STATUS_REG_M = 0x27,
771_8bit 0:cc9489570dd1 87 LSM9DS1_REGISTER_OUT_X_L_M = 0x28,
771_8bit 0:cc9489570dd1 88 LSM9DS1_REGISTER_OUT_X_H_M = 0x29,
771_8bit 0:cc9489570dd1 89 LSM9DS1_REGISTER_OUT_Y_L_M = 0x2A,
771_8bit 0:cc9489570dd1 90 LSM9DS1_REGISTER_OUT_Y_H_M = 0x2B,
771_8bit 0:cc9489570dd1 91 LSM9DS1_REGISTER_OUT_Z_L_M = 0x2C,
771_8bit 0:cc9489570dd1 92 LSM9DS1_REGISTER_OUT_Z_H_M = 0x2D,
771_8bit 0:cc9489570dd1 93 LSM9DS1_REGISTER_CFG_M = 0x30,
771_8bit 0:cc9489570dd1 94 LSM9DS1_REGISTER_INT_SRC_M = 0x31,
771_8bit 0:cc9489570dd1 95 } lsm9ds1MagRegisters_t;
771_8bit 0:cc9489570dd1 96
771_8bit 0:cc9489570dd1 97 typedef enum
771_8bit 0:cc9489570dd1 98 {
771_8bit 0:cc9489570dd1 99 LSM9DS1_ACCELRANGE_2G = (0b00 << 3),
771_8bit 0:cc9489570dd1 100 LSM9DS1_ACCELRANGE_16G = (0b01 << 3),
771_8bit 0:cc9489570dd1 101 LSM9DS1_ACCELRANGE_4G = (0b10 << 3),
771_8bit 0:cc9489570dd1 102 LSM9DS1_ACCELRANGE_8G = (0b11 << 3),
771_8bit 0:cc9489570dd1 103 } lsm9ds1AccelRange_t;
771_8bit 0:cc9489570dd1 104
771_8bit 0:cc9489570dd1 105 typedef enum
771_8bit 0:cc9489570dd1 106 {
771_8bit 0:cc9489570dd1 107 LSM9DS1_ACCELDATARATE_POWERDOWN = (0b0000 << 4),
771_8bit 0:cc9489570dd1 108 LSM9DS1_ACCELDATARATE_3_125HZ = (0b0001 << 4),
771_8bit 0:cc9489570dd1 109 LSM9DS1_ACCELDATARATE_6_25HZ = (0b0010 << 4),
771_8bit 0:cc9489570dd1 110 LSM9DS1_ACCELDATARATE_12_5HZ = (0b0011 << 4),
771_8bit 0:cc9489570dd1 111 LSM9DS1_ACCELDATARATE_25HZ = (0b0100 << 4),
771_8bit 0:cc9489570dd1 112 LSM9DS1_ACCELDATARATE_50HZ = (0b0101 << 4),
771_8bit 0:cc9489570dd1 113 LSM9DS1_ACCELDATARATE_100HZ = (0b0110 << 4),
771_8bit 0:cc9489570dd1 114 LSM9DS1_ACCELDATARATE_200HZ = (0b0111 << 4),
771_8bit 0:cc9489570dd1 115 LSM9DS1_ACCELDATARATE_400HZ = (0b1000 << 4),
771_8bit 0:cc9489570dd1 116 LSM9DS1_ACCELDATARATE_800HZ = (0b1001 << 4),
771_8bit 0:cc9489570dd1 117 LSM9DS1_ACCELDATARATE_1600HZ = (0b1010 << 4)
771_8bit 0:cc9489570dd1 118 } lm9ds1AccelDataRate_t;
771_8bit 0:cc9489570dd1 119
771_8bit 0:cc9489570dd1 120 typedef enum
771_8bit 0:cc9489570dd1 121 {
771_8bit 0:cc9489570dd1 122 LSM9DS1_MAGGAIN_4GAUSS = (0b00 << 5), // +/- 4 gauss
771_8bit 0:cc9489570dd1 123 LSM9DS1_MAGGAIN_8GAUSS = (0b01 << 5), // +/- 8 gauss
771_8bit 0:cc9489570dd1 124 LSM9DS1_MAGGAIN_12GAUSS = (0b10 << 5), // +/- 12 gauss
771_8bit 0:cc9489570dd1 125 LSM9DS1_MAGGAIN_16GAUSS = (0b11 << 5) // +/- 16 gauss
771_8bit 0:cc9489570dd1 126 } lsm9ds1MagGain_t;
771_8bit 0:cc9489570dd1 127
771_8bit 0:cc9489570dd1 128 typedef enum
771_8bit 0:cc9489570dd1 129 {
771_8bit 0:cc9489570dd1 130 LSM9DS1_MAGDATARATE_3_125HZ = (0b000 << 2),
771_8bit 0:cc9489570dd1 131 LSM9DS1_MAGDATARATE_6_25HZ = (0b001 << 2),
771_8bit 0:cc9489570dd1 132 LSM9DS1_MAGDATARATE_12_5HZ = (0b010 << 2),
771_8bit 0:cc9489570dd1 133 LSM9DS1_MAGDATARATE_25HZ = (0b011 << 2),
771_8bit 0:cc9489570dd1 134 LSM9DS1_MAGDATARATE_50HZ = (0b100 << 2),
771_8bit 0:cc9489570dd1 135 LSM9DS1_MAGDATARATE_100HZ = (0b101 << 2)
771_8bit 0:cc9489570dd1 136 } lsm9ds1MagDataRate_t;
771_8bit 0:cc9489570dd1 137
771_8bit 0:cc9489570dd1 138 typedef enum
771_8bit 0:cc9489570dd1 139 {
771_8bit 0:cc9489570dd1 140 LSM9DS1_GYROSCALE_245DPS = (0b00 << 3), // +/- 245 degrees per second rotation
771_8bit 0:cc9489570dd1 141 LSM9DS1_GYROSCALE_500DPS = (0b01 << 3), // +/- 500 degrees per second rotation
771_8bit 0:cc9489570dd1 142 LSM9DS1_GYROSCALE_2000DPS = (0b11 << 3) // +/- 2000 degrees per second rotation
771_8bit 0:cc9489570dd1 143 } lsm9ds1GyroScale_t;
771_8bit 0:cc9489570dd1 144
771_8bit 0:cc9489570dd1 145 typedef struct vector_s
771_8bit 0:cc9489570dd1 146 {
771_8bit 0:cc9489570dd1 147 float x;
771_8bit 0:cc9489570dd1 148 float y;
771_8bit 0:cc9489570dd1 149 float z;
771_8bit 0:cc9489570dd1 150 } lsm9ds1Vector_t;
771_8bit 0:cc9489570dd1 151
771_8bit 0:cc9489570dd1 152 void initSPI(void);
771_8bit 0:cc9489570dd1 153 void initAccel(lsm9ds1AccelRange_t scale);
771_8bit 0:cc9489570dd1 154 void initGyro(lsm9ds1GyroScale_t scale);
771_8bit 0:cc9489570dd1 155 void initMag(lsm9ds1MagGain_t scale);
771_8bit 0:cc9489570dd1 156 void readAccel();
771_8bit 0:cc9489570dd1 157 void readGyro();
771_8bit 0:cc9489570dd1 158 void readMag();
771_8bit 0:cc9489570dd1 159 uint8_t whoami();
771_8bit 0:cc9489570dd1 160 uint8_t read8(lsm9ds1ChipSelect_t cs,uint8_t address);
771_8bit 0:cc9489570dd1 161 void write8(lsm9ds1ChipSelect_t cs,uint8_t address,uint8_t data);
771_8bit 0:cc9489570dd1 162
771_8bit 0:cc9489570dd1 163 private:
771_8bit 0:cc9489570dd1 164 float _accel_mg_lsb;
771_8bit 0:cc9489570dd1 165 float _mag_mgauss_lsb;
771_8bit 0:cc9489570dd1 166 float _gyro_dps_digit;
771_8bit 0:cc9489570dd1 167 };