Updated ADXl355 Driver and related demos
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@16355 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
473a0c858a
commit
dd84b8e669
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#include "hal.h"
|
#include "hal.h"
|
||||||
#include "adxl355.h"
|
#include "adxl355.h"
|
||||||
|
#include "string.h"
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Driver local definitions. */
|
/* Driver local definitions. */
|
||||||
|
@ -46,54 +47,6 @@
|
||||||
/* Driver local functions. */
|
/* Driver local functions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
#if (ADXL355_USE_SPI) || defined(__DOXYGEN__)
|
|
||||||
/**
|
|
||||||
* @brief Reads a generic register value using SPI.
|
|
||||||
* @pre The SPI interface must be initialized and the driver started.
|
|
||||||
*
|
|
||||||
* @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(ADXL355Driver *devp, uint8_t reg, size_t n,
|
|
||||||
uint8_t* b) {
|
|
||||||
unsigned i;
|
|
||||||
devp->commtxp[0] = (reg << 1) | ADXL355_RW;
|
|
||||||
cacheBufferFlush(&devp->commtxp[0], sizeof devp->commtxp);
|
|
||||||
spiSelect(devp->config->spip);
|
|
||||||
spiSend(devp->config->spip, 1, devp->commtxp);
|
|
||||||
spiReceive(devp->config->spip, n, devp->commrxp);
|
|
||||||
spiUnselect(devp->config->spip);
|
|
||||||
cacheBufferInvalidate(&devp->commrxp[0], sizeof devp->commrxp);
|
|
||||||
for(i = 0; i < n; i++, b++) {
|
|
||||||
*b = devp->commrxp[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes a value into a generic register using SPI.
|
|
||||||
* @pre The SPI interface must be initialized and the driver started.
|
|
||||||
*
|
|
||||||
* @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(ADXL355Driver *devp, uint8_t reg, size_t n,
|
|
||||||
uint8_t* b) {
|
|
||||||
unsigned i;
|
|
||||||
devp->commtxp[0] = (reg << 1);
|
|
||||||
for(i = 0; i < n; i++, b++) {
|
|
||||||
devp->commtxp[i + 1] = *b;
|
|
||||||
}
|
|
||||||
cacheBufferFlush(&devp->commtxp[0], sizeof devp->commtxp);
|
|
||||||
spiSelect(devp->config->spip);
|
|
||||||
spiSend(devp->config->spip, n + 1, devp->commtxp);
|
|
||||||
spiUnselect(devp->config->spip);
|
|
||||||
}
|
|
||||||
#endif /* ADXL355_USE_SPI */
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Return the number of axes of the BaseAccelerometer.
|
* @brief Return the number of axes of the BaseAccelerometer.
|
||||||
*
|
*
|
||||||
|
@ -437,6 +390,65 @@ static const struct BaseAccelerometerVMT vmt_accelerometer = {
|
||||||
/* Driver exported functions. */
|
/* Driver exported functions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
#if (ADXL355_USE_SPI) || defined(__DOXYGEN__)
|
||||||
|
/**
|
||||||
|
* @brief Reads a generic register value using SPI.
|
||||||
|
* @pre The SPI interface must be initialized and the driver started.
|
||||||
|
*
|
||||||
|
* @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.
|
||||||
|
*/
|
||||||
|
void adxl355SPIReadRegister(ADXL355Driver *devp, uint8_t reg, size_t n,
|
||||||
|
uint8_t* b) {
|
||||||
|
|
||||||
|
osalDbgCheck(n < ADXL355_COMM_BUFF_SIZE);
|
||||||
|
|
||||||
|
/* Preparing a read. */
|
||||||
|
devp->commtxp[0] = (reg << 1) | ADXL355_RW;
|
||||||
|
|
||||||
|
/* Reading. */
|
||||||
|
cacheBufferFlush(&devp->commtxp[0], sizeof(devp->commtxp));
|
||||||
|
spiSelect(devp->config->spip);
|
||||||
|
spiSend(devp->config->spip, 1, devp->commtxp);
|
||||||
|
spiReceive(devp->config->spip, n, devp->commrxp);
|
||||||
|
spiUnselect(devp->config->spip);
|
||||||
|
cacheBufferInvalidate(&devp->commrxp[0], sizeof(devp->commrxp));
|
||||||
|
|
||||||
|
/* Copying the data in the final buffer. */
|
||||||
|
memcpy(b, devp->commrxp, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Writes a value into a generic register using SPI.
|
||||||
|
* @pre The SPI interface must be initialized and the driver started.
|
||||||
|
*
|
||||||
|
* @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.
|
||||||
|
*/
|
||||||
|
void adxl355SPIWriteRegister(ADXL355Driver *devp, uint8_t reg, size_t n,
|
||||||
|
uint8_t* b) {
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
osalDbgCheck(n < ADXL355_COMM_BUFF_SIZE);
|
||||||
|
|
||||||
|
/* Preparing a write. */
|
||||||
|
devp->commtxp[0] = (reg << 1);
|
||||||
|
for(i = 0; i < n; i++, b++) {
|
||||||
|
devp->commtxp[i + 1] = *b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Writing. */
|
||||||
|
cacheBufferFlush(&devp->commtxp[0], sizeof(devp->commtxp));
|
||||||
|
spiSelect(devp->config->spip);
|
||||||
|
spiSend(devp->config->spip, n + 1, devp->commtxp);
|
||||||
|
spiUnselect(devp->config->spip);
|
||||||
|
}
|
||||||
|
#endif /* ADXL355_USE_SPI */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initializes an instance.
|
* @brief Initializes an instance.
|
||||||
* @details The buffer should be at least large @p ADXL355_COMM_BUFF_SIZE.
|
* @details The buffer should be at least large @p ADXL355_COMM_BUFF_SIZE.
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
/**
|
/**
|
||||||
* @brief ADXL355 driver version string.
|
* @brief ADXL355 driver version string.
|
||||||
*/
|
*/
|
||||||
#define EX_ADXL355_VERSION "1.0.2"
|
#define EX_ADXL355_VERSION "1.1.0"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief ADXL355 driver version major number.
|
* @brief ADXL355 driver version major number.
|
||||||
|
@ -53,12 +53,12 @@
|
||||||
/**
|
/**
|
||||||
* @brief ADXL355 driver version minor number.
|
* @brief ADXL355 driver version minor number.
|
||||||
*/
|
*/
|
||||||
#define EX_ADXL355_MINOR 0
|
#define EX_ADXL355_MINOR 1
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief ADXL355 driver version patch number.
|
* @brief ADXL355 driver version patch number.
|
||||||
*/
|
*/
|
||||||
#define EX_ADXL355_PATCH 2
|
#define EX_ADXL355_PATCH 0
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -91,7 +91,6 @@
|
||||||
#define ADXL355_AD_MASK 0xFE
|
#define ADXL355_AD_MASK 0xFE
|
||||||
#define ADXL355_RW (1 << 0)
|
#define ADXL355_RW (1 << 0)
|
||||||
#define ADXL355_AD(n) (1 << (n + 1))
|
#define ADXL355_AD(n) (1 << (n + 1))
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -287,7 +286,7 @@
|
||||||
* @brief ADXL355 internal communication buffer sizes.
|
* @brief ADXL355 internal communication buffer sizes.
|
||||||
*/
|
*/
|
||||||
#if !defined(ADXL355_COMM_BUFF_SIZE) || defined(__DOXYGEN__)
|
#if !defined(ADXL355_COMM_BUFF_SIZE) || defined(__DOXYGEN__)
|
||||||
#define ADXL355_COMM_BUFF_SIZE 9
|
#define ADXL355_COMM_BUFF_SIZE 32
|
||||||
#endif
|
#endif
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
|
@ -638,6 +637,12 @@ struct ADXL355Driver {
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
#if (ADXL355_USE_SPI) || defined(__DOXYGEN__)
|
||||||
|
void adxl355SPIReadRegister(ADXL355Driver *devp, uint8_t reg, size_t n,
|
||||||
|
uint8_t* b);
|
||||||
|
void adxl355SPIWriteRegister(ADXL355Driver *devp, uint8_t reg, size_t n,
|
||||||
|
uint8_t* b);
|
||||||
|
#endif /* ADXL355_USE_SPI */
|
||||||
void adxl355ObjectInit(ADXL355Driver *devp, uint8_t* txbp, uint8_t* rxbp);
|
void adxl355ObjectInit(ADXL355Driver *devp, uint8_t* txbp, uint8_t* rxbp);
|
||||||
void adxl355Start(ADXL355Driver *devp, const ADXL355Config *config);
|
void adxl355Start(ADXL355Driver *devp, const ADXL355Config *config);
|
||||||
void adxl355Stop(ADXL355Driver *devp);
|
void adxl355Stop(ADXL355Driver *devp);
|
||||||
|
|
|
@ -31,12 +31,15 @@ static uint8_t rxbuf[ADXL355_COMM_BUFF_SIZE];
|
||||||
|
|
||||||
/* ADXL355 Driver: This object represent an ADXL355 instance */
|
/* ADXL355 Driver: This object represent an ADXL355 instance */
|
||||||
static ADXL355Driver ADXL355D1;
|
static ADXL355Driver ADXL355D1;
|
||||||
|
static BaseAccelerometer * accp = &(ADXL355D1.acc_if);
|
||||||
|
|
||||||
|
static uint32_t axes_count;
|
||||||
static int32_t accraw[ADXL355_ACC_NUMBER_OF_AXES];
|
static int32_t accraw[ADXL355_ACC_NUMBER_OF_AXES];
|
||||||
|
|
||||||
static float acccooked[ADXL355_ACC_NUMBER_OF_AXES];
|
static float acccooked[ADXL355_ACC_NUMBER_OF_AXES];
|
||||||
|
|
||||||
|
|
||||||
static char axisID[ADXL355_ACC_NUMBER_OF_AXES] = {'X', 'Y', 'Z'};
|
static char axisID[ADXL355_ACC_NUMBER_OF_AXES] = {'X', 'Y', 'Z'};
|
||||||
|
static const char device_name[] = "ADXL355";
|
||||||
static uint32_t i;
|
static uint32_t i;
|
||||||
|
|
||||||
static const SPIConfig spicfg = {
|
static const SPIConfig spicfg = {
|
||||||
|
@ -114,20 +117,22 @@ int main(void) {
|
||||||
/* Activates the ADXL355 driver.*/
|
/* Activates the ADXL355 driver.*/
|
||||||
adxl355Start(&ADXL355D1, &adxl355cfg);
|
adxl355Start(&ADXL355D1, &adxl355cfg);
|
||||||
|
|
||||||
/* Normal main() thread activity, printing MEMS data on the SDU1.*/
|
/* Getting the count of axes. */
|
||||||
|
axes_count = accelerometerGetAxesNumber(accp);
|
||||||
|
|
||||||
|
/* Normal main() thread activity, printing MEMS data on the SD5.*/
|
||||||
while (true) {
|
while (true) {
|
||||||
adxl355AccelerometerReadRaw(&ADXL355D1, accraw);
|
accelerometerReadRaw(accp, accraw);
|
||||||
chprintf(chp, "ADXL355 Accelerometer raw data...\r\n");
|
chprintf(chp, "%s raw data...\r\n", device_name);
|
||||||
for(i = 0; i < ADXL355_ACC_NUMBER_OF_AXES; i++) {
|
for(i = 0; i < axes_count; i++) {
|
||||||
chprintf(chp, "%c-axis: %d\r\n", axisID[i], accraw[i]);
|
chprintf(chp, "%c-axis: %d\r\n", axisID[i], accraw[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
adxl355AccelerometerReadCooked(&ADXL355D1, acccooked);
|
accelerometerReadCooked(accp, acccooked);
|
||||||
chprintf(chp, "ADXL355 Accelerometer cooked data...\r\n");
|
chprintf(chp, "%s cooked data...\r\n", device_name);
|
||||||
for(i = 0; i < ADXL355_ACC_NUMBER_OF_AXES; i++) {
|
for(i = 0; i < axes_count; i++) {
|
||||||
chprintf(chp, "%c-axis: %.3f\r\n", axisID[i], acccooked[i]);
|
chprintf(chp, "%c-axis: %.3f\r\n", axisID[i], acccooked[i]);
|
||||||
}
|
}
|
||||||
chThdSleepMilliseconds(100);
|
chThdSleepMilliseconds(100);
|
||||||
}
|
}
|
||||||
adxl355Stop(&ADXL355D1);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,10 +86,5 @@
|
||||||
<type>2</type>
|
<type>2</type>
|
||||||
<locationURI>CHIBIOS/os</locationURI>
|
<locationURI>CHIBIOS/os</locationURI>
|
||||||
</link>
|
</link>
|
||||||
<link>
|
|
||||||
<name>test</name>
|
|
||||||
<type>2</type>
|
|
||||||
<locationURI>CHIBIOS/test</locationURI>
|
|
||||||
</link>
|
|
||||||
</linkedResources>
|
</linkedResources>
|
||||||
</projectDescription>
|
</projectDescription>
|
||||||
|
|
|
@ -27,17 +27,19 @@
|
||||||
/*
|
/*
|
||||||
* SPI TX and RX buffers.
|
* SPI TX and RX buffers.
|
||||||
*/
|
*/
|
||||||
CC_ALIGN_DATA(32) static uint8_t txbuf[32];
|
CC_ALIGN_DATA(32) static uint8_t txbuf[ADXL355_COMM_BUFF_SIZE];
|
||||||
CC_ALIGN_DATA(32) static uint8_t rxbuf[32];
|
CC_ALIGN_DATA(32) static uint8_t rxbuf[ADXL355_COMM_BUFF_SIZE];
|
||||||
|
|
||||||
/* ADXL355 Driver: This object represent an ADXL355 instance */
|
/* ADXL355 Driver: This object represent an ADXL355 instance */
|
||||||
static ADXL355Driver ADXL355D1;
|
static ADXL355Driver ADXL355D1;
|
||||||
|
static BaseAccelerometer * accp = &(ADXL355D1.acc_if);
|
||||||
|
|
||||||
|
static uint32_t axes_count;
|
||||||
static int32_t accraw[ADXL355_ACC_NUMBER_OF_AXES];
|
static int32_t accraw[ADXL355_ACC_NUMBER_OF_AXES];
|
||||||
|
|
||||||
static float acccooked[ADXL355_ACC_NUMBER_OF_AXES];
|
static float acccooked[ADXL355_ACC_NUMBER_OF_AXES];
|
||||||
|
|
||||||
static char axisID[ADXL355_ACC_NUMBER_OF_AXES] = {'X', 'Y', 'Z'};
|
static char axisID[ADXL355_ACC_NUMBER_OF_AXES] = {'X', 'Y', 'Z'};
|
||||||
|
static const char device_name[] = "ADXL355";
|
||||||
static uint32_t i;
|
static uint32_t i;
|
||||||
|
|
||||||
static const SPIConfig spicfg = {
|
static const SPIConfig spicfg = {
|
||||||
|
@ -68,6 +70,21 @@ static ADXL355Config adxl355cfg = {
|
||||||
|
|
||||||
static BaseSequentialStream* chp = (BaseSequentialStream*)&SD1;
|
static BaseSequentialStream* chp = (BaseSequentialStream*)&SD1;
|
||||||
|
|
||||||
|
static THD_WORKING_AREA(waThreadBlinker, 128);
|
||||||
|
static THD_FUNCTION(ThreadBlinker, arg) {
|
||||||
|
|
||||||
|
(void)arg;
|
||||||
|
|
||||||
|
chRegSetThreadName("blinker");
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
palSetLine(LINE_ARD_D13);
|
||||||
|
chThdSleepMilliseconds(200);
|
||||||
|
palClearLine(LINE_ARD_D13);
|
||||||
|
chThdSleepMilliseconds(200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Application entry point.
|
* Application entry point.
|
||||||
*/
|
*/
|
||||||
|
@ -90,26 +107,32 @@ int main(void) {
|
||||||
palSetLineMode(LINE_ARD_D12, PAL_MODE_ALTERNATE(5) | PAL_STM32_OSPEED_HIGHEST);
|
palSetLineMode(LINE_ARD_D12, PAL_MODE_ALTERNATE(5) | PAL_STM32_OSPEED_HIGHEST);
|
||||||
palSetLineMode(LINE_ARD_D13, PAL_MODE_ALTERNATE(5) | PAL_STM32_OSPEED_HIGHEST);
|
palSetLineMode(LINE_ARD_D13, PAL_MODE_ALTERNATE(5) | PAL_STM32_OSPEED_HIGHEST);
|
||||||
|
|
||||||
|
/* Creating LED thread.*/
|
||||||
|
chThdCreateStatic(waThreadBlinker, sizeof(waThreadBlinker), NORMALPRIO + 1,
|
||||||
|
ThreadBlinker, NULL);
|
||||||
|
|
||||||
/* ADXL355 Object Initialization.*/
|
/* ADXL355 Object Initialization.*/
|
||||||
adxl355ObjectInit(&ADXL355D1, txbuf, rxbuf);
|
adxl355ObjectInit(&ADXL355D1, txbuf, rxbuf);
|
||||||
|
|
||||||
/* Activates the ADXL355 driver.*/
|
/* Activates the ADXL355 driver.*/
|
||||||
adxl355Start(&ADXL355D1, &adxl355cfg);
|
adxl355Start(&ADXL355D1, &adxl355cfg);
|
||||||
|
|
||||||
/* Normal main() thread activity, printing MEMS data on the SDU1.*/
|
/* Getting the count of axes. */
|
||||||
|
axes_count = accelerometerGetAxesNumber(accp);
|
||||||
|
|
||||||
|
/* Normal main() thread activity, printing MEMS data on the SD1.*/
|
||||||
while (true) {
|
while (true) {
|
||||||
adxl355AccelerometerReadRaw(&ADXL355D1, accraw);
|
accelerometerReadRaw(accp, accraw);
|
||||||
chprintf(chp, "ADXL355 Accelerometer raw data...\r\n");
|
chprintf(chp, "%s raw data...\r\n", device_name);
|
||||||
for(i = 0; i < ADXL355_ACC_NUMBER_OF_AXES; i++) {
|
for(i = 0; i < axes_count; i++) {
|
||||||
chprintf(chp, "%c-axis: %d\r\n", axisID[i], accraw[i]);
|
chprintf(chp, "%c-axis: %d\r\n", axisID[i], accraw[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
adxl355AccelerometerReadCooked(&ADXL355D1, acccooked);
|
accelerometerReadCooked(accp, acccooked);
|
||||||
chprintf(chp, "ADXL355 Accelerometer cooked data...\r\n");
|
chprintf(chp, "%s cooked data...\r\n", device_name);
|
||||||
for(i = 0; i < ADXL355_ACC_NUMBER_OF_AXES; i++) {
|
for(i = 0; i < axes_count; i++) {
|
||||||
chprintf(chp, "%c-axis: %.3f\r\n", axisID[i], acccooked[i]);
|
chprintf(chp, "%c-axis: %.3f\r\n", axisID[i], acccooked[i]);
|
||||||
}
|
}
|
||||||
chThdSleepMilliseconds(100);
|
chThdSleepMilliseconds(100);
|
||||||
}
|
}
|
||||||
adxl355Stop(&ADXL355D1);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue