xrocusOS_ADXL355 version
Dependencies: mbed SDFileSystem
driver/Adxl355Drv.cpp
- Committer:
- APS_Lab
- Date:
- 2019-07-05
- Revision:
- 20:2f2687580ecb
- Parent:
- driver/Adxl372Drv.cpp@ 15:35f01ee28b44
File content as of revision 20:2f2687580ecb:
#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, };