From 7fe87fc979433279a56a4596e3b60241f170f386 Mon Sep 17 00:00:00 2001 From: Rocco Marco Guglielmi Date: Wed, 22 Apr 2020 10:58:37 +0000 Subject: [PATCH] Modified ADXL355 driver git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@13554 27425a3e-05d8-49a3-a47f-9c15f0e5edd8 --- os/ex/devices/ADI/adxl355.c | 68 +++++++++++++++++++++++-------------- os/ex/devices/ADI/adxl355.h | 20 ++++++++++- 2 files changed, 62 insertions(+), 26 deletions(-) diff --git a/os/ex/devices/ADI/adxl355.c b/os/ex/devices/ADI/adxl355.c index cc0d52b51..c8090a56f 100644 --- a/os/ex/devices/ADI/adxl355.c +++ b/os/ex/devices/ADI/adxl355.c @@ -51,38 +51,44 @@ * @brief Reads a generic register value using SPI. * @pre The SPI interface must be initialized and the driver started. * - * @param[in] spip pointer to the SPI interface + * @param[in] devp pointer to @p ADXL355Driver interface. * @param[in] reg starting register address * @param[in] n number of consecutive registers to read * @param[in] b pointer to an output buffer. */ -static void adxl355SPIReadRegister(SPIDriver *spip, uint8_t reg, size_t n, +static void adxl355SPIReadRegister(ADXL355Driver *devp, uint8_t reg, size_t n, uint8_t* b) { - uint8_t cmd; - cmd = (reg << 1) | ADXL355_RW; - spiSelect(spip); - spiSend(spip, 1, &cmd); - spiReceive(spip, n, b); - spiUnselect(spip); + unsigned i; + devp->commtx[0] = (reg << 1) | ADXL355_RW; + spiSelect(devp->config->spip); + spiSend(devp->config->spip, 1, devp->commtx); + spiReceive(devp->config->spip, n, devp->commrx); + spiUnselect(devp->config->spip); + + for(i = 0; i < n; i++, b++) { + *b = devp->commrx[i]; + } } /** * @brief Writes a value into a generic register using SPI. * @pre The SPI interface must be initialized and the driver started. * - * @param[in] spip pointer to the SPI interface + * @param[in] devp pointer to @p ADXL355Driver interface. * @param[in] reg starting register address * @param[in] n number of adjacent registers to write * @param[in] b pointer to a buffer of values. */ -static void adxl355SPIWriteRegister(SPIDriver *spip, uint8_t reg, size_t n, +static void adxl355SPIWriteRegister(ADXL355Driver *devp, uint8_t reg, size_t n, uint8_t* b) { - uint8_t cmd; - cmd = (reg << 1); - spiSelect(spip); - spiSend(spip, 1, &cmd); - spiSend(spip, n, b); - spiUnselect(spip); + unsigned i; + devp->commtx[0] = (reg << 1); + for(i = 0; i < n; i++, b++) { + devp->commtx[i + 1] = *b; + } + spiSelect(devp->config->spip); + spiSend(devp->config->spip, n + 1, devp->commtx); + spiUnselect(devp->config->spip); } #endif /* ADXL355_USE_SPI */ @@ -139,7 +145,7 @@ static msg_t acc_read_raw(void *ip, int32_t axes[]) { devp->config->spicfg); #endif /* ADXL355_SHARED_SPI */ - adxl355SPIReadRegister(devp->config->spip, ADXL355_AD_XDATA3, + adxl355SPIReadRegister(devp, ADXL355_AD_XDATA3, ADXL355_ACC_NUMBER_OF_AXES * 3, buff); #if ADXL355_SHARED_SPI @@ -378,7 +384,7 @@ static msg_t acc_set_full_scale(ADXL355Driver *devp, adxl355_acc_fs_t fs) { #endif /* ADXL355_SHARED_SPI */ /* Getting data from register.*/ - adxl355SPIReadRegister(devp->config->spip, ADXL355_AD_RANGE, 1, ®_val); + adxl355SPIReadRegister(devp, ADXL355_AD_RANGE, 1, ®_val); #if ADXL355_SHARED_SPI spiReleaseBus(devp->config->spip); @@ -396,7 +402,7 @@ static msg_t acc_set_full_scale(ADXL355Driver *devp, adxl355_acc_fs_t fs) { #endif /* ADXL355_SHARED_SPI */ /* Getting data from register.*/ - adxl355SPIWriteRegister(devp->config->spip, ADXL355_AD_RANGE, 1, ®_val); + adxl355SPIWriteRegister(devp, ADXL355_AD_RANGE, 1, ®_val); #if ADXL355_SHARED_SPI spiReleaseBus(devp->config->spip); @@ -464,6 +470,19 @@ void adxl355Start(ADXL355Driver *devp, const ADXL355Config *config) { devp->config = config; + /* Checking the device ID.*/ + { +#if ADXL355_SHARED_SPI + spiAcquireBus(devp->config->spip); +#endif /* ADXL355_SHARED_SPI */ + spiStart(devp->config->spip, devp->config->spicfg); + adxl355SPIReadRegister(devp, ADXL355_AD_DEVID_MST, 1, ®_val); + osalDbgAssert((reg_val == ADXL355_DEVID_MST), "Invalid MEMS ID"); +#if ADXL355_SHARED_SPI + spiReleaseBus(devp->config->spip); +#endif /* ADXL355_SHARED_SPI */ + } + /* Range register configuration block.*/ { reg_val = ADXL355_RANGE_I2C_HS | devp->config->accfullscale; @@ -471,10 +490,10 @@ void adxl355Start(ADXL355Driver *devp, const ADXL355Config *config) { #if ADXL355_USE_SPI #if ADXL355_SHARED_SPI spiAcquireBus(devp->config->spip); -#endif /* ADXL355_SHARED_SPI */ spiStart(devp->config->spip, devp->config->spicfg); +#endif /* ADXL355_SHARED_SPI */ - adxl355SPIWriteRegister(devp->config->spip, ADXL355_AD_RANGE, 1, ®_val); + adxl355SPIWriteRegister(devp, ADXL355_AD_RANGE, 1, ®_val); #if ADXL355_SHARED_SPI spiReleaseBus(devp->config->spip); @@ -495,7 +514,7 @@ void adxl355Start(ADXL355Driver *devp, const ADXL355Config *config) { spiStart(devp->config->spip, devp->config->spicfg); #endif /* ADXL355_SHARED_SPI */ - adxl355SPIWriteRegister(devp->config->spip, ADXL355_AD_FILTER, 1, ®_val); + adxl355SPIWriteRegister(devp, ADXL355_AD_FILTER, 1, ®_val); #if ADXL355_SHARED_SPI spiReleaseBus(devp->config->spip); @@ -513,7 +532,7 @@ void adxl355Start(ADXL355Driver *devp, const ADXL355Config *config) { spiStart(devp->config->spip, devp->config->spicfg); #endif /* ADXL355_SHARED_SPI */ - adxl355SPIWriteRegister(devp->config->spip, ADXL355_AD_POWER_CTL, 1, ®_val); + adxl355SPIWriteRegister(devp, ADXL355_AD_POWER_CTL, 1, ®_val); #if ADXL355_SHARED_SPI spiReleaseBus(devp->config->spip); @@ -591,8 +610,7 @@ void adxl355Stop(ADXL355Driver *devp) { #endif /* ADXL355_SHARED_SPI */ /* Disabling all axes and enabling power down mode.*/ reg_val = 1; - adxl355SPIWriteRegister(devp->config->spip, ADXL355_AD_POWER_CTL, - 1, ®_val); + adxl355SPIWriteRegister(devp, ADXL355_AD_POWER_CTL, 1, ®_val); spiStop(devp->config->spip); #if ADXL355_SHARED_SPI diff --git a/os/ex/devices/ADI/adxl355.h b/os/ex/devices/ADI/adxl355.h index c6a2056c5..4495b9f39 100644 --- a/os/ex/devices/ADI/adxl355.h +++ b/os/ex/devices/ADI/adxl355.h @@ -136,6 +136,13 @@ #define ADXL355_AD_RESET 0x2F /** @} */ +/** + * @name ADXL355 Device Identifier + * @{ + */ +#define ADXL355_DEVID_MST 0x1D +/** @} */ + /** * @name ADXL355_FILTER register bits definitions * @{ @@ -275,6 +282,13 @@ #if !defined(ADXL355_USE_ADVANCED) || defined(__DOXYGEN__) #define ADXL355_USE_ADVANCED FALSE #endif + +/** + * @brief ADXL355 internal communication buffer sizes. + */ +#if !defined(ADXL355_COMM_BUFF_SIZE) || defined(__DOXYGEN__) +#define ADXL355_COMM_BUFF_SIZE 16 +#endif /** @} */ /*===========================================================================*/ @@ -458,7 +472,11 @@ struct ADXL355VMT { /* Accelerometer subsystem current bias .*/ \ float accbias[ADXL355_ACC_NUMBER_OF_AXES]; \ /* Accelerometer subsystem current full scale value.*/ \ - float accfullscale; + float accfullscale; \ + /* Accelerometer communication tx buffer.*/ \ + uint8_t commtx[ADXL355_COMM_BUFF_SIZE]; \ + /* Accelerometer communication rx buffer.*/ \ + uint8_t commrx[ADXL355_COMM_BUFF_SIZE]; /** * @brief ADXL355 3-axis accelerometer class.