70 uint8_t reg, uint8_t *rxbuf,
size_t n) {
72 uint8_t txbuf = reg | LSM303DLHC_MS;
90 uint8_t *txbuf,
size_t n) {
92 *txbuf |= LSM303DLHC_MS;
138 "acc_read_raw(), invalid state");
140 "acc_read_raw(), channel not ready");
142 #if LSM303DLHC_SHARED_I2C 145 devp->config->i2ccfg);
149 LSM303DLHC_AD_ACC_OUT_X_L, buff,
152 #if LSM303DLHC_SHARED_I2C 158 tmp = buff[2 * i] + (buff[2 * i + 1] << 8);
159 axes[i] = (int32_t)tmp;
193 "acc_read_cooked(), invalid state");
197 axes[i] = (raw[i] * devp->accsensitivity[i]) - devp->accbias[i];
225 "acc_set_bias(), invalid state");
228 devp->accbias[i] = bp[i];
254 "acc_reset_bias(), invalid state");
257 devp->accbias[i] = LSM303DLHC_ACC_BIAS;
284 "acc_set_sensivity(), invalid state");
287 devp->accsensitivity[i] = sp[i];
313 "acc_reset_sensivity(), invalid state");
317 devp->accsensitivity[i] = LSM303DLHC_ACC_SENS_2G;
320 devp->accsensitivity[i] = LSM303DLHC_ACC_SENS_4G;
323 devp->accsensitivity[i] = LSM303DLHC_ACC_SENS_8G;
326 devp->accsensitivity[i] = LSM303DLHC_ACC_SENS_16G;
356 "acc_set_full_scale(), invalid state");
358 "acc_set_full_scale(), channel not ready");
362 newfs = LSM303DLHC_ACC_2G;
365 newfs = LSM303DLHC_ACC_4G;
368 newfs = LSM303DLHC_ACC_8G;
371 newfs = LSM303DLHC_ACC_16G;
378 if(newfs != devp->accfullscale) {
380 scale = newfs / devp->accfullscale;
381 devp->accfullscale = newfs;
383 #if LSM303DLHC_SHARED_I2C 386 devp->config->i2ccfg);
392 LSM303DLHC_AD_ACC_CTRL_REG4,
395 #if LSM303DLHC_SHARED_I2C 402 buff[1] &= ~(LSM303DLHC_CTRL_REG4_A_FS_MASK);
404 buff[0] = LSM303DLHC_AD_ACC_CTRL_REG4;
406 #if LSM303DLHC_SHARED_I2C 408 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
414 #if LSM303DLHC_SHARED_I2C 423 devp->accsensitivity[i] *= scale;
424 devp->accbias[i] *= scale;
471 "comp_read_raw(), invalid state");
473 "comp_read_raw(), channel not ready");
475 #if LSM303DLHC_SHARED_I2C 478 devp->config->i2ccfg);
481 LSM303DLHC_AD_COMP_OUT_X_L, buff,
484 #if LSM303DLHC_SHARED_I2C 490 tmp = buff[2 * i] + (buff[2 * i + 1] << 8);
491 axes[i] = (int32_t)tmp;
526 "comp_read_cooked(), invalid state");
530 axes[i] = (raw[i] * devp->compsensitivity[i]) - devp->compbias[i];
558 "comp_set_bias(), invalid state");
561 devp->compbias[i] = bp[i];
587 "comp_reset_bias(), invalid state");
590 devp->compbias[i] = LSM303DLHC_COMP_BIAS;
617 "comp_set_sensivity(), invalid state");
620 devp->compsensitivity[i] = sp[i];
646 "comp_reset_sensivity(), invalid state");
651 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_1P3GA;
654 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_1P3GA;
660 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_1P9GA;
663 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_1P9GA;
669 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_2P5GA;
672 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_2P5GA;
678 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_4P0GA;
681 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_4P0GA;
687 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_4P7GA;
690 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_4P7GA;
696 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_5P6GA;
699 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_5P6GA;
705 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_8P1GA;
708 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_8P1GA;
740 "comp_set_full_scale(), invalid state");
742 "comp_set_full_scale(), channel not ready");
746 newfs = LSM303DLHC_COMP_1P3GA;
749 newfs = LSM303DLHC_COMP_1P9GA;
752 newfs = LSM303DLHC_COMP_2P5GA;
755 newfs = LSM303DLHC_COMP_4P0GA;
758 newfs = LSM303DLHC_COMP_4P7GA;
761 newfs = LSM303DLHC_COMP_5P6GA;
764 newfs = LSM303DLHC_COMP_8P1GA;
771 if(newfs != devp->compfullscale) {
773 scale = newfs / devp->compfullscale;
774 devp->compfullscale = newfs;
776 #if LSM303DLHC_SHARED_I2C 778 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
783 LSM303DLHC_AD_COMP_CRB_REG, &buff[1], 1);
785 #if LSM303DLHC_SHARED_I2C 791 buff[1] &= ~(LSM303DLHC_CRB_REG_M_GN_MASK);
793 buff[0] = LSM303DLHC_AD_COMP_CRB_REG;
795 #if LSM303DLHC_SHARED_I2C 797 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
803 #if LSM303DLHC_SHARED_I2C 812 devp->compsensitivity[i] *= scale;
813 devp->compbias[i] *= scale;
848 devp->
vmt = &vmt_device;
875 "lsm303dlhcStart(), invalid state");
877 devp->config = config;
882 cr[0] = LSM303DLHC_AD_ACC_CTRL_REG1;
886 cr[1] = LSM303DLHC_CTRL_REG1_A_XEN | LSM303DLHC_CTRL_REG1_A_YEN |
887 LSM303DLHC_CTRL_REG1_A_ZEN | devp->config->accoutdatarate;
888 #if LSM303DLHC_ACC_USE_ADVANCED || defined(__DOXYGEN__) 889 cr[1] |= devp->config->acclowpower;
905 cr[4] = devp->config->accfullscale;
906 #if LSM303DLHC_ACC_USE_ADVANCED || defined(__DOXYGEN__) 907 cr[4] |= devp->config->accendianess |
908 devp->config->accblockdataupdate |
909 devp->config->acchighresmode;
913 #if LSM303DLHC_SHARED_I2C 920 #if LSM303DLHC_SHARED_I2C 926 devp->accfullscale = LSM303DLHC_ACC_2G;
928 if(devp->config->accsensitivity == NULL)
929 devp->accsensitivity[i] = LSM303DLHC_ACC_SENS_2G;
931 devp->accsensitivity[i] = devp->config->accsensitivity[i];
935 devp->accfullscale = LSM303DLHC_ACC_4G;
937 if(devp->config->accsensitivity == NULL)
938 devp->accsensitivity[i] = LSM303DLHC_ACC_SENS_4G;
940 devp->accsensitivity[i] = devp->config->accsensitivity[i];
944 devp->accfullscale = LSM303DLHC_ACC_8G;
946 if(devp->config->accsensitivity == NULL)
947 devp->accsensitivity[i] = LSM303DLHC_ACC_SENS_8G;
949 devp->accsensitivity[i] = devp->config->accsensitivity[i];
953 devp->accfullscale = LSM303DLHC_ACC_16G;
955 if(devp->config->accsensitivity == NULL)
956 devp->accsensitivity[i] = LSM303DLHC_ACC_SENS_16G;
958 devp->accsensitivity[i] = devp->config->accsensitivity[i];
965 if(devp->config->accbias != NULL)
967 devp->accbias[i] = devp->config->accbias[i];
969 for(i = 0; i < LSM303DLHC_ACC_NUMBER_OF_AXES; i++)
970 devp->accbias[i] = LSM303DLHC_ACC_BIAS;
974 cr[0] = LSM303DLHC_AD_COMP_CRA_REG;
978 cr[1] = devp->config->compoutputdatarate;
983 cr[2] = devp->config->compfullscale;
989 #if LSM303DLHC_COMP_USE_ADVANCED || defined(__DOXYGEN__) 990 cr[3] |= devp->config->compmode;
994 #if LSM303DLHC_SHARED_I2C 1002 #if LSM303DLHC_SHARED_I2C 1007 devp->compfullscale = LSM303DLHC_COMP_1P3GA;
1009 if(devp->config->compsensitivity == NULL) {
1011 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_1P3GA;
1014 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_1P3GA;
1018 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1023 devp->compfullscale = LSM303DLHC_COMP_1P9GA;
1025 if(devp->config->compsensitivity == NULL) {
1027 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_1P9GA;
1030 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_1P9GA;
1034 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1039 devp->compfullscale = LSM303DLHC_COMP_2P5GA;
1041 if(devp->config->compsensitivity == NULL) {
1043 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_2P5GA;
1046 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_2P5GA;
1050 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1055 devp->compfullscale = LSM303DLHC_COMP_4P0GA;
1057 if(devp->config->compsensitivity == NULL) {
1059 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_4P0GA;
1062 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_4P0GA;
1066 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1071 devp->compfullscale = LSM303DLHC_COMP_4P7GA;
1073 if(devp->config->compsensitivity == NULL) {
1075 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_4P7GA;
1078 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_4P7GA;
1082 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1087 devp->compfullscale = LSM303DLHC_COMP_5P6GA;
1089 if(devp->config->compsensitivity == NULL) {
1091 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_5P6GA;
1094 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_5P6GA;
1098 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1103 devp->compfullscale = LSM303DLHC_COMP_8P1GA;
1105 if(devp->config->compsensitivity == NULL) {
1107 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_XY_8P1GA;
1110 devp->compsensitivity[i] = LSM303DLHC_COMP_SENS_Z_8P1GA;
1114 devp->compsensitivity[i] = devp->config->compsensitivity[i];
1122 if(devp->config->compbias != NULL)
1124 devp->compbias[i] = devp->config->compbias[i];
1126 for(i = 0; i < LSM303DLHC_COMP_NUMBER_OF_AXES; i++)
1127 devp->compbias[i] = LSM303DLHC_COMP_BIAS;
1148 "lsm303dlhcStop(), invalid state");
1151 #if LSM303DLHC_SHARED_I2C 1153 i2cStart((devp)->config->i2cp, (devp)->config->i2ccfg);
1157 cr[0] = LSM303DLHC_AD_ACC_CTRL_REG1;
1163 cr[0] = LSM303DLHC_AD_COMP_MR_REG;
1168 i2cStop((devp)->config->i2cp);
1169 #if LSM303DLHC_SHARED_I2C
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.
void i2cStart(I2CDriver *i2cp, const I2CConfig *config)
Configures and activates the I2C peripheral.
BaseCompass virtual methods table.
static msg_t lsm303dlhcI2CReadRegister(I2CDriver *i2cp, lsm303dlhc_sad_t sad, uint8_t reg, uint8_t *rxbuf, size_t n)
Reads registers value using I2C.
static msg_t lsm303dlhcI2CWriteRegister(I2CDriver *i2cp, lsm303dlhc_sad_t sad, uint8_t *txbuf, size_t n)
Writes a value into a register using I2C.
static msg_t comp_set_full_scale(LSM303DLHCDriver *devp, lsm303dlhc_comp_fs_t fs)
Changes the LSM303DLHCDriver compass fullscale value.
static msg_t comp_read_raw(void *ip, int32_t axes[])
Retrieves raw data from the BaseCompass.
static msg_t comp_set_bias(void *ip, float *bp)
Set bias values for the BaseCompass.
static msg_t acc_set_bias(void *ip, float *bp)
Set bias values for the BaseAccelerometer.
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 acc_read_cooked(void *ip, float axes[])
Retrieves cooked data from the BaseAccelerometer.
#define LSM303DLHC_ACC_NUMBER_OF_AXES
LSM303DLHC accelerometer subsystem characteristics.
lsm303dlhc_sad_t
Accelerometer and Compass Slave Address.
static msg_t comp_read_cooked(void *ip, float axes[])
Retrieves cooked data from the BaseCompass.
void lsm303dlhcStop(LSM303DLHCDriver *devp)
Deactivates the LSM303DLHC Complex Driver peripheral.
I2CDriver * i2cp
I2C driver associated to this LSM303DLHC.
static msg_t comp_set_sensivity(void *ip, float *sp)
Set sensitivity values for the BaseCompass.
#define objGetInstance(type, ip)
Returns the instance pointer starting from an interface pointer.
const struct BaseCompassVMT * vmt
Virtual Methods Table.
static msg_t acc_reset_sensivity(void *ip)
Reset sensitivity values for the BaseAccelerometer.
#define osalThreadSleepMilliseconds(msecs)
Delays the invoking thread for the specified number of milliseconds.
void i2cStop(I2CDriver *i2cp)
Deactivates the I2C peripheral.
BaseCompass comp_if
Base compass interface.
static size_t acc_get_axes_number(void *ip)
Return the number of axes of the BaseAccelerometer.
BaseAccelerometer acc_if
Base accelerometer interface.
Structure representing an I2C driver.
#define TIME_INFINITE
Infinite interval specification for all functions with a timeout specification.
LSM303DLHC configuration structure.
#define osalDbgCheck(c)
Function parameters check.
static msg_t comp_reset_sensivity(void *ip)
Reset sensitivity values for the BaseCompass.
static msg_t comp_reset_bias(void *ip)
Reset bias values for the BaseCompass.
#define MSG_OK
Normal wakeup message.
#define LSM303DLHC_COMP_NUMBER_OF_AXES
LSM303DLHC compass subsystem characteristics.
static msg_t acc_read_raw(void *ip, int32_t axes[])
Retrieves raw data from the BaseAccelerometer.
static msg_t acc_set_sensivity(void *ip, float *sp)
Set sensitivity values for the BaseAccelerometer.
static msg_t acc_set_full_scale(LSM303DLHCDriver *devp, lsm303dlhc_acc_fs_t fs)
Changes the LSM303DLHCDriver accelerometer fullscale value.
const struct LSM303DLHCVMT * vmt
Virtual Methods Table.
void lsm303dlhcStart(LSM303DLHCDriver *devp, const LSM303DLHCConfig *config)
Configures and activates LSM303DLHC Complex Driver peripheral.
void lsm303dlhcObjectInit(LSM303DLHCDriver *devp)
Initializes an instance.
LSM303DLHC 6-axis accelerometer/compass class.
lsm303dlhc_acc_fs_t
LSM303DLHC accelerometer subsystem full scale.
#define osalDbgAssert(c, remark)
Condition assertion.
LSM303DLHC virtual methods table.
const I2CConfig * config
Current configuration data.
static size_t comp_get_axes_number(void *ip)
Return the number of axes of the BaseCompass.
BaseAccelerometer virtual methods table.
Base accelerometer class.
const struct BaseAccelerometerVMT * vmt
Virtual Methods Table.
lsm303dlhc_comp_fs_t
LSM303DLHC compass subsystem full scale.
#define FALSE
Generic 'false' preprocessor boolean constant.
#define MSG_RESET
Wakeup caused by a reset condition.
static msg_t acc_reset_bias(void *ip)
Reset bias values for the BaseAccelerometer.
LSM303DLHC MEMS interface module header.