xrocusOS_ADXL355 version
Dependencies: mbed SDFileSystem
Diff: driver/Adxl355Drv.cpp
- Revision:
- 20:2f2687580ecb
- Parent:
- 15:35f01ee28b44
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/driver/Adxl355Drv.cpp Fri Jul 05 02:09:06 2019 +0000 @@ -0,0 +1,289 @@ +#include "mbed.h" +#include "Adxl355Drv.h" + +/* --- Definitions --- */ +#define MAX_SEND_SIZE (128) + +/* AXIS */ +#define AXIS_X (0) +#define AXIS_Y (1) +#define AXIS_Z (2) +#define NUM_OF_AXIS (3) + +/* REGISTERS */ +#define ADXL355_REG_DEVID_AD (0x00) +#define ADXL355_REG_DEVID_MST (0x01) +#define ADXL355_REG_PARTID (0x02) +#define ADXL355_REG_REVID (0x03) + +#define ADXL355_REG_XDATA_H (0x08) +#define ADXL355_REG_XDATA_L (0x09) +#define ADXL355_REG_YDATA_H (0x0A) +#define ADXL355_REG_YDATA_L (0x0B) +#define ADXL355_REG_ZDATA_H (0x0C) +#define ADXL355_REG_ZDATA_L (0x0D) + + +#define ADXL355_REG_FIFO_CTL (0x3A) +#define ADXL355_REG_MESURE (0x3E) +#define ADXL355_REG_POWER_CTL (0x3F) + +/* --- Static Variables --- */ +static int dummyreg = 0; +static int devSpiId = 0; +static int senseUid = 0; +static float a[3] = {0.0}; + +static Ticker mesureTick; + +/* --- Prototypes --- */ +static void tickHanlderForSensorRead(void); + +/* DeviceDriverBody*/ +static void initConnectionToAdxl355(void); +static void updateDeviceInfoAdxl355(void); +static void startMesumentAdxl355(void); +static void stopMesumentAdxl355(void); +static int readAccelAdxl355(int selAxis); +static void spiWriteAdxl355(int reg, int val); +static int spiReadAdxl355(int reg); +static int spiReadDualAdxl355(int reg); + +extern Serial pc; + +static SPI myspi(SPI_MOSI, SPI_MISO, SPI_SCK); /* D13, D12, D11 */ +static DigitalOut mycs(SPI_CS); /* D10 */ +static DigitalIn int1(D7); /* D7/D6 */ +static DigitalIn int2(D5); /* D5/D4 */ + +#define SPI_RD (1) +#define SPI_WR (0) +#define SPI_EMPTY_SEND (0x00) + + +/***************************************************************/ +/* Device Driver Interface */ +/***************************************************************/ +/** This handler is called + * in SRS command */ +static bool adxl355_simple_reset(void) +{ + /* TODO */ + dbgprintf("debug:adxl355_simple_reset\n"); + mesureTick.detach(); + return true; +} + +/** This handler is called + * in the first time of mesuments */ +static int adxl355_simple_init(void) +{ + /* TODO */ + dbgprintf("debug:adxl355_simple_init\n"); + mesureTick.detach(); + + initConnectionToAdxl355(); + + return 0; +} + +/** This handler is called + * in the repling mesurement data to Host (ASAP) */ +static bool adxl355_simple_exec(int deviceID, Serial *pOut, FILE *pSave) +{ + char sendBuf[MAX_SEND_SIZE] = {0}; + int sendCharLen; + + dbgprintf("debug:adxl355_simple_exec\n"); + + updateDeviceInfoAdxl355(); + + a[AXIS_X] = ((double)readAccelAdxl355(AXIS_X)) * 9.8 * 0.1; /* only use 8bit/MSB in 12bit */ + a[AXIS_Y] = ((double)readAccelAdxl355(AXIS_Y)) * 9.8 * 0.1; /* only use 8bit/MSB in 12bit */ + a[AXIS_Z] = ((double)readAccelAdxl355(AXIS_Z)) * 9.8 * 0.1; /* only use 8bit/MSB in 12bit */ + + /* TODO */ + uprintf(":%d XDS ", deviceID); + uprintf("0029 REG=%04x,AXIS=%d,ID=%08x\n", + dummyreg, NUM_OF_AXIS, devSpiId); + uprintf(":%d XFD ", deviceID); + sprintf(sendBuf, "%4.4f %4.4f %4.4f", a[AXIS_X], a[AXIS_Y], a[AXIS_Z]); + sendCharLen = strlen(sendBuf); + uprintf("%04d %s\n", sendCharLen, sendBuf); + + if (pSave != NULL) { + dbgprintf("debug:adxl355_simple_exec [Write SD card]\n"); + /* TODO Sd Card save */ + fprintf(pSave, "Device:%08d,%d,%f,%f,%f\n", + devSpiId, senseUid, a[AXIS_X], a[AXIS_Y], a[AXIS_Z]); + } + + return true; +} + +/** This handler is called + * in CRS command */ +static bool adxl355_simple_ready2run(void) +{ + /* TODO */ + dbgprintf("debug:adxl355_simple_ready2run\n"); + updateDeviceInfoAdxl355(); + startMesumentAdxl355(); + mesureTick.attach(tickHanlderForSensorRead, 0.5); + return true; +} + +/** This handler is called + * in End of Mesument */ +static bool adxl355_simple_run2ready(void) +{ + /* TODO */ + dbgprintf("debug:adxl355_simple_ready2run\n"); + stopMesumentAdxl355(); + mesureTick.detach(); + return true; +} + +/** This handler is called + * in CFW after CID */ +static bool adxl355_simple_get_config(int id_pos, int*get) +{ + /* TODO */ + dbgprintf("debug:adxl355_simple_get_config(ID=%x)\n", id_pos); + *get = dummyreg; + return true; +} + +/** This handler is called + * in CFW after CID */ +static bool adxl355_simple_set_config(int id_pos, int set) +{ + /* TODO */ + dbgprintf("debug:adxl355_simple_set_config(ID=%x)\n", id_pos); + dummyreg = set; + return true; +} + +/****************************************************/ +/* for Mesurement */ +/****************************************************/ +static void tickHanlderForSensorRead(void) +{ + /* TODO */ + senseUid++; + return; +} + +/***************************************************************/ +/* Device Driver Body */ +/***************************************************************/ +static void initConnectionToAdxl355(void) +{ + /** Init SPI for ADXL355 + * CPHA = CPOL = 0, 1MHz(max.10MHz)) + * CS = inactive + */ + myspi.format(8,0); + myspi.frequency(1000000); + mycs = 1; +} + +static void startMesumentAdxl355(void) +{ + spiWriteAdxl355(ADXL355_REG_FIFO_CTL, 0); /* all data will be bipassed FIFO. */ + spiWriteAdxl355(ADXL355_REG_POWER_CTL, 1); /* WAKEUP mode */ +} + +static void stopMesumentAdxl355(void) +{ + spiWriteAdxl355(ADXL355_REG_FIFO_CTL, 0); /* all data will be bipassed FIFO. */ + spiWriteAdxl355(ADXL355_REG_POWER_CTL, 0); /* STANDBY mode */ +} + +static int readAccelAdxl355(int selAxis) +{ + int ret; + switch(selAxis) { + case AXIS_X: + ret = spiReadDualAdxl355(ADXL355_REG_XDATA_H); + break; + case AXIS_Y: + ret = spiReadDualAdxl355(ADXL355_REG_YDATA_H); + break; + case AXIS_Z: + ret = spiReadDualAdxl355(ADXL355_REG_ZDATA_H); + break; + default: + ret = 0xFFFFFFFF; + } + ret = ret >> 4; + if ((ret & 0x00000800) != 0) { + ret |= 0xFFFFF800; + } + dbgprintf("debug:readAccelAdxl355(AXIS=%d)=0x%08x\n", selAxis, ret); + return ret; +} + +static void updateDeviceInfoAdxl355(void) +{ + + int devid_ad; + int devid_mst; + int devid_part; + int devid_rev; + + devid_ad = spiReadAdxl355(ADXL355_REG_DEVID_AD); + devid_mst = spiReadAdxl355(ADXL355_REG_DEVID_MST); + devid_part = spiReadAdxl355(ADXL355_REG_PARTID); + devid_rev = spiReadAdxl355(ADXL355_REG_REVID); + devSpiId = (devid_ad << 0) + | (devid_mst << 8) + | (devid_part << 16) + | (devid_rev << 24); +} + +static int spiReadAdxl355(int reg) +{ + int val; + mycs = 0; + myspi.write(reg << 1 | SPI_RD); + val = myspi.write(SPI_EMPTY_SEND); + mycs = 1; + dbgprintf("debug:spiReadAdxl355(reg=0x%08x)=0x%08x\n", reg, val); + return val; +} + +static int spiReadDualAdxl355(int reg) +{ + int valh, vall, val; + mycs = 0; + myspi.write(reg << 1 | SPI_RD); + valh = myspi.write(SPI_EMPTY_SEND); + vall = myspi.write(SPI_EMPTY_SEND); + mycs = 1; + val = valh << 8 | vall; + dbgprintf("debug:spiReadDualAdxl355(reg=0x%08x)=0x%08x\n", reg, val); + return val; +} + +static void spiWriteAdxl355(int reg, int val) +{ + mycs = 0; + myspi.write(reg << 1 | SPI_WR); + myspi.write(val); + mycs = 1; + dbgprintf("debug:spiWriteAdxl355(reg=0x%08x)=0x%08x\n", reg, val); +} + +/****************************************************/ +/* for Registration of Device Driver */ +/****************************************************/ +DeviceDriver Adxl355Simple = { + .init = adxl355_simple_init, + .set_config = adxl355_simple_set_config, + .get_config = adxl355_simple_get_config, + .reset = adxl355_simple_reset, + .exec = adxl355_simple_exec, + .ready2run = adxl355_simple_ready2run, + .run2ready = adxl355_simple_run2ready, + }; \ No newline at end of file