uint8_t magAvailable(lsm9ds1_axis axis) { uint8_t status; status = mReadByte(STATUS_REG_M); return ((status & (1<<axis)) >> axis); }
void setMagScale(uint8_t mScl) { // We need to preserve the other bytes in CTRL_REG6_XM. So, first read it: uint8_t temp = mReadByte(CTRL_REG2_M); // Then mask out the mag scale bits: temp &= 0xFF^(0x3 << 5); switch (mScl) { case 8: temp |= (0x1 << 5); settings.mag.scale = 8; break; case 12: temp |= (0x2 << 5); settings.mag.scale = 12; break; case 16: temp |= (0x3 << 5); settings.mag.scale = 16; break; default: // Otherwise we'll default to 4 gauss (00) settings.mag.scale = 4; break; } // And write the new register value back into CTRL_REG6_XM: mWriteByte(CTRL_REG2_M, temp); // We've updated the sensor, but we also need to update our class variables // First update mScale: //mScale = mScl; // Then calculate a new mRes, which relies on mScale being set correctly: calcmRes(); }
uint16_t LSM9DS1::begin() { //! Todo: don't use ACCEL_GYRO_ADDRESS or MAGNETOMETER_ADDRESS, duplicating memory constrainScales(); // Once we have the scale values, we can calculate the resolution // of each sensor. That's what these functions are for. One for each sensor calcgRes(); // Calculate DPS / ADC tick, stored in gRes variable calcmRes(); // Calculate Gs / ADC tick, stored in mRes variable calcaRes(); // Calculate g / ADC tick, stored in aRes variable initI2C(); // Initialize I2C // To verify communication, we can read from the WHO_AM_I register of // each device. Store those in a variable so we can return them. uint8_t mTest = mReadByte(WHO_AM_I_M); // Read the gyro WHO_AM_I uint8_t xgTest = xgReadByte(WHO_AM_I_XG); // Read the accel/mag WHO_AM_I uint16_t whoAmICombined = (xgTest << 8) | mTest; if (whoAmICombined != ((WHO_AM_I_AG_RSP << 8) | WHO_AM_I_M_RSP)) return 0; // Gyro initialization stuff: initGyro(); // This will "turn on" the gyro. Setting up interrupts, etc. // Accelerometer initialization stuff: initAccel(); // "Turn on" all axes of the accel. Set up interrupts, etc. // Magnetometer initialization stuff: initMag(); // "Turn on" all axes of the mag. Set up interrupts, etc. // Once everything is initialized, return the WHO_AM_I registers we read: return whoAmICombined; }
void setMagODR(uint8_t mRate) { // We need to preserve the other bytes in CTRL_REG5_XM. So, first read it: uint8_t temp = mReadByte(CTRL_REG1_M); // Then mask out the mag ODR bits: temp &= 0xFF^(0x7 << 2); // Then shift in our new ODR bits: temp |= ((mRate & 0x07) << 2); settings.mag.sampleRate = mRate & 0x07; // And write the new register value back into CTRL_REG5_XM: mWriteByte(CTRL_REG1_M, temp); }
uint16_t begin(void) { //! Todo: don't use _xgAddress or _mAddress, duplicating memory _xgAddress = settings.device.agAddress; _mAddress = settings.device.mAddress; constrainScales(); // Once we have the scale values, we can calculate the resolution // of each sensor. That's what these functions are for. One for each sensor calcgRes(); // Calculate DPS / ADC tick, stored in gRes variable calcmRes(); // Calculate Gs / ADC tick, stored in mRes variable calcaRes(); // Calculate g / ADC tick, stored in aRes variable if (settings.device.commInterface == IMU_MODE_I2C) // If we're using I2C initI2C(); // Initialize I2C else if (settings.device.commInterface == IMU_MODE_SPI) // else, if we're using SPI initSPI(); // Initialize SPI // To verify communication, we can read from the WHO_AM_I register of // each device. Store those in a variable so we can return them. uint8_t mTest = mReadByte(WHO_AM_I_M); // Read the gyro WHO_AM_I delay(DELAY * 150); uint8_t xgTest = xgReadByte(WHO_AM_I_XG); // Read the accel/mag WHO_AM_I uint16_t whoAmICombined = (xgTest << 8) | mTest; if (whoAmICombined != ((WHO_AM_I_AG_RSP << 8) | WHO_AM_I_M_RSP)) { return 0; } // Gyro initialization stuff: initGyro(); // This will "turn on" the gyro. Setting up interrupts, etc. // Accelerometer initialization stuff: initAccel(); // "Turn on" all axes of the accel. Set up interrupts, etc. // Magnetometer initialization stuff: initMag(); // "Turn on" all axes of the mag. Set up interrupts, etc. // Once everything is initialized, return the WHO_AM_I registers we read: return whoAmICombined; }