mirror of https://github.com/rusefi/ChibiOS.git
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 "adxl355.h"
|
||||
#include "string.h"
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local definitions. */
|
||||
|
@ -46,54 +47,6 @@
|
|||
/* 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.
|
||||
*
|
||||
|
@ -437,6 +390,65 @@ static const struct BaseAccelerometerVMT vmt_accelerometer = {
|
|||
/* 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.
|
||||
* @details The buffer should be at least large @p ADXL355_COMM_BUFF_SIZE.
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
/**
|
||||
* @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.
|
||||
|
@ -53,12 +53,12 @@
|
|||
/**
|
||||
* @brief ADXL355 driver version minor number.
|
||||
*/
|
||||
#define EX_ADXL355_MINOR 0
|
||||
#define EX_ADXL355_MINOR 1
|
||||
|
||||
/**
|
||||
* @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_RW (1 << 0)
|
||||
#define ADXL355_AD(n) (1 << (n + 1))
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
|
@ -287,7 +286,7 @@
|
|||
* @brief ADXL355 internal communication buffer sizes.
|
||||
*/
|
||||
#if !defined(ADXL355_COMM_BUFF_SIZE) || defined(__DOXYGEN__)
|
||||
#define ADXL355_COMM_BUFF_SIZE 9
|
||||
#define ADXL355_COMM_BUFF_SIZE 32
|
||||
#endif
|
||||
/** @} */
|
||||
|
||||
|
@ -638,6 +637,12 @@ struct ADXL355Driver {
|
|||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#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 adxl355Start(ADXL355Driver *devp, const ADXL355Config *config);
|
||||
void adxl355Stop(ADXL355Driver *devp);
|
||||
|
|
|
@ -31,12 +31,15 @@ static uint8_t rxbuf[ADXL355_COMM_BUFF_SIZE];
|
|||
|
||||
/* ADXL355 Driver: This object represent an ADXL355 instance */
|
||||
static ADXL355Driver ADXL355D1;
|
||||
static BaseAccelerometer * accp = &(ADXL355D1.acc_if);
|
||||
|
||||
static uint32_t axes_count;
|
||||
static int32_t accraw[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 const char device_name[] = "ADXL355";
|
||||
static uint32_t i;
|
||||
|
||||
static const SPIConfig spicfg = {
|
||||
|
@ -66,7 +69,7 @@ static ADXL355Config adxl355cfg = {
|
|||
/*===========================================================================*/
|
||||
|
||||
static BaseSequentialStream* chp = (BaseSequentialStream*) &SD5;
|
||||
|
||||
|
||||
static THD_WORKING_AREA(waThreadBlinker, 128);
|
||||
static THD_FUNCTION(ThreadBlinker, arg) {
|
||||
|
||||
|
@ -114,20 +117,22 @@ int main(void) {
|
|||
/* Activates the ADXL355 driver.*/
|
||||
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) {
|
||||
adxl355AccelerometerReadRaw(&ADXL355D1, accraw);
|
||||
chprintf(chp, "ADXL355 Accelerometer raw data...\r\n");
|
||||
for(i = 0; i < ADXL355_ACC_NUMBER_OF_AXES; i++) {
|
||||
accelerometerReadRaw(accp, accraw);
|
||||
chprintf(chp, "%s raw data...\r\n", device_name);
|
||||
for(i = 0; i < axes_count; i++) {
|
||||
chprintf(chp, "%c-axis: %d\r\n", axisID[i], accraw[i]);
|
||||
}
|
||||
|
||||
adxl355AccelerometerReadCooked(&ADXL355D1, acccooked);
|
||||
chprintf(chp, "ADXL355 Accelerometer cooked data...\r\n");
|
||||
for(i = 0; i < ADXL355_ACC_NUMBER_OF_AXES; i++) {
|
||||
accelerometerReadCooked(accp, acccooked);
|
||||
chprintf(chp, "%s cooked data...\r\n", device_name);
|
||||
for(i = 0; i < axes_count; i++) {
|
||||
chprintf(chp, "%c-axis: %.3f\r\n", axisID[i], acccooked[i]);
|
||||
}
|
||||
chThdSleepMilliseconds(100);
|
||||
}
|
||||
adxl355Stop(&ADXL355D1);
|
||||
}
|
||||
|
|
|
@ -86,10 +86,5 @@
|
|||
<type>2</type>
|
||||
<locationURI>CHIBIOS/os</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>test</name>
|
||||
<type>2</type>
|
||||
<locationURI>CHIBIOS/test</locationURI>
|
||||
</link>
|
||||
</linkedResources>
|
||||
</projectDescription>
|
||||
|
|
|
@ -27,17 +27,19 @@
|
|||
/*
|
||||
* SPI TX and RX buffers.
|
||||
*/
|
||||
CC_ALIGN_DATA(32) static uint8_t txbuf[32];
|
||||
CC_ALIGN_DATA(32) static uint8_t rxbuf[32];
|
||||
CC_ALIGN_DATA(32) static uint8_t txbuf[ADXL355_COMM_BUFF_SIZE];
|
||||
CC_ALIGN_DATA(32) static uint8_t rxbuf[ADXL355_COMM_BUFF_SIZE];
|
||||
|
||||
/* ADXL355 Driver: This object represent an ADXL355 instance */
|
||||
static ADXL355Driver ADXL355D1;
|
||||
static BaseAccelerometer * accp = &(ADXL355D1.acc_if);
|
||||
|
||||
static uint32_t axes_count;
|
||||
static int32_t accraw[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 const char device_name[] = "ADXL355";
|
||||
static uint32_t i;
|
||||
|
||||
static const SPIConfig spicfg = {
|
||||
|
@ -68,6 +70,21 @@ static ADXL355Config adxl355cfg = {
|
|||
|
||||
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.
|
||||
*/
|
||||
|
@ -90,26 +107,32 @@ int main(void) {
|
|||
palSetLineMode(LINE_ARD_D12, 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.*/
|
||||
adxl355ObjectInit(&ADXL355D1, txbuf, rxbuf);
|
||||
|
||||
/* Activates the ADXL355 driver.*/
|
||||
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) {
|
||||
adxl355AccelerometerReadRaw(&ADXL355D1, accraw);
|
||||
chprintf(chp, "ADXL355 Accelerometer raw data...\r\n");
|
||||
for(i = 0; i < ADXL355_ACC_NUMBER_OF_AXES; i++) {
|
||||
accelerometerReadRaw(accp, accraw);
|
||||
chprintf(chp, "%s raw data...\r\n", device_name);
|
||||
for(i = 0; i < axes_count; i++) {
|
||||
chprintf(chp, "%c-axis: %d\r\n", axisID[i], accraw[i]);
|
||||
}
|
||||
|
||||
adxl355AccelerometerReadCooked(&ADXL355D1, acccooked);
|
||||
chprintf(chp, "ADXL355 Accelerometer cooked data...\r\n");
|
||||
for(i = 0; i < ADXL355_ACC_NUMBER_OF_AXES; i++) {
|
||||
accelerometerReadCooked(accp, acccooked);
|
||||
chprintf(chp, "%s cooked data...\r\n", device_name);
|
||||
for(i = 0; i < axes_count; i++) {
|
||||
chprintf(chp, "%c-axis: %.3f\r\n", axisID[i], acccooked[i]);
|
||||
}
|
||||
chThdSleepMilliseconds(100);
|
||||
}
|
||||
adxl355Stop(&ADXL355D1);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue