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 #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 }