49 #if (L3GD20_USE_SPI) || defined(__DOXYGEN__) 62 (n == 1) ? (cmd = reg | L3GD20_RW) : (cmd = reg | L3GD20_RW | L3GD20_MS);
64 spiSend(spip, 1, &cmd);
65 spiReceive(spip, n, b);
81 (n == 1) ? (cmd = reg) : (cmd = reg | L3GD20_MS);
83 spiSend(spip, 1, &cmd);
121 osalDbgCheck((ip != NULL) && (axes != NULL));
127 "gyro_read_raw(), invalid state");
129 osalDbgAssert((devp->config->spip->state == SPI_READY),
130 "gyro_read_raw(), channel not ready");
132 #if L3GD20_SHARED_SPI 133 spiAcquireBus(devp->config->spip);
134 spiStart(devp->config->spip,
135 devp->config->spicfg);
139 L3GD20_GYRO_NUMBER_OF_AXES * 2, buff);
141 #if L3GD20_SHARED_SPI 142 spiReleaseBus(devp->config->spip);
147 tmp = buff[2 * i] + (buff[2 * i + 1] << 8);
148 axes[i] = (int32_t)tmp;
173 osalDbgCheck((ip != NULL) && (axes != NULL));
179 "gyro_read_cooked(), invalid state");
183 axes[i] = (raw[i] * devp->gyrosensitivity[i]) - devp->gyrobias[i];
207 osalDbgCheck(ip != NULL);
213 "gyro_sample_bias(), invalid state");
215 osalDbgAssert((devp->config->spip->state == SPI_READY),
216 "gyro_sample_bias(), channel not ready");
231 devp->gyrobias[i] *= devp->gyrosensitivity[i];
253 osalDbgCheck((ip != NULL) && (bp != NULL));
259 "gyro_set_bias(), invalid state");
262 devp->gyrobias[i] = bp[i];
282 osalDbgCheck(ip != NULL);
288 "gyro_reset_bias(), invalid state");
291 devp->gyrobias[i] = L3GD20_GYRO_BIAS;
312 osalDbgCheck((ip != NULL) && (sp !=NULL));
318 "gyro_set_sensivity(), invalid state");
321 devp->gyrosensitivity[i] = sp[i];
341 osalDbgCheck(ip != NULL);
347 "gyro_reset_sensivity(), invalid state");
351 devp->gyrosensitivity[i] = L3GD20_GYRO_SENS_250DPS;
354 devp->gyrosensitivity[i] = L3GD20_GYRO_SENS_500DPS;
357 devp->gyrosensitivity[i] = L3GD20_GYRO_SENS_2000DPS;
359 osalDbgAssert(FALSE,
"gyro_reset_sensivity(), full scale issue");
383 osalDbgCheck(devp != NULL);
386 "gyro_set_full_scale(), invalid state");
388 osalDbgAssert((devp->config->spip->state == SPI_READY),
389 "gyro_set_full_scale(), channel not ready");
393 newfs = L3GD20_250DPS;
396 newfs = L3GD20_500DPS;
399 newfs = L3GD20_2000DPS;
405 if(newfs != devp->gyrofullscale) {
406 scale = newfs / devp->gyrofullscale;
407 devp->gyrofullscale = newfs;
410 #if L3GD20_SHARED_SPI 411 spiAcquireBus(devp->config->spip);
412 spiStart(devp->config->spip,
413 devp->config->spicfg);
418 L3GD20_AD_CTRL_REG4, 1, &cr);
420 #if L3GD20_SHARED_SPI 421 spiReleaseBus(devp->config->spip);
424 cr &= ~(L3GD20_CTRL_REG4_FS_MASK);
428 #if L3GD20_SHARED_SPI 429 spiAcquireBus(devp->config->spip);
430 spiStart(devp->config->spip,
431 devp->config->spicfg);
435 L3GD20_AD_CTRL_REG4, 1, &cr);
436 #if L3GD20_SHARED_SPI 437 spiReleaseBus(devp->config->spip);
443 devp->gyrosensitivity[i] *= scale;
444 devp->gyrobias[i] *= scale;
450 static const struct L3GD20VMT vmt_device = {
474 devp->
vmt = &vmt_device;
492 uint8_t cr[5] = {0, 0, 0, 0, 0};
493 osalDbgCheck((devp != NULL) && (config != NULL));
496 "l3gd20Start(), invalid state");
498 devp->config = config;
502 cr[0] = L3GD20_CTRL_REG1_XEN | L3GD20_CTRL_REG1_YEN |
503 L3GD20_CTRL_REG1_ZEN | L3GD20_CTRL_REG1_PD |
504 devp->config->gyrooutputdatarate;
505 #if L3GD20_USE_ADVANCED || defined(__DOXYGEN__) 506 cr[0] |= devp->config->gyrobandwidth;
512 #if L3GD20_USE_ADVANCED || defined(__DOXYGEN__) 514 cr[1] = devp->config->gyrohpmode | devp->config->gyrohpconfiguration;
520 cr[3] = devp->config->gyrofullscale;
521 #if L3GD20_USE_ADVANCED || defined(__DOXYGEN__) 522 cr[3] |= devp->config->gyroblockdataupdate |
523 devp->config->gyroendianness;
529 #if L3GD20_USE_ADVANCED || defined(__DOXYGEN__) 531 cr[4] = L3GD20_CTRL_REG5_HPEN;
533 cr[4] |= L3GD20_CTRL_REG5_INT1_SEL1 |
534 L3GD20_CTRL_REG5_OUT_SEL1;
537 cr[4] |= L3GD20_CTRL_REG5_INT1_SEL0 |
538 L3GD20_CTRL_REG5_OUT_SEL0;
545 #if L3GD20_SHARED_SPI 546 spiAcquireBus(devp->config->spip);
548 spiStart(devp->config->spip,
549 devp->config->spicfg);
553 #if L3GD20_SHARED_SPI 554 spiReleaseBus(devp->config->spip);
560 devp->gyrofullscale = L3GD20_250DPS;
562 if (devp->config->gyrosensitivity == NULL)
563 devp->gyrosensitivity[i] = L3GD20_GYRO_SENS_250DPS;
565 devp->gyrosensitivity[i] = devp->config->gyrosensitivity[i];
569 devp->gyrofullscale = L3GD20_500DPS;
571 if (devp->config->gyrosensitivity == NULL)
572 devp->gyrosensitivity[i] = L3GD20_GYRO_SENS_500DPS;
574 devp->gyrosensitivity[i] = devp->config->gyrosensitivity[i];
578 devp->gyrofullscale = L3GD20_2000DPS;
580 if (devp->config->gyrosensitivity == NULL)
581 devp->gyrosensitivity[i] = L3GD20_GYRO_SENS_2000DPS;
583 devp->gyrosensitivity[i] = devp->config->gyrosensitivity[i];
587 osalDbgAssert(FALSE,
"l3gd20Start(), full scale issue");
590 if(devp->config->gyrobias != NULL) {
592 devp->gyrobias[i] = devp->config->gyrobias[i];
597 devp->gyrobias[i] = L3GD20_GYRO_BIAS;
601 osalThreadSleepMilliseconds(10);
615 osalDbgCheck(devp != NULL);
618 "l3gd20Stop(), invalid state");
625 #if L3GD20_SHARED_SPI 626 spiAcquireBus(devp->config->spip);
627 spiStart(devp->config->spip,
628 devp->config->spicfg);
633 spiStop(devp->config->spip);
635 #if L3GD20_SHARED_SPI 636 spiReleaseBus(devp->config->spip);
void l3gd20ObjectInit(L3GD20Driver *devp)
Initializes an instance.
#define L3GD20_BIAS_SETTLING_US
Settling time for bias removal.
static msg_t gyro_set_full_scale(L3GD20Driver *devp, l3gd20_fs_t fs)
Changes the L3GD20Driver gyroscope fullscale value.
L3GD20 MEMS interface module header.
L3GD20 virtual methods table.
BaseGyroscope virtual methods table.
static size_t gyro_get_axes_number(void *ip)
Return the number of axes of the BaseGyroscope.
BaseGyroscope gyro_if
Base gyroscope interface.
void l3gd20Start(L3GD20Driver *devp, const L3GD20Config *config)
Configures and activates L3GD20 Complex Driver peripheral.
L3GD20 3-axis gyroscope class.
#define L3GD20_BIAS_ACQ_TIMES
Number of acquisitions for bias removal.
const struct L3GD20VMT * vmt
Virtual Methods Table.
static msg_t gyro_read_raw(void *ip, int32_t axes[L3GD20_GYRO_NUMBER_OF_AXES])
Retrieves raw data from the BaseGyroscope.
l3gd20_fs_t
L3GD20 full scale.
static void l3gd20SPIReadRegister(SPIDriver *spip, uint8_t reg, size_t n, uint8_t *b)
Reads a generic register value using SPI.
const struct BaseGyroscopeVMT * vmt
Virtual Methods Table.
static void l3gd20SPIWriteRegister(SPIDriver *spip, uint8_t reg, size_t n, uint8_t *b)
Writes a value into a generic register using SPI.
static msg_t gyro_sample_bias(void *ip)
Samples bias values for the BaseGyroscope.
static msg_t gyro_set_bias(void *ip, float *bp)
Set bias values for the BaseGyroscope.
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.
#define L3GD20_GYRO_NUMBER_OF_AXES
L3GD20 gyroscope system characteristics.
L3GD20 configuration structure.
static msg_t gyro_set_sensivity(void *ip, float *sp)
Set sensitivity values for the BaseGyroscope.
static msg_t gyro_reset_bias(void *ip)
Reset bias values for the BaseGyroscope.
void l3gd20Stop(L3GD20Driver *devp)
Deactivates the L3GD20 Complex Driver peripheral.