49 #if (LSM6DS0_USE_I2C) || defined(__DOXYGEN__) 64 uint8_t* rxbuf,
size_t n) {
83 #define lsm6ds0I2CWriteRegister(i2cp, sad, txbuf, n) \ 84 i2cMasterTransmitTimeout(i2cp, sad, txbuf, n + 1, NULL, 0, \ 129 "acc_read_raw(), invalid state");
132 "acc_read_raw(), channel not ready");
134 #if LSM6DS0_SHARED_I2C 137 devp->config->i2ccfg);
141 LSM6DS0_AD_OUT_X_L_XL, buff,
144 #if LSM6DS0_SHARED_I2C 150 tmp = buff[2 * i] + (buff[2 * i + 1] << 8);
151 axes[i] = (int32_t)tmp;
185 "acc_read_cooked(), invalid state");
189 axes[i] = (raw[i] * devp->accsensitivity[i]) - devp->accbias[i];
217 "acc_set_bias(), invalid state");
220 devp->accbias[i] = bp[i];
246 "acc_reset_bias(), invalid state");
249 devp->accbias[i] = LSM6DS0_ACC_BIAS;
276 "acc_set_sensivity(), invalid state");
279 devp->accsensitivity[i] = sp[i];
305 "acc_reset_sensivity(), invalid state");
309 devp->accsensitivity[i] = LSM6DS0_ACC_SENS_2G;
312 devp->accsensitivity[i] = LSM6DS0_ACC_SENS_4G;
315 devp->accsensitivity[i] = LSM6DS0_ACC_SENS_8G;
318 devp->accsensitivity[i] = LSM6DS0_ACC_SENS_16G;
347 "acc_set_full_scale(), invalid state");
349 "acc_set_full_scale(), channel not ready");
353 newfs = LSM6DS0_ACC_2G;
356 newfs = LSM6DS0_ACC_4G;
359 newfs = LSM6DS0_ACC_8G;
362 newfs = LSM6DS0_ACC_16G;
369 if(newfs != devp->accfullscale) {
371 scale = newfs / devp->accfullscale;
372 devp->accfullscale = newfs;
374 #if LSM6DS0_SHARED_I2C 377 devp->config->i2ccfg);
382 devp->config->slaveaddress,
383 LSM6DS0_AD_CTRL_REG6_XL, &buff[1], 1);
385 #if LSM6DS0_SHARED_I2C 392 buff[1] &= ~(LSM6DS0_CTRL_REG6_XL_FS_MASK);
394 buff[0] = LSM6DS0_AD_CTRL_REG6_XL;
396 #if LSM6DS0_SHARED_I2C 398 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
402 devp->config->slaveaddress, buff, 1);
404 #if LSM6DS0_SHARED_I2C 413 devp->accsensitivity[i] *= scale;
414 devp->accbias[i] *= scale;
461 "gyro_read_raw(), invalid state");
464 "gyro_read_raw(), channel not ready");
466 #if LSM6DS0_SHARED_I2C 469 devp->config->i2ccfg);
473 LSM6DS0_AD_OUT_X_L_G, buff,
474 LSM6DS0_GYRO_NUMBER_OF_AXES * 2);
476 #if LSM6DS0_SHARED_I2C 482 tmp = buff[2 * i] + (buff[2 * i + 1] << 8);
483 axes[i] = (int32_t)tmp;
517 "gyro_read_cooked(), invalid state");
521 axes[i] = (raw[i] * devp->gyrosensitivity[i]) - devp->gyrobias[i];
551 "gyro_sample_bias(), invalid state");
554 "gyro_sample_bias(), channel not ready");
569 devp->gyrobias[i] *= devp->gyrosensitivity[i];
597 "gyro_set_bias(), invalid state");
600 devp->gyrobias[i] = bp[i];
626 "gyro_reset_bias(), invalid state");
629 devp->gyrobias[i] = LSM6DS0_GYRO_BIAS;
656 "gyro_set_sensivity(), invalid state");
659 devp->gyrosensitivity[i] = sp[i];
685 "gyro_reset_sensivity(), invalid state");
689 devp->gyrosensitivity[i] = LSM6DS0_GYRO_SENS_245DPS;
692 devp->gyrosensitivity[i] = LSM6DS0_GYRO_SENS_500DPS;
695 devp->gyrosensitivity[i] = LSM6DS0_GYRO_SENS_2000DPS;
724 "gyro_set_full_scale(), invalid state");
727 "gyro_set_full_scale(), channel not ready");
731 newfs = LSM6DS0_GYRO_245DPS;
734 newfs = LSM6DS0_GYRO_500DPS;
737 newfs = LSM6DS0_GYRO_2000DPS;
743 if(newfs != devp->gyrofullscale) {
744 scale = newfs / devp->gyrofullscale;
745 devp->gyrofullscale = newfs;
748 #if LSM6DS0_SHARED_I2C 751 devp->config->i2ccfg);
756 devp->config->slaveaddress,
757 LSM6DS0_AD_CTRL_REG1_G, &buff[1], 1);
759 #if LSM6DS0_SHARED_I2C 764 buff[1] &= ~(LSM6DS0_CTRL_REG1_G_FS_MASK);
766 buff[0] = LSM6DS0_AD_CTRL_REG1_G;
769 #if LSM6DS0_SHARED_I2C 772 devp->config->i2ccfg);
778 #if LSM6DS0_SHARED_I2C 785 devp->gyrosensitivity[i] *= scale;
786 devp->gyrobias[i] *= scale;
822 devp->
vmt = &vmt_device;
849 "lsm6ds0Start(), invalid state");
851 devp->config = config;
857 cr[0] = LSM6DS0_AD_CTRL_REG8;
858 cr[1] = LSM6DS0_CTRL_REG8_IF_ADD_INC;
859 #if LSM6DS0_USE_ADVANCED || defined(__DOXYGEN__) 860 cr[1] |= devp->config->endianness | devp->config->blockdataupdate;
864 #if LSM6DS0_SHARED_I2C 868 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
872 #if LSM6DS0_SHARED_I2C 879 cr[0] = LSM6DS0_AD_CTRL_REG5_XL;
882 cr[1] = LSM6DS0_CTRL_REG5_XL_XEN_XL | LSM6DS0_CTRL_REG5_XL_YEN_XL |
883 LSM6DS0_CTRL_REG5_XL_ZEN_XL;
884 #if LSM6DS0_ACC_USE_ADVANCED || defined(__DOXYGEN__) 885 cr[1] |= devp->config->accdecmode;
891 cr[2] = devp->config->accoutdatarate |
892 devp->config->accfullscale;
896 #if LSM6DS0_SHARED_I2C 898 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
904 #if LSM6DS0_SHARED_I2C 912 if(devp->config->accsensitivity == NULL)
913 devp->accsensitivity[i] = LSM6DS0_ACC_SENS_2G;
915 devp->accsensitivity[i] = devp->config->accsensitivity[i];
917 devp->accfullscale = LSM6DS0_ACC_2G;
921 if(devp->config->accsensitivity == NULL)
922 devp->accsensitivity[i] = LSM6DS0_ACC_SENS_4G;
924 devp->accsensitivity[i] = devp->config->accsensitivity[i];
926 devp->accfullscale = LSM6DS0_ACC_4G;
930 if(devp->config->accsensitivity == NULL)
931 devp->accsensitivity[i] = LSM6DS0_ACC_SENS_8G;
933 devp->accsensitivity[i] = devp->config->accsensitivity[i];
935 devp->accfullscale = LSM6DS0_ACC_8G;
939 if(devp->config->accsensitivity == NULL)
940 devp->accsensitivity[i] = LSM6DS0_ACC_SENS_16G;
942 devp->accsensitivity[i] = devp->config->accsensitivity[i];
944 devp->accfullscale = LSM6DS0_ACC_16G;
950 if(devp->config->accbias != NULL)
952 devp->accbias[i] = devp->config->accbias[i];
954 for(i = 0; i < LSM6DS0_ACC_NUMBER_OF_AXES; i++)
955 devp->accbias[i] = LSM6DS0_ACC_BIAS;
959 cr[0] = LSM6DS0_AD_CTRL_REG1_G;
963 cr[1] = devp->config->gyrofullscale |
964 devp->config->gyrooutdatarate;
970 #if LSM6DS0_GYRO_USE_ADVANCED || defined(__DOXYGEN__) 971 cr[2] |= devp->config->gyrooutsel;
978 #if LSM6DS0_GYRO_USE_ADVANCED || defined(__DOXYGEN__) 979 cr[3] |= devp->config->gyrohpfenable |
980 devp->config->gyrolowmodecfg |
981 devp->config->gyrohpcfg;
987 cr[4] = LSM6DS0_CTRL_REG4_XEN_G | LSM6DS0_CTRL_REG4_YEN_G |
988 LSM6DS0_CTRL_REG4_ZEN_G;
991 #if LSM6DS0_SHARED_I2C 993 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
999 #if LSM6DS0_SHARED_I2C 1004 cr[0] = LSM6DS0_AD_CTRL_REG9;
1010 #if LSM6DS0_SHARED_I2C 1012 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
1018 #if LSM6DS0_SHARED_I2C 1025 if(devp->config->gyrosensitivity == NULL)
1026 devp->gyrosensitivity[i] = LSM6DS0_GYRO_SENS_245DPS;
1028 devp->gyrosensitivity[i] = devp->config->gyrosensitivity[i];
1030 devp->gyrofullscale = LSM6DS0_GYRO_245DPS;
1034 if(devp->config->gyrosensitivity == NULL)
1035 devp->gyrosensitivity[i] = LSM6DS0_GYRO_SENS_500DPS;
1037 devp->gyrosensitivity[i] = devp->config->gyrosensitivity[i];
1039 devp->gyrofullscale = LSM6DS0_GYRO_500DPS;
1043 if(devp->config->gyrosensitivity == NULL)
1044 devp->gyrosensitivity[i] = LSM6DS0_GYRO_SENS_2000DPS;
1046 devp->gyrosensitivity[i] = devp->config->gyrosensitivity[i];
1048 devp->gyrofullscale = LSM6DS0_GYRO_2000DPS;
1054 if(devp->config->gyrobias != NULL)
1056 devp->gyrobias[i] = devp->config->gyrobias[i];
1058 for(i = 0; i < LSM6DS0_GYRO_NUMBER_OF_AXES; i++)
1059 devp->gyrobias[i] = LSM6DS0_GYRO_BIAS;
1080 "lsm6ds0Stop(), invalid state");
1084 #if LSM6DS0_SHARED_I2C 1086 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
1090 cr[0] = LSM6DS0_AD_CTRL_REG6_XL;
1096 cr[0] = LSM6DS0_AD_CTRL_REG9;
1097 cr[1] = LSM6DS0_CTRL_REG9_SLEEP_G;
1102 #if LSM6DS0_SHARED_I2C #define LSM6DS0_GYRO_BIAS_SETTLING_US
Settling time for gyroscope bias removal.
LSM6DS0 configuration structure.
LSM6DS0 MEMS interface module header.
static msg_t gyro_read_raw(void *ip, int32_t axes[LSM6DS0_GYRO_NUMBER_OF_AXES])
Retrieves raw data from the BaseGyroscope.
msg_t i2cMasterTransmitTimeout(I2CDriver *i2cp, i2caddr_t addr, const uint8_t *txbuf, size_t txbytes, uint8_t *rxbuf, size_t rxbytes, sysinterval_t timeout)
Sends data via the I2C bus.
static msg_t gyro_read_cooked(void *ip, float axes[])
Retrieves cooked data from the BaseGyroscope.
static msg_t gyro_reset_sensivity(void *ip)
Reset sensitivity values for the BaseGyroscope.
static msg_t acc_set_bias(void *ip, float *bp)
Set bias values for the BaseAccelerometer.
void i2cStart(I2CDriver *i2cp, const I2CConfig *config)
Configures and activates the I2C peripheral.
#define osalThreadSleepMicroseconds(usecs)
Delays the invoking thread for the specified number of microseconds.
lsm6ds0_acc_fs_t
LSM6DS0 accelerometer subsystem full scale.
LSM6DS0 virtual methods table.
void i2cAcquireBus(I2CDriver *i2cp)
Gains exclusive access to the I2C bus.
void i2cReleaseBus(I2CDriver *i2cp)
Releases exclusive access to the I2C bus.
static msg_t gyro_set_bias(void *ip, float *bp)
Set bias values for the BaseGyroscope.
LSM6DS0 6-axis accelerometer/gyroscope class.
BaseGyroscope virtual methods table.
#define LSM6DS0_ACC_NUMBER_OF_AXES
LSM6DS0 accelerometer subsystem characteristics.
void lsm6ds0ObjectInit(LSM6DS0Driver *devp)
Initializes an instance.
#define objGetInstance(type, ip)
Returns the instance pointer starting from an interface pointer.
BaseGyroscope gyro_if
Base gyroscope interface.
static msg_t gyro_sample_bias(void *ip)
Samples bias values for the BaseGyroscope.
static msg_t gyro_set_sensivity(void *ip, float *sp)
Set sensitivity values for the BaseGyroscope.
#define osalThreadSleepMilliseconds(msecs)
Delays the invoking thread for the specified number of milliseconds.
const struct LSM6DS0VMT * vmt
Virtual Methods Table.
static size_t gyro_get_axes_number(void *ip)
Return the number of axes of the BaseGyroscope.
lsm6ds0_sad_t
Accelerometer and Gyroscope Slave Address.
void i2cStop(I2CDriver *i2cp)
Deactivates the I2C peripheral.
void lsm6ds0Stop(LSM6DS0Driver *devp)
Deactivates the LSM6DS0 Complex Driver peripheral.
#define LSM6DS0_GYRO_BIAS_ACQ_TIMES
Number of acquisitions for gyroscope bias removal.
const struct BaseGyroscopeVMT * vmt
Virtual Methods Table.
lsm6ds0_gyro_fs_t
LSM6DS0 gyroscope subsystem full scale.
Structure representing an I2C driver.
#define TIME_INFINITE
Infinite interval specification for all functions with a timeout specification.
#define osalDbgCheck(c)
Function parameters check.
BaseAccelerometer acc_if
Base accelerometer interface.
static msg_t gyro_reset_bias(void *ip)
Reset bias values for the BaseGyroscope.
#define MSG_OK
Normal wakeup message.
#define LSM6DS0_GYRO_NUMBER_OF_AXES
L3GD20 gyroscope system characteristics.
#define lsm6ds0I2CWriteRegister(i2cp, sad, txbuf, n)
Writes a value into a register using I2C.
static msg_t acc_read_cooked(void *ip, float axes[])
Retrieves cooked data from the BaseAccelerometer.
static size_t acc_get_axes_number(void *ip)
Return the number of axes of the BaseAccelerometer.
static msg_t acc_reset_sensivity(void *ip)
Reset sensitivity values for the BaseAccelerometer.
void lsm6ds0Start(LSM6DS0Driver *devp, const LSM6DS0Config *config)
Configures and activates LSM6DS0 Complex Driver peripheral.
static msg_t acc_set_sensivity(void *ip, float *sp)
Set sensitivity values for the BaseAccelerometer.
#define osalDbgAssert(c, remark)
Condition assertion.
static msg_t gyro_set_full_scale(LSM6DS0Driver *devp, lsm6ds0_gyro_fs_t fs)
Changes the LSM6DS0Driver gyroscope fullscale value.
static msg_t acc_read_raw(void *ip, int32_t axes[])
Retrieves raw data from the BaseAccelerometer.
BaseAccelerometer virtual methods table.
Base accelerometer class.
static msg_t acc_set_full_scale(LSM6DS0Driver *devp, lsm6ds0_acc_fs_t fs)
Changes the LSM6DS0Driver accelerometer fullscale value.
const struct BaseAccelerometerVMT * vmt
Virtual Methods Table.
static msg_t acc_reset_bias(void *ip)
Reset bias values for the BaseAccelerometer.
msg_t lsm6ds0I2CReadRegister(I2CDriver *i2cp, lsm6ds0_sad_t sad, uint8_t reg, uint8_t *rxbuf, size_t n)
Reads registers value using I2C.
#define FALSE
Generic 'false' preprocessor boolean constant.
#define MSG_RESET
Wakeup caused by a reset condition.