70 uint8_t reg, uint8_t *rxbuf,
size_t n) {
73 return i2cMasterTransmitTimeout(i2cp, sad, &txbuf, 1, rxbuf, n,
90 uint8_t *txbuf,
size_t n) {
93 return i2cMasterTransmitTimeout(i2cp, sad, txbuf, n + 1, NULL, 0,
132 osalDbgCheck((ip != NULL) && (axes != NULL));
138 "acc_read_raw(), invalid state");
139 osalDbgAssert((devp->config->i2cp->state == I2C_READY),
140 "acc_read_raw(), channel not ready");
142#if LSM303DLHC_SHARED_I2C
143 i2cAcquireBus(devp->config->i2cp);
144 i2cStart(devp->config->i2cp,
145 devp->config->i2ccfg);
152#if LSM303DLHC_SHARED_I2C
153 i2cReleaseBus(devp->config->i2cp);
158 tmp = buff[2 * i] + (buff[2 * i + 1] << 8);
159 axes[i] = (int32_t)tmp;
187 osalDbgCheck((ip != NULL) && (axes != NULL));
193 "acc_read_cooked(), invalid state");
197 axes[i] = (raw[i] * devp->accsensitivity[i]) - devp->accbias[i];
219 osalDbgCheck((ip != NULL) && (bp != NULL));
225 "acc_set_bias(), invalid state");
228 devp->accbias[i] = bp[i];
248 osalDbgCheck(ip != NULL);
254 "acc_reset_bias(), invalid state");
281 osalDbgCheck((ip != NULL) && (sp != NULL));
284 "acc_set_sensivity(), invalid state");
287 devp->accsensitivity[i] = sp[i];
307 osalDbgCheck(ip != NULL);
313 "acc_reset_sensivity(), invalid state");
328 osalDbgAssert(FALSE,
"acc_reset_sensivity(), accelerometer full scale issue");
353 osalDbgCheck(devp != NULL);
356 "acc_set_full_scale(), invalid state");
357 osalDbgAssert((devp->config->i2cp->state == I2C_READY),
358 "acc_set_full_scale(), channel not ready");
381 if((msg == MSG_OK) &&
382 (newfs != devp->accfullscale)) {
384 scale = newfs / devp->accfullscale;
385 devp->accfullscale = newfs;
387#if LSM303DLHC_SHARED_I2C
388 i2cAcquireBus(devp->config->i2cp);
389 i2cStart(devp->config->i2cp,
390 devp->config->i2ccfg);
399#if LSM303DLHC_SHARED_I2C
400 i2cReleaseBus(devp->config->i2cp);
409#if LSM303DLHC_SHARED_I2C
410 i2cAcquireBus(devp->config->i2cp);
411 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
417#if LSM303DLHC_SHARED_I2C
418 i2cReleaseBus(devp->config->i2cp);
425 devp->accsensitivity[i] *= scale;
426 devp->accbias[i] *= scale;
442 osalDbgCheck(ip != NULL);
468 osalDbgCheck((ip != NULL) && (axes != NULL));
474 "comp_read_raw(), invalid state");
475 osalDbgAssert((devp->config->i2cp->state == I2C_READY),
476 "comp_read_raw(), channel not ready");
478#if LSM303DLHC_SHARED_I2C
479 i2cAcquireBus(devp->config->i2cp);
480 i2cStart(devp->config->i2cp,
481 devp->config->i2ccfg);
487#if LSM303DLHC_SHARED_I2C
488 i2cReleaseBus(devp->config->i2cp);
493 tmp = buff[2 * i] + (buff[2 * i + 1] << 8);
494 axes[i] = (int32_t)tmp;
522 osalDbgCheck((ip != NULL) && (axes != NULL));
529 "comp_read_cooked(), invalid state");
533 axes[i] = (raw[i] * devp->compsensitivity[i]) - devp->compbias[i];
555 osalDbgCheck((ip != NULL) && (bp != NULL));
561 "comp_set_bias(), invalid state");
564 devp->compbias[i] = bp[i];
584 osalDbgCheck(ip != NULL);
590 "comp_reset_bias(), invalid state");
617 osalDbgCheck((ip != NULL) && (sp != NULL));
620 "comp_set_sensivity(), invalid state");
623 devp->compsensitivity[i] = sp[i];
643 osalDbgCheck(ip != NULL);
649 "comp_reset_sensivity(), invalid state");
715 osalDbgAssert(FALSE,
"comp_reset_sensivity(), compass full scale issue");
740 osalDbgCheck(devp != NULL);
743 "comp_set_full_scale(), invalid state");
744 osalDbgAssert((devp->config->i2cp->state == I2C_READY),
745 "comp_set_full_scale(), channel not ready");
774 if(newfs != devp->compfullscale) {
776 scale = newfs / devp->compfullscale;
777 devp->compfullscale = newfs;
779#if LSM303DLHC_SHARED_I2C
780 i2cAcquireBus(devp->config->i2cp);
781 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
788#if LSM303DLHC_SHARED_I2C
789 i2cReleaseBus(devp->config->i2cp);
798#if LSM303DLHC_SHARED_I2C
799 i2cAcquireBus(devp->config->i2cp);
800 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
806#if LSM303DLHC_SHARED_I2C
807 i2cReleaseBus(devp->config->i2cp);
815 devp->compsensitivity[i] *= scale;
816 devp->compbias[i] *= scale;
874 osalDbgCheck((devp != NULL) && (config != NULL));
878 "lsm303dlhcStart(), invalid state");
880 devp->config = config;
891#if LSM303DLHC_USE_ADVANCED || defined(__DOXYGEN__)
892 cr[1] |= devp->config->acclowpower;
908 cr[4] = devp->config->accfullscale;
909#if LSM303DLHC_USE_ADVANCED || defined(__DOXYGEN__)
910 cr[4] |= devp->config->accendianess |
911 devp->config->accbdu |
912 devp->config->acchighresmode;
916#if LSM303DLHC_SHARED_I2C
917 i2cAcquireBus((devp)->config->
i2cp);
919 i2cStart((devp)->config->
i2cp, (devp)->config->i2ccfg);
923#if LSM303DLHC_SHARED_I2C
924 i2cReleaseBus((devp)->config->
i2cp);
931 if(devp->config->accsensitivity == NULL)
934 devp->accsensitivity[i] = devp->config->accsensitivity[i];
940 if(devp->config->accsensitivity == NULL)
943 devp->accsensitivity[i] = devp->config->accsensitivity[i];
949 if(devp->config->accsensitivity == NULL)
952 devp->accsensitivity[i] = devp->config->accsensitivity[i];
958 if(devp->config->accsensitivity == NULL)
961 devp->accsensitivity[i] = devp->config->accsensitivity[i];
965 osalDbgAssert(FALSE,
"lsm303dlhcStart(), accelerometer full scale issue");
968 if(devp->config->accbias != NULL)
970 devp->accbias[i] = devp->config->accbias[i];
981 cr[1] = devp->config->compodr;
986 cr[2] = devp->config->compfullscale;
992#if LSM303DLHC_USE_ADVANCED || defined(__DOXYGEN__)
993 cr[3] |= devp->config->compmode;
997#if LSM303DLHC_SHARED_I2C
998 i2cAcquireBus((devp)->config->
i2cp);
999 i2cStart((devp)->config->
i2cp, (devp)->config->i2ccfg);
1005#if LSM303DLHC_SHARED_I2C
1006 i2cReleaseBus((devp)->config->
i2cp);
1012 if(devp->config->compsensitivity == NULL) {
1021 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1028 if(devp->config->compsensitivity == NULL) {
1037 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1044 if(devp->config->compsensitivity == NULL) {
1053 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1060 if(devp->config->compsensitivity == NULL) {
1069 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1076 if(devp->config->compsensitivity == NULL) {
1085 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1092 if(devp->config->compsensitivity == NULL) {
1101 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1108 if(devp->config->compsensitivity == NULL) {
1117 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1122 osalDbgAssert(FALSE,
"lsm303dlhcStart(), compass full scale issue");
1125 if(devp->config->compbias != NULL)
1127 devp->compbias[i] = devp->config->compbias[i];
1133 osalThreadSleepMilliseconds(5);
1147 osalDbgCheck(devp != NULL);
1151 "lsm303dlhcStop(), invalid state");
1154#if LSM303DLHC_SHARED_I2C
1155 i2cAcquireBus((devp)->config->i2cp);
1156 i2cStart((devp)->config->i2cp, (devp)->config->i2ccfg);
1171 i2cStop((devp)->config->i2cp);
1172#if LSM303DLHC_SHARED_I2C
1173 i2cReleaseBus((devp)->config->i2cp);
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.
static msg_t acc_set_bias(void *ip, float *bp)
Set bias values for the BaseAccelerometer.
static msg_t acc_reset_bias(void *ip)
Reset bias values for the BaseAccelerometer.
static msg_t acc_set_sensivity(void *ip, float *sp)
Set sensitivity values for the BaseAccelerometer.
static msg_t acc_read_cooked(void *ip, float axes[])
Retrieves cooked data from the BaseAccelerometer.
static msg_t acc_read_raw(void *ip, int32_t axes[])
Retrieves raw data from the BaseAccelerometer.
static const struct BaseAccelerometerVMT vmt_accelerometer
static const struct ADXL317VMT vmt_device
static msg_t acc_set_full_scale(ADXL355Driver *devp, adxl355_acc_fs_t fs)
Changes the ADXL355Driver accelerometer fullscale value.
static size_t comp_get_axes_number(void *ip)
Return the number of axes of the BaseCompass.
static msg_t comp_set_full_scale(LIS3MDLDriver *devp, lis3mdl_comp_fs_t fs)
Changes the LIS3MDLDriver compass fullscale value.
static msg_t comp_set_sensivity(void *ip, float *sp)
Set sensitivity values for the BaseCompass.
static msg_t comp_reset_bias(void *ip)
Reset bias values for the BaseCompass.
static msg_t comp_set_bias(void *ip, float *bp)
Set bias values for the BaseCompass.
static msg_t comp_reset_sensivity(void *ip)
Reset sensitivity values for the BaseCompass.
static msg_t comp_read_cooked(void *ip, float axes[])
Retrieves cooked data from the BaseCompass.
static const struct BaseCompassVMT vmt_compass
static msg_t comp_read_raw(void *ip, int32_t axes[])
Retrieves raw data from the BaseCompass.
#define LSM303DLHC_COMP_SENS_Z_4P0GA
#define LSM303DLHC_AD_ACC_CTRL_REG1
static size_t comp_get_axes_number(void *ip)
Return the number of axes of the BaseCompass.
#define LSM303DLHC_COMP_1P9GA
void lsm303dlhcStop(LSM303DLHCDriver *devp)
Deactivates the LSM303DLHC Complex Driver peripheral.
#define LSM303DLHC_ACC_8G
static msg_t comp_set_sensivity(void *ip, float *sp)
Set sensitivity values for the BaseCompass.
#define LSM303DLHC_ACC_4G
#define LSM303DLHC_COMP_2P5GA
#define LSM303DLHC_COMP_SENS_Z_1P3GA
static msg_t comp_reset_bias(void *ip)
Reset bias values for the BaseCompass.
static size_t acc_get_axes_number(void *ip)
Return the number of axes of the BaseAccelerometer.
#define LSM303DLHC_COMP_SENS_XY_5P6GA
lsm303dlhc_comp_fs_t
LSM303DLHC compass subsystem full scale.
#define LSM303DLHC_AD_ACC_CTRL_REG4
static msg_t comp_set_full_scale(LSM303DLHCDriver *devp, lsm303dlhc_comp_fs_t fs)
Changes the LSM303DLHCDriver compass fullscale value.
static msg_t acc_set_full_scale(LSM303DLHCDriver *devp, lsm303dlhc_acc_fs_t fs)
Changes the LSM303DLHCDriver accelerometer fullscale value.
#define LSM303DLHC_COMP_SENS_Z_8P1GA
static msg_t acc_reset_sensivity(void *ip)
Reset sensitivity values for the BaseAccelerometer.
#define LSM303DLHC_CTRL_REG1_A_XEN
static msg_t comp_set_bias(void *ip, float *bp)
Set bias values for the BaseCompass.
#define LSM303DLHC_COMP_8P1GA
static msg_t acc_set_bias(void *ip, float *bp)
Set bias values for the BaseAccelerometer.
#define LSM303DLHC_ACC_SENS_8G
#define LSM303DLHC_CTRL_REG4_A_FS_MASK
static msg_t comp_reset_sensivity(void *ip)
Reset sensitivity values for the BaseCompass.
static msg_t lsm303dlhcI2CWriteRegister(I2CDriver *i2cp, lsm303dlhc_sad_t sad, uint8_t *txbuf, size_t n)
Writes a value into a register using I2C.
#define LSM303DLHC_AD_COMP_OUT_X_L
#define LSM303DLHC_AD_COMP_MR_REG
#define LSM303DLHC_COMP_4P0GA
#define LSM303DLHC_ACC_BIAS
void lsm303dlhcStart(LSM303DLHCDriver *devp, const LSM303DLHCConfig *config)
Configures and activates LSM303DLHC Complex Driver peripheral.
#define LSM303DLHC_COMP_4P7GA
static msg_t comp_read_cooked(void *ip, float axes[])
Retrieves cooked data from the BaseCompass.
#define LSM303DLHC_ACC_NUMBER_OF_AXES
LSM303DLHC accelerometer subsystem characteristics.
#define LSM303DLHC_ACC_SENS_16G
static msg_t lsm303dlhcI2CReadRegister(I2CDriver *i2cp, lsm303dlhc_sad_t sad, uint8_t reg, uint8_t *rxbuf, size_t n)
Reads registers value using I2C.
#define LSM303DLHC_CRB_REG_M_GN_MASK
static msg_t acc_reset_bias(void *ip)
Reset bias values for the BaseAccelerometer.
lsm303dlhc_acc_fs_t
LSM303DLHC accelerometer subsystem full scale.
#define LSM303DLHC_ACC_SENS_2G
#define LSM303DLHC_COMP_SENS_XY_1P9GA
#define LSM303DLHC_ACC_2G
#define LSM303DLHC_ACC_16G
#define LSM303DLHC_COMP_SENS_XY_2P5GA
static msg_t acc_set_sensivity(void *ip, float *sp)
Set sensitivity values for the BaseAccelerometer.
#define LSM303DLHC_AD_ACC_OUT_X_L
static msg_t acc_read_cooked(void *ip, float axes[])
Retrieves cooked data from the BaseAccelerometer.
#define LSM303DLHC_COMP_SENS_XY_1P3GA
static msg_t acc_read_raw(void *ip, int32_t axes[])
Retrieves raw data from the BaseAccelerometer.
lsm303dlhc_sad_t
Accelerometer and Compass Slave Address.
#define LSM303DLHC_COMP_1P3GA
#define LSM303DLHC_AD_COMP_CRB_REG
#define LSM303DLHC_COMP_SENS_XY_4P7GA
void lsm303dlhcObjectInit(LSM303DLHCDriver *devp)
Initializes an instance.
#define LSM303DLHC_COMP_SENS_Z_1P9GA
#define LSM303DLHC_COMP_SENS_Z_2P5GA
#define LSM303DLHC_CTRL_REG1_A_ZEN
#define LSM303DLHC_COMP_SENS_Z_5P6GA
#define LSM303DLHC_COMP_5P6GA
#define LSM303DLHC_CTRL_REG1_A_YEN
static msg_t comp_read_raw(void *ip, int32_t axes[])
Retrieves raw data from the BaseCompass.
#define LSM303DLHC_COMP_BIAS
#define LSM303DLHC_COMP_SENS_XY_4P0GA
#define LSM303DLHC_COMP_SENS_XY_8P1GA
#define LSM303DLHC_COMP_NUMBER_OF_AXES
LSM303DLHC compass subsystem characteristics.
#define LSM303DLHC_AD_COMP_CRA_REG
#define LSM303DLHC_ACC_SENS_4G
#define LSM303DLHC_COMP_SENS_Z_4P7GA
@ LSM303DLHC_COMP_FS_8P1GA
@ LSM303DLHC_COMP_FS_4P7GA
@ LSM303DLHC_COMP_FS_1P3GA
@ LSM303DLHC_COMP_FS_2P5GA
@ LSM303DLHC_COMP_FS_1P9GA
@ LSM303DLHC_COMP_FS_4P0GA
@ LSM303DLHC_COMP_FS_5P6GA
@ LSM303DLHC_ACC_AE_DISABLED
@ LSM303DLHC_COMP_MD_SLEEP
LSM303DLHC MEMS interface module header.
Base accelerometer class.
const struct BaseAccelerometerVMT * vmt
Virtual Methods Table.
BaseAccelerometer virtual methods table.
const struct BaseCompassVMT * vmt
Virtual Methods Table.
BaseCompass virtual methods table.
LSM303DLHC configuration structure.
I2CDriver * i2cp
I2C driver associated to this LSM303DLHC.
LSM303DLHC 6-axis accelerometer/compass class.
BaseCompass comp_if
Base compass interface.
const struct LSM303DLHCVMT * vmt
Virtual Methods Table.
BaseAccelerometer acc_if
Base accelerometer interface.
LSM303DLHC virtual methods table.