49 #if (LIS3MDL_USE_I2C) || defined(__DOXYGEN__) 63 uint8_t* rxbuf,
size_t n) {
66 txbuf |= LIS3MDL_SUB_MS;
88 (*txbuf) |= LIS3MDL_SUB_MS;
136 "comp_read_raw(), invalid state");
138 "comp_read_raw(), channel not ready");
140 #if LIS3MDL_SHARED_I2C 143 devp->config->i2ccfg);
146 LIS3MDL_AD_OUT_X_L, buff,
149 #if LIS3MDL_SHARED_I2C 155 tmp = buff[2 * i] + (buff[2 * i + 1] << 8);
156 axes[i] = (int32_t)tmp;
191 "comp_read_cooked(), invalid state");
195 axes[i] = (raw[i] * devp->compsensitivity[i]) - devp->compbias[i];
223 "comp_set_bias(), invalid state");
226 devp->compbias[i] = bp[i];
252 "comp_reset_bias(), invalid state");
255 devp->compbias[i] = LIS3MDL_COMP_BIAS;
282 "comp_set_sensivity(), invalid state");
285 devp->compsensitivity[i] = sp[i];
311 "comp_reset_sensivity(), invalid state");
315 devp->compsensitivity[i] = LIS3MDL_COMP_SENS_4GA;
318 devp->compsensitivity[i] = LIS3MDL_COMP_SENS_8GA;
321 devp->compsensitivity[i] = LIS3MDL_COMP_SENS_12GA;
324 devp->compsensitivity[i] = LIS3MDL_COMP_SENS_16GA;
353 "comp_set_full_scale(), invalid state");
355 "comp_set_full_scale(), channel not ready");
359 newfs = LIS3MDL_COMP_4GA;
362 newfs = LIS3MDL_COMP_8GA;
365 newfs = LIS3MDL_COMP_12GA;
368 newfs = LIS3MDL_COMP_16GA;
375 if(newfs != devp->compfullscale) {
377 scale = newfs / devp->compfullscale;
378 devp->compfullscale = newfs;
380 #if LIS3MDL_SHARED_I2C 382 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
387 LIS3MDL_AD_CTRL_REG2, &buff[1], 1);
389 #if LIS3MDL_SHARED_I2C 395 buff[1] &= ~(LIS3MDL_CTRL_REG2_FS_MASK);
397 buff[0] = LIS3MDL_AD_CTRL_REG2;
399 #if LIS3MDL_SHARED_I2C 401 i2cStart(devp->config->i2cp, devp->config->i2ccfg);
405 devp->config->slaveaddress,
408 #if LIS3MDL_SHARED_I2C 417 devp->compsensitivity[i] *= scale;
418 devp->compbias[i] *= scale;
447 devp->
vmt = &vmt_device;
471 "lis3mdlStart(), invalid state");
473 devp->config = config;
477 cr[0] = LIS3MDL_AD_CTRL_REG1;
478 cr[1] = devp->config->compoutputdatarate;
479 #if LIS3MDL_COMP_USE_ADVANCED || defined(__DOXYGEN__) 480 cr[1] |= devp->config->compoperationmodexy;
482 cr[1] |= LIS3MDL_CTRL_REG1_OM0 | LIS3MDL_CTRL_REG1_OM1;
488 cr[2] = devp->config->compfullscale;
494 #if LIS3MDL_COMP_USE_ADVANCED || defined(__DOXYGEN__) 495 cr[3] = devp->config->compconversionmode;
502 #if LIS3MDL_COMP_USE_ADVANCED || defined(__DOXYGEN__) 503 cr[4] = devp->config->compoperationmodez | devp->config->endianness;
510 #if LIS3MDL_COMP_USE_ADVANCED || defined(__DOXYGEN__) 511 cr[5] = devp->config->blockdataupdate;
516 #if LIS3MDL_SHARED_I2C 525 #if LIS3MDL_SHARED_I2C 531 devp->compfullscale = LIS3MDL_COMP_4GA;
533 if(devp->config->compsensitivity == NULL) {
534 devp->compsensitivity[i] = LIS3MDL_COMP_SENS_4GA;
537 devp->compsensitivity[i] = devp->config->compsensitivity[i];
542 devp->compfullscale = LIS3MDL_COMP_8GA;
544 if(devp->config->compsensitivity == NULL) {
545 devp->compsensitivity[i] = LIS3MDL_COMP_SENS_8GA;
548 devp->compsensitivity[i] = devp->config->compsensitivity[i];
553 devp->compfullscale = LIS3MDL_COMP_12GA;
555 if(devp->config->compsensitivity == NULL) {
556 devp->compsensitivity[i] = LIS3MDL_COMP_SENS_12GA;
559 devp->compsensitivity[i] = devp->config->compsensitivity[i];
564 devp->compfullscale = LIS3MDL_COMP_16GA;
566 if(devp->config->compsensitivity == NULL) {
567 devp->compsensitivity[i] = LIS3MDL_COMP_SENS_16GA;
570 devp->compsensitivity[i] = devp->config->compsensitivity[i];
578 if(devp->config->compbias != NULL)
580 devp->compbias[i] = devp->config->compbias[i];
582 for(i = 0; i < LIS3MDL_COMP_NUMBER_OF_AXES; i++)
583 devp->compbias[i] = LIS3MDL_COMP_BIAS;
603 "lis3mdlStop(), invalid state");
606 #if (LIS3MDL_USE_I2C) 607 #if LIS3MDL_SHARED_I2C 610 (devp)->config->i2ccfg);
614 cr[0] = LIS3MDL_AD_CTRL_REG3;
615 cr[1] = LIS3MDL_CTRL_REG3_MD0 | LIS3MDL_CTRL_REG3_MD1;
620 #if LIS3MDL_SHARED_I2C void lis3mdlStop(LIS3MDLDriver *devp)
Deactivates the LIS3MDL Complex Driver peripheral.
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.
void lis3mdlObjectInit(LIS3MDLDriver *devp)
Initializes an instance.
lis3mdl_comp_fs_t
LIS3MDL full scale.
BaseCompass virtual methods table.
static msg_t comp_read_cooked(void *ip, float axes[])
Retrieves cooked data from the BaseCompass.
static msg_t comp_read_raw(void *ip, int32_t axes[])
Retrieves raw data from the BaseCompass.
void i2cAcquireBus(I2CDriver *i2cp)
Gains exclusive access to the I2C bus.
void i2cReleaseBus(I2CDriver *i2cp)
Releases exclusive access to the I2C bus.
#define objGetInstance(type, ip)
Returns the instance pointer starting from an interface pointer.
static msg_t comp_set_bias(void *ip, float *bp)
Set bias values for the BaseCompass.
const struct BaseCompassVMT * vmt
Virtual Methods Table.
#define LIS3MDL_COMP_NUMBER_OF_AXES
LIS3MDL compass subsystem characteristics.
#define osalThreadSleepMilliseconds(msecs)
Delays the invoking thread for the specified number of milliseconds.
void i2cStop(I2CDriver *i2cp)
Deactivates the I2C peripheral.
LIS3MDL configuration structure.
Structure representing an I2C driver.
msg_t lis3mdlI2CReadRegister(I2CDriver *i2cp, lis3mdl_sad_t sad, uint8_t reg, uint8_t *rxbuf, size_t n)
Reads registers value using I2C.
lis3mdl_sad_t
LIS3MDL slave address.
#define TIME_INFINITE
Infinite interval specification for all functions with a timeout specification.
#define osalDbgCheck(c)
Function parameters check.
static msg_t comp_set_sensivity(void *ip, float *sp)
Set sensitivity values for the BaseCompass.
#define MSG_OK
Normal wakeup message.
LIS3MDL MEMS interface module header.
static msg_t comp_reset_sensivity(void *ip)
Reset sensitivity values for the BaseCompass.
static size_t comp_get_axes_number(void *ip)
Return the number of axes of the BaseCompass.
msg_t lis3mdlI2CWriteRegister(I2CDriver *i2cp, lis3mdl_sad_t sad, uint8_t *txbuf, uint8_t n)
Writes a value into a register using I2C.
#define osalDbgAssert(c, remark)
Condition assertion.
void lis3mdlStart(LIS3MDLDriver *devp, const LIS3MDLConfig *config)
Configures and activates LIS3MDL Complex Driver peripheral.
const struct LIS3MDLVMT * vmt
Virtual Methods Table.
const I2CConfig * config
Current configuration data.
static msg_t comp_reset_bias(void *ip)
Reset bias values for the BaseCompass.
BaseCompass comp_if
Base compass interface.
LIS3MDL 3-axis compass class.
static msg_t comp_set_full_scale(LIS3MDLDriver *devp, lis3mdl_comp_fs_t fs)
Changes the LIS3MDLDriver compass fullscale value.
LIS3MDL virtual methods table.
#define FALSE
Generic 'false' preprocessor boolean constant.
#define MSG_RESET
Wakeup caused by a reset condition.
I2CDriver * i2cp
I2C driver associated to this LIS3MDL.