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:
parent
314a8e21db
commit
7fe87fc979
|
@ -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, ®_val);
|
adxl355SPIReadRegister(devp, ADXL355_AD_RANGE, 1, ®_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, ®_val);
|
adxl355SPIWriteRegister(devp, ADXL355_AD_RANGE, 1, ®_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, ®_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, ®_val);
|
adxl355SPIWriteRegister(devp, ADXL355_AD_RANGE, 1, ®_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, ®_val);
|
adxl355SPIWriteRegister(devp, ADXL355_AD_FILTER, 1, ®_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, ®_val);
|
adxl355SPIWriteRegister(devp, ADXL355_AD_POWER_CTL, 1, ®_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, ®_val);
|
||||||
1, ®_val);
|
|
||||||
|
|
||||||
spiStop(devp->config->spip);
|
spiStop(devp->config->spip);
|
||||||
#if ADXL355_SHARED_SPI
|
#if ADXL355_SHARED_SPI
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue