LSM9DS1 SPI
LSM9DS1.cpp@0:cc9489570dd1, 2019-04-25 (annotated)
- Committer:
- 771_8bit
- Date:
- Thu Apr 25 04:04:04 2019 +0000
- Revision:
- 0:cc9489570dd1
hello
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
771_8bit | 0:cc9489570dd1 | 1 | #include "mbed.h" |
771_8bit | 0:cc9489570dd1 | 2 | #include "LSM9DS1.h" |
771_8bit | 0:cc9489570dd1 | 3 | |
771_8bit | 0:cc9489570dd1 | 4 | //spi8,はmbedのSPIクラスのインスタンス |
771_8bit | 0:cc9489570dd1 | 5 | LSM9DS1::LSM9DS1(PinName _mosi, PinName _miso, PinName _sclk, PinName _cs_AG, PinName _cs_M) : spi8(_mosi, _miso, _sclk),cs_AG(_cs_AG),cs_M(_cs_M) { |
771_8bit | 0:cc9489570dd1 | 6 | initSPI(); |
771_8bit | 0:cc9489570dd1 | 7 | } |
771_8bit | 0:cc9489570dd1 | 8 | |
771_8bit | 0:cc9489570dd1 | 9 | void LSM9DS1::initSPI(void){ |
771_8bit | 0:cc9489570dd1 | 10 | cs_AG = 1; //deselect |
771_8bit | 0:cc9489570dd1 | 11 | cs_M =1; |
771_8bit | 0:cc9489570dd1 | 12 | spi8.format(8,3); |
771_8bit | 0:cc9489570dd1 | 13 | spi8.frequency(10000000); |
771_8bit | 0:cc9489570dd1 | 14 | } |
771_8bit | 0:cc9489570dd1 | 15 | |
771_8bit | 0:cc9489570dd1 | 16 | void LSM9DS1::initAccel(lsm9ds1AccelRange_t range){ |
771_8bit | 0:cc9489570dd1 | 17 | // Enable the accelerometer continous |
771_8bit | 0:cc9489570dd1 | 18 | write8(LSM9DS1_cs_AG, LSM9DS1_REGISTER_CTRL_REG5_XL, 0x38); // enable X Y and Z axis |
771_8bit | 0:cc9489570dd1 | 19 | write8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_CTRL_REG6_XL,0xC0 | range); // 1 KHz out data rate, BW set by ODR, 408Hz anti-aliasing 感度設定 |
771_8bit | 0:cc9489570dd1 | 20 | |
771_8bit | 0:cc9489570dd1 | 21 | switch (range) |
771_8bit | 0:cc9489570dd1 | 22 | { |
771_8bit | 0:cc9489570dd1 | 23 | case LSM9DS1_ACCELRANGE_2G: |
771_8bit | 0:cc9489570dd1 | 24 | _accel_mg_lsb = LSM9DS1_ACCEL_MG_LSB_2G; |
771_8bit | 0:cc9489570dd1 | 25 | break; |
771_8bit | 0:cc9489570dd1 | 26 | case LSM9DS1_ACCELRANGE_4G: |
771_8bit | 0:cc9489570dd1 | 27 | _accel_mg_lsb = LSM9DS1_ACCEL_MG_LSB_4G; |
771_8bit | 0:cc9489570dd1 | 28 | break; |
771_8bit | 0:cc9489570dd1 | 29 | case LSM9DS1_ACCELRANGE_8G: |
771_8bit | 0:cc9489570dd1 | 30 | _accel_mg_lsb = LSM9DS1_ACCEL_MG_LSB_8G; |
771_8bit | 0:cc9489570dd1 | 31 | break; |
771_8bit | 0:cc9489570dd1 | 32 | case LSM9DS1_ACCELRANGE_16G: |
771_8bit | 0:cc9489570dd1 | 33 | _accel_mg_lsb =LSM9DS1_ACCEL_MG_LSB_16G; |
771_8bit | 0:cc9489570dd1 | 34 | break; |
771_8bit | 0:cc9489570dd1 | 35 | } |
771_8bit | 0:cc9489570dd1 | 36 | } |
771_8bit | 0:cc9489570dd1 | 37 | |
771_8bit | 0:cc9489570dd1 | 38 | |
771_8bit | 0:cc9489570dd1 | 39 | void LSM9DS1::initGyro(lsm9ds1GyroScale_t scale){ |
771_8bit | 0:cc9489570dd1 | 40 | write8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_CTRL_REG1_G,0xC0 | scale); //感度設定 |
771_8bit | 0:cc9489570dd1 | 41 | |
771_8bit | 0:cc9489570dd1 | 42 | switch(scale) |
771_8bit | 0:cc9489570dd1 | 43 | { |
771_8bit | 0:cc9489570dd1 | 44 | case LSM9DS1_GYROSCALE_245DPS: |
771_8bit | 0:cc9489570dd1 | 45 | _gyro_dps_digit = LSM9DS1_GYRO_DPS_DIGIT_245DPS; |
771_8bit | 0:cc9489570dd1 | 46 | break; |
771_8bit | 0:cc9489570dd1 | 47 | case LSM9DS1_GYROSCALE_500DPS: |
771_8bit | 0:cc9489570dd1 | 48 | _gyro_dps_digit = LSM9DS1_GYRO_DPS_DIGIT_500DPS; |
771_8bit | 0:cc9489570dd1 | 49 | break; |
771_8bit | 0:cc9489570dd1 | 50 | case LSM9DS1_GYROSCALE_2000DPS: |
771_8bit | 0:cc9489570dd1 | 51 | _gyro_dps_digit = LSM9DS1_GYRO_DPS_DIGIT_2000DPS; |
771_8bit | 0:cc9489570dd1 | 52 | break; |
771_8bit | 0:cc9489570dd1 | 53 | } |
771_8bit | 0:cc9489570dd1 | 54 | } |
771_8bit | 0:cc9489570dd1 | 55 | |
771_8bit | 0:cc9489570dd1 | 56 | void LSM9DS1::initMag(lsm9ds1MagGain_t gain){ |
771_8bit | 0:cc9489570dd1 | 57 | write8(LSM9DS1_cs_M,LSM9DS1_REGISTER_CTRL_REG1_M,0xFC); |
771_8bit | 0:cc9489570dd1 | 58 | write8(LSM9DS1_cs_M, LSM9DS1_REGISTER_CTRL_REG2_M, gain ); //感度設定 |
771_8bit | 0:cc9489570dd1 | 59 | write8(LSM9DS1_cs_M,LSM9DS1_REGISTER_CTRL_REG3_M,0x00); |
771_8bit | 0:cc9489570dd1 | 60 | write8(LSM9DS1_cs_M,LSM9DS1_REGISTER_CTRL_REG4_M,0x0C); |
771_8bit | 0:cc9489570dd1 | 61 | |
771_8bit | 0:cc9489570dd1 | 62 | switch(gain) |
771_8bit | 0:cc9489570dd1 | 63 | { |
771_8bit | 0:cc9489570dd1 | 64 | case LSM9DS1_MAGGAIN_4GAUSS: |
771_8bit | 0:cc9489570dd1 | 65 | _mag_mgauss_lsb = LSM9DS1_MAG_MGAUSS_4GAUSS; |
771_8bit | 0:cc9489570dd1 | 66 | break; |
771_8bit | 0:cc9489570dd1 | 67 | case LSM9DS1_MAGGAIN_8GAUSS: |
771_8bit | 0:cc9489570dd1 | 68 | _mag_mgauss_lsb = LSM9DS1_MAG_MGAUSS_8GAUSS; |
771_8bit | 0:cc9489570dd1 | 69 | break; |
771_8bit | 0:cc9489570dd1 | 70 | case LSM9DS1_MAGGAIN_12GAUSS: |
771_8bit | 0:cc9489570dd1 | 71 | _mag_mgauss_lsb = LSM9DS1_MAG_MGAUSS_12GAUSS; |
771_8bit | 0:cc9489570dd1 | 72 | break; |
771_8bit | 0:cc9489570dd1 | 73 | case LSM9DS1_MAGGAIN_16GAUSS: |
771_8bit | 0:cc9489570dd1 | 74 | _mag_mgauss_lsb = LSM9DS1_MAG_MGAUSS_16GAUSS; |
771_8bit | 0:cc9489570dd1 | 75 | break; |
771_8bit | 0:cc9489570dd1 | 76 | } |
771_8bit | 0:cc9489570dd1 | 77 | } |
771_8bit | 0:cc9489570dd1 | 78 | |
771_8bit | 0:cc9489570dd1 | 79 | void LSM9DS1::readAccel() { |
771_8bit | 0:cc9489570dd1 | 80 | // Read the accelerometer |
771_8bit | 0:cc9489570dd1 | 81 | |
771_8bit | 0:cc9489570dd1 | 82 | uint8_t xlo = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_X_L_XL); |
771_8bit | 0:cc9489570dd1 | 83 | int16_t xhi = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_X_H_XL); |
771_8bit | 0:cc9489570dd1 | 84 | uint8_t ylo = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Y_L_XL); |
771_8bit | 0:cc9489570dd1 | 85 | int16_t yhi = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Y_H_XL); |
771_8bit | 0:cc9489570dd1 | 86 | uint8_t zlo = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Z_L_XL); |
771_8bit | 0:cc9489570dd1 | 87 | int16_t zhi = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Z_H_XL); |
771_8bit | 0:cc9489570dd1 | 88 | |
771_8bit | 0:cc9489570dd1 | 89 | // Shift values to create properly formed integer (low byte first) |
771_8bit | 0:cc9489570dd1 | 90 | xhi <<= 8; xhi |= xlo; |
771_8bit | 0:cc9489570dd1 | 91 | yhi <<= 8; yhi |= ylo; |
771_8bit | 0:cc9489570dd1 | 92 | zhi <<= 8; zhi |= zlo; |
771_8bit | 0:cc9489570dd1 | 93 | accel_x = (xhi * _accel_mg_lsb)/100; |
771_8bit | 0:cc9489570dd1 | 94 | accel_y = (yhi * _accel_mg_lsb)/100; |
771_8bit | 0:cc9489570dd1 | 95 | accel_z = (zhi * _accel_mg_lsb)/100; |
771_8bit | 0:cc9489570dd1 | 96 | } |
771_8bit | 0:cc9489570dd1 | 97 | |
771_8bit | 0:cc9489570dd1 | 98 | void LSM9DS1::readGyro(){ |
771_8bit | 0:cc9489570dd1 | 99 | |
771_8bit | 0:cc9489570dd1 | 100 | uint8_t xlo = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_X_L_G); |
771_8bit | 0:cc9489570dd1 | 101 | int16_t xhi = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_X_H_G); |
771_8bit | 0:cc9489570dd1 | 102 | uint8_t ylo = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Y_L_G); |
771_8bit | 0:cc9489570dd1 | 103 | int16_t yhi = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Y_H_G); |
771_8bit | 0:cc9489570dd1 | 104 | uint8_t zlo = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Z_L_G); |
771_8bit | 0:cc9489570dd1 | 105 | int16_t zhi = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Z_H_G); |
771_8bit | 0:cc9489570dd1 | 106 | |
771_8bit | 0:cc9489570dd1 | 107 | // Shift values to create properly formed integer (low byte first) |
771_8bit | 0:cc9489570dd1 | 108 | xhi <<= 8; xhi |= xlo; |
771_8bit | 0:cc9489570dd1 | 109 | yhi <<= 8; yhi |= ylo; |
771_8bit | 0:cc9489570dd1 | 110 | zhi <<= 8; zhi |= zlo; |
771_8bit | 0:cc9489570dd1 | 111 | |
771_8bit | 0:cc9489570dd1 | 112 | gyro_x = xhi * _gyro_dps_digit; |
771_8bit | 0:cc9489570dd1 | 113 | gyro_y = yhi * _gyro_dps_digit; |
771_8bit | 0:cc9489570dd1 | 114 | gyro_z = zhi * _gyro_dps_digit; |
771_8bit | 0:cc9489570dd1 | 115 | } |
771_8bit | 0:cc9489570dd1 | 116 | |
771_8bit | 0:cc9489570dd1 | 117 | void LSM9DS1::readMag(){ |
771_8bit | 0:cc9489570dd1 | 118 | |
771_8bit | 0:cc9489570dd1 | 119 | |
771_8bit | 0:cc9489570dd1 | 120 | uint8_t xlo = read8(LSM9DS1_cs_M,LSM9DS1_REGISTER_OUT_X_L_M); |
771_8bit | 0:cc9489570dd1 | 121 | int16_t xhi = read8(LSM9DS1_cs_M,LSM9DS1_REGISTER_OUT_X_H_M); |
771_8bit | 0:cc9489570dd1 | 122 | uint8_t ylo = read8(LSM9DS1_cs_M,LSM9DS1_REGISTER_OUT_Y_L_M); |
771_8bit | 0:cc9489570dd1 | 123 | int16_t yhi = read8(LSM9DS1_cs_M,LSM9DS1_REGISTER_OUT_Y_H_M); |
771_8bit | 0:cc9489570dd1 | 124 | uint8_t zlo = read8(LSM9DS1_cs_M,LSM9DS1_REGISTER_OUT_Z_L_M); |
771_8bit | 0:cc9489570dd1 | 125 | int16_t zhi = read8(LSM9DS1_cs_M,LSM9DS1_REGISTER_OUT_Z_H_M); |
771_8bit | 0:cc9489570dd1 | 126 | |
771_8bit | 0:cc9489570dd1 | 127 | // Shift values to create properly formed integer (low byte first) |
771_8bit | 0:cc9489570dd1 | 128 | xhi <<= 8; xhi |= xlo; |
771_8bit | 0:cc9489570dd1 | 129 | yhi <<= 8; yhi |= ylo; |
771_8bit | 0:cc9489570dd1 | 130 | zhi <<= 8; zhi |= zlo; |
771_8bit | 0:cc9489570dd1 | 131 | |
771_8bit | 0:cc9489570dd1 | 132 | mag_x = xhi * _mag_mgauss_lsb; |
771_8bit | 0:cc9489570dd1 | 133 | mag_y = yhi * _mag_mgauss_lsb; |
771_8bit | 0:cc9489570dd1 | 134 | mag_z = zhi * _mag_mgauss_lsb; |
771_8bit | 0:cc9489570dd1 | 135 | } |
771_8bit | 0:cc9489570dd1 | 136 | |
771_8bit | 0:cc9489570dd1 | 137 | uint8_t LSM9DS1::whoami(void){ |
771_8bit | 0:cc9489570dd1 | 138 | return read8(LSM9DS1_cs_AG,0x0F); |
771_8bit | 0:cc9489570dd1 | 139 | } |
771_8bit | 0:cc9489570dd1 | 140 | |
771_8bit | 0:cc9489570dd1 | 141 | uint8_t LSM9DS1::read8(lsm9ds1ChipSelect_t cs,uint8_t address){ |
771_8bit | 0:cc9489570dd1 | 142 | if(cs == LSM9DS1_cs_AG) cs_AG = 0; |
771_8bit | 0:cc9489570dd1 | 143 | else if(cs == LSM9DS1_cs_M) cs_M = 0; |
771_8bit | 0:cc9489570dd1 | 144 | spi8.write(address | 0x80); //先頭ビットを1にするとreadモードになる |
771_8bit | 0:cc9489570dd1 | 145 | uint8_t x = spi8.write(0x00); //ダミーリードして読み込み |
771_8bit | 0:cc9489570dd1 | 146 | if(cs == LSM9DS1_cs_AG) cs_AG = 1; |
771_8bit | 0:cc9489570dd1 | 147 | else if(cs == LSM9DS1_cs_M) cs_M = 1; |
771_8bit | 0:cc9489570dd1 | 148 | return x; |
771_8bit | 0:cc9489570dd1 | 149 | } |
771_8bit | 0:cc9489570dd1 | 150 | |
771_8bit | 0:cc9489570dd1 | 151 | void LSM9DS1::write8(lsm9ds1ChipSelect_t cs,uint8_t address,uint8_t data){ |
771_8bit | 0:cc9489570dd1 | 152 | if(cs == LSM9DS1_cs_AG) cs_AG = 0; |
771_8bit | 0:cc9489570dd1 | 153 | else if(cs == LSM9DS1_cs_M) cs_M = 0; |
771_8bit | 0:cc9489570dd1 | 154 | spi8.write(address); |
771_8bit | 0:cc9489570dd1 | 155 | spi8.write(data); |
771_8bit | 0:cc9489570dd1 | 156 | if(cs == LSM9DS1_cs_AG) cs_AG = 1; |
771_8bit | 0:cc9489570dd1 | 157 | else if(cs == LSM9DS1_cs_M) cs_M = 1; |
771_8bit | 0:cc9489570dd1 | 158 | } |