LSM9DS1 SPI
Diff: LSM9DS1.cpp
- Revision:
- 0:cc9489570dd1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LSM9DS1.cpp Thu Apr 25 04:04:04 2019 +0000 @@ -0,0 +1,158 @@ +#include "mbed.h" +#include "LSM9DS1.h" + +//spi8,はmbedのSPIクラスのインスタンス +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) { + initSPI(); +} + +void LSM9DS1::initSPI(void){ + cs_AG = 1; //deselect + cs_M =1; + spi8.format(8,3); + spi8.frequency(10000000); +} + +void LSM9DS1::initAccel(lsm9ds1AccelRange_t range){ + // Enable the accelerometer continous + write8(LSM9DS1_cs_AG, LSM9DS1_REGISTER_CTRL_REG5_XL, 0x38); // enable X Y and Z axis + write8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_CTRL_REG6_XL,0xC0 | range); // 1 KHz out data rate, BW set by ODR, 408Hz anti-aliasing 感度設定 + + switch (range) + { + case LSM9DS1_ACCELRANGE_2G: + _accel_mg_lsb = LSM9DS1_ACCEL_MG_LSB_2G; + break; + case LSM9DS1_ACCELRANGE_4G: + _accel_mg_lsb = LSM9DS1_ACCEL_MG_LSB_4G; + break; + case LSM9DS1_ACCELRANGE_8G: + _accel_mg_lsb = LSM9DS1_ACCEL_MG_LSB_8G; + break; + case LSM9DS1_ACCELRANGE_16G: + _accel_mg_lsb =LSM9DS1_ACCEL_MG_LSB_16G; + break; + } +} + + +void LSM9DS1::initGyro(lsm9ds1GyroScale_t scale){ + write8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_CTRL_REG1_G,0xC0 | scale); //感度設定 + + switch(scale) + { + case LSM9DS1_GYROSCALE_245DPS: + _gyro_dps_digit = LSM9DS1_GYRO_DPS_DIGIT_245DPS; + break; + case LSM9DS1_GYROSCALE_500DPS: + _gyro_dps_digit = LSM9DS1_GYRO_DPS_DIGIT_500DPS; + break; + case LSM9DS1_GYROSCALE_2000DPS: + _gyro_dps_digit = LSM9DS1_GYRO_DPS_DIGIT_2000DPS; + break; + } +} + +void LSM9DS1::initMag(lsm9ds1MagGain_t gain){ + write8(LSM9DS1_cs_M,LSM9DS1_REGISTER_CTRL_REG1_M,0xFC); + write8(LSM9DS1_cs_M, LSM9DS1_REGISTER_CTRL_REG2_M, gain ); //感度設定 + write8(LSM9DS1_cs_M,LSM9DS1_REGISTER_CTRL_REG3_M,0x00); + write8(LSM9DS1_cs_M,LSM9DS1_REGISTER_CTRL_REG4_M,0x0C); + + switch(gain) + { + case LSM9DS1_MAGGAIN_4GAUSS: + _mag_mgauss_lsb = LSM9DS1_MAG_MGAUSS_4GAUSS; + break; + case LSM9DS1_MAGGAIN_8GAUSS: + _mag_mgauss_lsb = LSM9DS1_MAG_MGAUSS_8GAUSS; + break; + case LSM9DS1_MAGGAIN_12GAUSS: + _mag_mgauss_lsb = LSM9DS1_MAG_MGAUSS_12GAUSS; + break; + case LSM9DS1_MAGGAIN_16GAUSS: + _mag_mgauss_lsb = LSM9DS1_MAG_MGAUSS_16GAUSS; + break; + } +} + +void LSM9DS1::readAccel() { + // Read the accelerometer + + uint8_t xlo = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_X_L_XL); + int16_t xhi = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_X_H_XL); + uint8_t ylo = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Y_L_XL); + int16_t yhi = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Y_H_XL); + uint8_t zlo = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Z_L_XL); + int16_t zhi = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Z_H_XL); + + // Shift values to create properly formed integer (low byte first) + xhi <<= 8; xhi |= xlo; + yhi <<= 8; yhi |= ylo; + zhi <<= 8; zhi |= zlo; + accel_x = (xhi * _accel_mg_lsb)/100; + accel_y = (yhi * _accel_mg_lsb)/100; + accel_z = (zhi * _accel_mg_lsb)/100; +} + +void LSM9DS1::readGyro(){ + + uint8_t xlo = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_X_L_G); + int16_t xhi = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_X_H_G); + uint8_t ylo = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Y_L_G); + int16_t yhi = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Y_H_G); + uint8_t zlo = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Z_L_G); + int16_t zhi = read8(LSM9DS1_cs_AG,LSM9DS1_REGISTER_OUT_Z_H_G); + + // Shift values to create properly formed integer (low byte first) + xhi <<= 8; xhi |= xlo; + yhi <<= 8; yhi |= ylo; + zhi <<= 8; zhi |= zlo; + + gyro_x = xhi * _gyro_dps_digit; + gyro_y = yhi * _gyro_dps_digit; + gyro_z = zhi * _gyro_dps_digit; +} + +void LSM9DS1::readMag(){ + + + uint8_t xlo = read8(LSM9DS1_cs_M,LSM9DS1_REGISTER_OUT_X_L_M); + int16_t xhi = read8(LSM9DS1_cs_M,LSM9DS1_REGISTER_OUT_X_H_M); + uint8_t ylo = read8(LSM9DS1_cs_M,LSM9DS1_REGISTER_OUT_Y_L_M); + int16_t yhi = read8(LSM9DS1_cs_M,LSM9DS1_REGISTER_OUT_Y_H_M); + uint8_t zlo = read8(LSM9DS1_cs_M,LSM9DS1_REGISTER_OUT_Z_L_M); + int16_t zhi = read8(LSM9DS1_cs_M,LSM9DS1_REGISTER_OUT_Z_H_M); + + // Shift values to create properly formed integer (low byte first) + xhi <<= 8; xhi |= xlo; + yhi <<= 8; yhi |= ylo; + zhi <<= 8; zhi |= zlo; + + mag_x = xhi * _mag_mgauss_lsb; + mag_y = yhi * _mag_mgauss_lsb; + mag_z = zhi * _mag_mgauss_lsb; +} + +uint8_t LSM9DS1::whoami(void){ + return read8(LSM9DS1_cs_AG,0x0F); +} + +uint8_t LSM9DS1::read8(lsm9ds1ChipSelect_t cs,uint8_t address){ + if(cs == LSM9DS1_cs_AG) cs_AG = 0; + else if(cs == LSM9DS1_cs_M) cs_M = 0; + spi8.write(address | 0x80); //先頭ビットを1にするとreadモードになる + uint8_t x = spi8.write(0x00); //ダミーリードして読み込み + if(cs == LSM9DS1_cs_AG) cs_AG = 1; + else if(cs == LSM9DS1_cs_M) cs_M = 1; + return x; +} + +void LSM9DS1::write8(lsm9ds1ChipSelect_t cs,uint8_t address,uint8_t data){ + if(cs == LSM9DS1_cs_AG) cs_AG = 0; + else if(cs == LSM9DS1_cs_M) cs_M = 0; + spi8.write(address); + spi8.write(data); + if(cs == LSM9DS1_cs_AG) cs_AG = 1; + else if(cs == LSM9DS1_cs_M) cs_M = 1; +} \ No newline at end of file