aboutsummaryrefslogtreecommitdiffstats
path: root/os/ex
diff options
context:
space:
mode:
authorRocco Marco Guglielmi <roccomarco.guglielmi@live.com>2016-09-30 13:26:12 +0000
committerRocco Marco Guglielmi <roccomarco.guglielmi@live.com>2016-09-30 13:26:12 +0000
commite7f367161525d6d8558dfe6ecae3d7cf07a80bba (patch)
tree95cb70d26fb61ff16969dc528a127f224731f879 /os/ex
parent5bc849172523cfdd32db4ff2ad32b63f0c6e2bd3 (diff)
downloadChibiOS-e7f367161525d6d8558dfe6ecae3d7cf07a80bba.tar.gz
ChibiOS-e7f367161525d6d8558dfe6ecae3d7cf07a80bba.tar.bz2
ChibiOS-e7f367161525d6d8558dfe6ecae3d7cf07a80bba.zip
Improved LIS302DL driver and related demos: improved bias and sensitivity handling.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9828 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/ex')
-rw-r--r--os/ex/ST/lis302dl.c79
-rw-r--r--os/ex/ST/lis302dl.h20
2 files changed, 68 insertions, 31 deletions
diff --git a/os/ex/ST/lis302dl.c b/os/ex/ST/lis302dl.c
index 846051b17..59d31d006 100644
--- a/os/ex/ST/lis302dl.c
+++ b/os/ex/ST/lis302dl.c
@@ -105,19 +105,23 @@ static msg_t read_raw(void *ip, int32_t axes[LIS302DL_NUMBER_OF_AXES]) {
#if LIS302DL_USE_SPI
osalDbgAssert((((LIS302DLDriver *)ip)->config->spip->state == SPI_READY),
"read_raw(), channel not ready");
+
#if LIS302DL_SHARED_SPI
spiAcquireBus(((LIS302DLDriver *)ip)->config->spip);
spiStart(((LIS302DLDriver *)ip)->config->spip,
- ((LIS302DLDriver *)ip)->config->spicfg);
-#endif /* LIS302DL_SHARED_SPI */
+ ((LIS302DLDriver *)ip)->config->spicfg);
+#endif /* LIS302DL_SHARED_SPI */
+
for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++) {
lis302dlSPIReadRegister(((LIS302DLDriver *)ip)->config->spip,
LIS302DL_AD_OUT_X + (i * 2), 1, &tmp);
axes[i] = (int32_t)((int8_t)tmp);
}
+
#if LIS302DL_SHARED_SPI
spiReleaseBus(((LIS302DLDriver *)ip)->config->spip);
-#endif /* LIS302DL_SHARED_SPI */
+#endif /* LIS302DL_SHARED_SPI */
+
#endif /* LIS302DL_USE_SPI */
return MSG_OK;
}
@@ -222,13 +226,34 @@ static msg_t set_full_scale(void *ip, lis302dl_fs_t fs) {
scale = newfs / ((LIS302DLDriver *)ip)->fullscale;
((LIS302DLDriver *)ip)->fullscale = newfs;
- /* Updating register.*/
+#if LIS302DL_USE_SPI
+#if LIS302DL_SHARED_SPI
+ spiAcquireBus(((LIS302DLDriver *)ip)->config->spip);
+ spiStart(((LIS302DLDriver *)ip)->config->spip,
+ ((LIS302DLDriver *)ip)->config->spicfg);
+#endif /* LIS302DL_SHARED_SPI */
lis302dlSPIReadRegister(((LIS302DLDriver *)ip)->config->spip,
LIS302DL_AD_CTRL_REG1, 1, &cr);
+#if LIS302DL_SHARED_SPI
+ spiReleaseBus(((LIS302DLDriver *)ip)->config->spip);
+#endif /* LIS302DL_SHARED_SPI */
+#endif /* LIS302DL_USE_SPI */
+
cr &= ~(LIS302DL_CTRL_REG1_FS_MASK);
cr |= fs;
+
+#if LIS302DL_USE_SPI
+#if LIS302DL_SHARED_SPI
+ spiAcquireBus(((LIS302DLDriver *)ip)->config->spip);
+ spiStart(((LIS302DLDriver *)ip)->config->spip,
+ ((LIS302DLDriver *)ip)->config->spicfg);
+#endif /* LIS302DL_SHARED_SPI */
lis302dlSPIWriteRegister(((LIS302DLDriver *)ip)->config->spip,
LIS302DL_AD_CTRL_REG1, 1, &cr);
+#if LIS302DL_SHARED_SPI
+ spiReleaseBus(((LIS302DLDriver *)ip)->config->spip);
+#endif /* LIS302DL_SHARED_SPI */
+#endif /* LIS302DL_USE_SPI */
/* Scaling sensitivity and bias. Re-calibration is suggested anyway. */
for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++) {
@@ -272,7 +297,7 @@ void lis302dlObjectInit(LIS302DLDriver *devp) {
devp->vmt_lis302dl = &vmt_lis302dl;
devp->config = NULL;
for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
- devp->bias[i] = 0;
+ devp->bias[i] = 0.0f;
devp->state = LIS302DL_STOP;
}
@@ -293,14 +318,7 @@ void lis302dlStart(LIS302DLDriver *devp, const LIS302DLConfig *config) {
"lis302dlStart(), invalid state");
devp->config = config;
-
-#if LIS302DL_USE_SPI
-#if LIS302DL_SHARED_SPI
- spiAcquireBus((devp)->config->spip);
-#endif /* LIS302DL_SHARED_SPI */
- spiStart((devp)->config->spip,
- (devp)->config->spicfg);
-
+
/* Control register 1 configuration block.*/
{
cr[0] = LIS302DL_CTRL_REG1_XEN | LIS302DL_CTRL_REG1_YEN |
@@ -316,6 +334,12 @@ void lis302dlStart(LIS302DLDriver *devp, const LIS302DLConfig *config) {
cr[1] = devp->config->highpass;
#endif
}
+
+#if LIS302DL_USE_SPI
+#if LIS302DL_SHARED_SPI
+ spiAcquireBus((devp)->config->spip);
+#endif /* LIS302DL_SHARED_SPI */
+ spiStart((devp)->config->spip, (devp)->config->spicfg);
lis302dlSPIWriteRegister(devp->config->spip, LIS302DL_AD_CTRL_REG1,
2, cr);
@@ -328,17 +352,30 @@ void lis302dlStart(LIS302DLDriver *devp, const LIS302DLConfig *config) {
/* Storing sensitivity information according to full scale value */
if(devp->config->fullscale == LIS302DL_FS_2G) {
devp->fullscale = LIS302DL_2G;
- for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
- devp->sensitivity[i] = LIS302DL_SENS_2G;
+ if(devp->config->sensitivity == NULL)
+ for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
+ devp->sensitivity[i] = LIS302DL_SENS_2G;
+ else
+ for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
+ devp->sensitivity[i] = devp->config->sensitivity[i];
}
else if(devp->config->fullscale == LIS302DL_FS_8G) {
devp->fullscale = LIS302DL_8G;
- for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
+ if(devp->config->sensitivity == NULL)
+ for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
devp->sensitivity[i] = LIS302DL_SENS_8G;
+ else
+ for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
+ devp->sensitivity[i] = devp->config->sensitivity[i];
}
else {
osalDbgAssert(FALSE, "lis302dlStart(), accelerometer full scale issue");
}
+
+ if(devp->config->bias != NULL)
+ for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
+ devp->bias[i] = devp->config->bias[i];
+
/* This is the Accelerometer transient recovery time */
osalThreadSleepMilliseconds(10);
@@ -359,8 +396,8 @@ void lis302dlStop(LIS302DLDriver *devp) {
osalDbgAssert((devp->state == LIS302DL_STOP) || (devp->state == LIS302DL_READY),
"lis302dlStop(), invalid state");
-#if (LIS302DL_USE_SPI)
- if (devp->state == LIS302DL_STOP) {
+ if (devp->state == LIS302DL_READY) {
+#if LIS302DL_USE_SPI
#if LIS302DL_SHARED_SPI
spiAcquireBus((devp)->config->spip);
spiStart((devp)->config->spip,
@@ -371,9 +408,9 @@ void lis302dlStop(LIS302DLDriver *devp) {
spiStop((devp)->config->spip);
#if LIS302DL_SHARED_SPI
spiReleaseBus((devp)->config->spip);
-#endif /* LIS302DL_SHARED_SPI */
- }
-#endif /* LIS302DL_USE_SPI */
+#endif /* LIS302DL_SHARED_SPI */
+#endif /* LIS302DL_USE_SPI */
+ }
devp->state = LIS302DL_STOP;
}
/** @} */
diff --git a/os/ex/ST/lis302dl.h b/os/ex/ST/lis302dl.h
index f310a2922..4b11dbef5 100644
--- a/os/ex/ST/lis302dl.h
+++ b/os/ex/ST/lis302dl.h
@@ -41,7 +41,7 @@
/**
* @brief LIS302DL driver version string.
*/
-#define EX_LIS302DL_VERSION "1.0.2"
+#define EX_LIS302DL_VERSION "1.0.3"
/**
* @brief LIS302DL driver version major number.
@@ -56,7 +56,7 @@
/**
* @brief LIS302DL driver version patch number.
*/
-#define EX_LIS302DL_PATCH 2
+#define EX_LIS302DL_PATCH 3
/** @} */
/**
@@ -297,24 +297,24 @@ typedef struct {
/**
* @brief LIS302DL initial sensitivity.
*/
- float sensitivity[LIS302DL_NUMBER_OF_AXES];
+ float *sensitivity;
/**
* @brief LIS302DL initial bias.
*/
- float bias[LIS302DL_NUMBER_OF_AXES];
+ float *bias;
/**
* @brief LIS302DL full scale value.
*/
- lis302dl_fs_t fullscale;
+ lis302dl_fs_t fullscale;
/**
* @brief LIS302DL output data rate selection.
*/
- lis302dl_odr_t outputdatarate;
+ lis302dl_odr_t outputdatarate;
#if LIS302DL_USE_ADVANCED || defined(__DOXYGEN__)
/**
- * @brief LIS302DL high pass filtering
+ * @brief LIS302DL high pass filtering.
*/
- lis302dl_hp_t highpass;
+ lis302dl_hp_t highpass;
#endif
} LIS302DLConfig;
@@ -347,9 +347,9 @@ struct LIS302DLVMT {
#define _lis302dl_data \
_base_accelerometer_data \
/* Driver state.*/ \
- lis302dl_state_t state; \
+ lis302dl_state_t state; \
/* Current configuration data.*/ \
- const LIS302DLConfig *config; \
+ const LIS302DLConfig *config; \
/* Current sensitivity.*/ \
float sensitivity[LIS302DL_NUMBER_OF_AXES]; \
/* Bias data.*/ \