Modified ADXL355 driver

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@13554 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
Rocco Marco Guglielmi 2020-04-22 10:58:37 +00:00
parent 314a8e21db
commit 7fe87fc979
2 changed files with 62 additions and 26 deletions

View File

@ -51,38 +51,44 @@
* @brief Reads a generic register value using SPI. * @brief Reads a generic register value using SPI.
* @pre The SPI interface must be initialized and the driver started. * @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] reg starting register address
* @param[in] n number of consecutive registers to read * @param[in] n number of consecutive registers to read
* @param[in] b pointer to an output buffer. * @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* b) {
uint8_t cmd; unsigned i;
cmd = (reg << 1) | ADXL355_RW; devp->commtx[0] = (reg << 1) | ADXL355_RW;
spiSelect(spip); spiSelect(devp->config->spip);
spiSend(spip, 1, &cmd); spiSend(devp->config->spip, 1, devp->commtx);
spiReceive(spip, n, b); spiReceive(devp->config->spip, n, devp->commrx);
spiUnselect(spip); 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. * @brief Writes a value into a generic register using SPI.
* @pre The SPI interface must be initialized and the driver started. * @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] reg starting register address
* @param[in] n number of adjacent registers to write * @param[in] n number of adjacent registers to write
* @param[in] b pointer to a buffer of values. * @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* b) {
uint8_t cmd; unsigned i;
cmd = (reg << 1); devp->commtx[0] = (reg << 1);
spiSelect(spip); for(i = 0; i < n; i++, b++) {
spiSend(spip, 1, &cmd); devp->commtx[i + 1] = *b;
spiSend(spip, n, b); }
spiUnselect(spip); spiSelect(devp->config->spip);
spiSend(devp->config->spip, n + 1, devp->commtx);
spiUnselect(devp->config->spip);
} }
#endif /* ADXL355_USE_SPI */ #endif /* ADXL355_USE_SPI */
@ -139,7 +145,7 @@ static msg_t acc_read_raw(void *ip, int32_t axes[]) {
devp->config->spicfg); devp->config->spicfg);
#endif /* ADXL355_SHARED_SPI */ #endif /* ADXL355_SHARED_SPI */
adxl355SPIReadRegister(devp->config->spip, ADXL355_AD_XDATA3, adxl355SPIReadRegister(devp, ADXL355_AD_XDATA3,
ADXL355_ACC_NUMBER_OF_AXES * 3, buff); ADXL355_ACC_NUMBER_OF_AXES * 3, buff);
#if ADXL355_SHARED_SPI #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 */ #endif /* ADXL355_SHARED_SPI */
/* Getting data from register.*/ /* Getting data from register.*/
adxl355SPIReadRegister(devp->config->spip, ADXL355_AD_RANGE, 1, &reg_val); adxl355SPIReadRegister(devp, ADXL355_AD_RANGE, 1, &reg_val);
#if ADXL355_SHARED_SPI #if ADXL355_SHARED_SPI
spiReleaseBus(devp->config->spip); 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 */ #endif /* ADXL355_SHARED_SPI */
/* Getting data from register.*/ /* Getting data from register.*/
adxl355SPIWriteRegister(devp->config->spip, ADXL355_AD_RANGE, 1, &reg_val); adxl355SPIWriteRegister(devp, ADXL355_AD_RANGE, 1, &reg_val);
#if ADXL355_SHARED_SPI #if ADXL355_SHARED_SPI
spiReleaseBus(devp->config->spip); spiReleaseBus(devp->config->spip);
@ -464,6 +470,19 @@ void adxl355Start(ADXL355Driver *devp, const ADXL355Config *config) {
devp->config = 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, &reg_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.*/ /* Range register configuration block.*/
{ {
reg_val = ADXL355_RANGE_I2C_HS | devp->config->accfullscale; 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_USE_SPI
#if ADXL355_SHARED_SPI #if ADXL355_SHARED_SPI
spiAcquireBus(devp->config->spip); spiAcquireBus(devp->config->spip);
#endif /* ADXL355_SHARED_SPI */
spiStart(devp->config->spip, devp->config->spicfg); spiStart(devp->config->spip, devp->config->spicfg);
#endif /* ADXL355_SHARED_SPI */
adxl355SPIWriteRegister(devp->config->spip, ADXL355_AD_RANGE, 1, &reg_val); adxl355SPIWriteRegister(devp, ADXL355_AD_RANGE, 1, &reg_val);
#if ADXL355_SHARED_SPI #if ADXL355_SHARED_SPI
spiReleaseBus(devp->config->spip); spiReleaseBus(devp->config->spip);
@ -495,7 +514,7 @@ void adxl355Start(ADXL355Driver *devp, const ADXL355Config *config) {
spiStart(devp->config->spip, devp->config->spicfg); spiStart(devp->config->spip, devp->config->spicfg);
#endif /* ADXL355_SHARED_SPI */ #endif /* ADXL355_SHARED_SPI */
adxl355SPIWriteRegister(devp->config->spip, ADXL355_AD_FILTER, 1, &reg_val); adxl355SPIWriteRegister(devp, ADXL355_AD_FILTER, 1, &reg_val);
#if ADXL355_SHARED_SPI #if ADXL355_SHARED_SPI
spiReleaseBus(devp->config->spip); spiReleaseBus(devp->config->spip);
@ -513,7 +532,7 @@ void adxl355Start(ADXL355Driver *devp, const ADXL355Config *config) {
spiStart(devp->config->spip, devp->config->spicfg); spiStart(devp->config->spip, devp->config->spicfg);
#endif /* ADXL355_SHARED_SPI */ #endif /* ADXL355_SHARED_SPI */
adxl355SPIWriteRegister(devp->config->spip, ADXL355_AD_POWER_CTL, 1, &reg_val); adxl355SPIWriteRegister(devp, ADXL355_AD_POWER_CTL, 1, &reg_val);
#if ADXL355_SHARED_SPI #if ADXL355_SHARED_SPI
spiReleaseBus(devp->config->spip); spiReleaseBus(devp->config->spip);
@ -591,8 +610,7 @@ void adxl355Stop(ADXL355Driver *devp) {
#endif /* ADXL355_SHARED_SPI */ #endif /* ADXL355_SHARED_SPI */
/* Disabling all axes and enabling power down mode.*/ /* Disabling all axes and enabling power down mode.*/
reg_val = 1; reg_val = 1;
adxl355SPIWriteRegister(devp->config->spip, ADXL355_AD_POWER_CTL, adxl355SPIWriteRegister(devp, ADXL355_AD_POWER_CTL, 1, &reg_val);
1, &reg_val);
spiStop(devp->config->spip); spiStop(devp->config->spip);
#if ADXL355_SHARED_SPI #if ADXL355_SHARED_SPI

View File

@ -136,6 +136,13 @@
#define ADXL355_AD_RESET 0x2F #define ADXL355_AD_RESET 0x2F
/** @} */ /** @} */
/**
* @name ADXL355 Device Identifier
* @{
*/
#define ADXL355_DEVID_MST 0x1D
/** @} */
/** /**
* @name ADXL355_FILTER register bits definitions * @name ADXL355_FILTER register bits definitions
* @{ * @{
@ -275,6 +282,13 @@
#if !defined(ADXL355_USE_ADVANCED) || defined(__DOXYGEN__) #if !defined(ADXL355_USE_ADVANCED) || defined(__DOXYGEN__)
#define ADXL355_USE_ADVANCED FALSE #define ADXL355_USE_ADVANCED FALSE
#endif #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 .*/ \ /* Accelerometer subsystem current bias .*/ \
float accbias[ADXL355_ACC_NUMBER_OF_AXES]; \ float accbias[ADXL355_ACC_NUMBER_OF_AXES]; \
/* Accelerometer subsystem current full scale value.*/ \ /* 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. * @brief ADXL355 3-axis accelerometer class.