xrocusOS_ADXL355 version

Dependencies:   mbed SDFileSystem

Committer:
APS_Lab
Date:
Fri Jul 05 02:09:06 2019 +0000
Revision:
20:2f2687580ecb
Parent:
driver/Adxl372Drv.cpp@15:35f01ee28b44
Ver0.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Inscape_ao 14:89665bcef3f0 1 #include "mbed.h"
APS_Lab 20:2f2687580ecb 2 #include "Adxl355Drv.h"
Inscape_ao 14:89665bcef3f0 3
Inscape_ao 14:89665bcef3f0 4 /* --- Definitions --- */
Inscape_ao 14:89665bcef3f0 5 #define MAX_SEND_SIZE (128)
Inscape_ao 14:89665bcef3f0 6
Inscape_ao 14:89665bcef3f0 7 /* AXIS */
Inscape_ao 14:89665bcef3f0 8 #define AXIS_X (0)
Inscape_ao 14:89665bcef3f0 9 #define AXIS_Y (1)
Inscape_ao 14:89665bcef3f0 10 #define AXIS_Z (2)
Inscape_ao 14:89665bcef3f0 11 #define NUM_OF_AXIS (3)
Inscape_ao 14:89665bcef3f0 12
Inscape_ao 14:89665bcef3f0 13 /* REGISTERS */
APS_Lab 20:2f2687580ecb 14 #define ADXL355_REG_DEVID_AD (0x00)
APS_Lab 20:2f2687580ecb 15 #define ADXL355_REG_DEVID_MST (0x01)
APS_Lab 20:2f2687580ecb 16 #define ADXL355_REG_PARTID (0x02)
APS_Lab 20:2f2687580ecb 17 #define ADXL355_REG_REVID (0x03)
Inscape_ao 14:89665bcef3f0 18
APS_Lab 20:2f2687580ecb 19 #define ADXL355_REG_XDATA_H (0x08)
APS_Lab 20:2f2687580ecb 20 #define ADXL355_REG_XDATA_L (0x09)
APS_Lab 20:2f2687580ecb 21 #define ADXL355_REG_YDATA_H (0x0A)
APS_Lab 20:2f2687580ecb 22 #define ADXL355_REG_YDATA_L (0x0B)
APS_Lab 20:2f2687580ecb 23 #define ADXL355_REG_ZDATA_H (0x0C)
APS_Lab 20:2f2687580ecb 24 #define ADXL355_REG_ZDATA_L (0x0D)
Inscape_ao 14:89665bcef3f0 25
Inscape_ao 14:89665bcef3f0 26
APS_Lab 20:2f2687580ecb 27 #define ADXL355_REG_FIFO_CTL (0x3A)
APS_Lab 20:2f2687580ecb 28 #define ADXL355_REG_MESURE (0x3E)
APS_Lab 20:2f2687580ecb 29 #define ADXL355_REG_POWER_CTL (0x3F)
Inscape_ao 14:89665bcef3f0 30
Inscape_ao 14:89665bcef3f0 31 /* --- Static Variables --- */
Inscape_ao 14:89665bcef3f0 32 static int dummyreg = 0;
Inscape_ao 14:89665bcef3f0 33 static int devSpiId = 0;
Inscape_ao 14:89665bcef3f0 34 static int senseUid = 0;
Inscape_ao 14:89665bcef3f0 35 static float a[3] = {0.0};
Inscape_ao 14:89665bcef3f0 36
Inscape_ao 14:89665bcef3f0 37 static Ticker mesureTick;
Inscape_ao 14:89665bcef3f0 38
Inscape_ao 14:89665bcef3f0 39 /* --- Prototypes --- */
Inscape_ao 14:89665bcef3f0 40 static void tickHanlderForSensorRead(void);
Inscape_ao 14:89665bcef3f0 41
Inscape_ao 14:89665bcef3f0 42 /* DeviceDriverBody*/
APS_Lab 20:2f2687580ecb 43 static void initConnectionToAdxl355(void);
APS_Lab 20:2f2687580ecb 44 static void updateDeviceInfoAdxl355(void);
APS_Lab 20:2f2687580ecb 45 static void startMesumentAdxl355(void);
APS_Lab 20:2f2687580ecb 46 static void stopMesumentAdxl355(void);
APS_Lab 20:2f2687580ecb 47 static int readAccelAdxl355(int selAxis);
APS_Lab 20:2f2687580ecb 48 static void spiWriteAdxl355(int reg, int val);
APS_Lab 20:2f2687580ecb 49 static int spiReadAdxl355(int reg);
APS_Lab 20:2f2687580ecb 50 static int spiReadDualAdxl355(int reg);
Inscape_ao 14:89665bcef3f0 51
Inscape_ao 14:89665bcef3f0 52 extern Serial pc;
Inscape_ao 14:89665bcef3f0 53
Inscape_ao 14:89665bcef3f0 54 static SPI myspi(SPI_MOSI, SPI_MISO, SPI_SCK); /* D13, D12, D11 */
Inscape_ao 14:89665bcef3f0 55 static DigitalOut mycs(SPI_CS); /* D10 */
Inscape_ao 14:89665bcef3f0 56 static DigitalIn int1(D7); /* D7/D6 */
Inscape_ao 14:89665bcef3f0 57 static DigitalIn int2(D5); /* D5/D4 */
Inscape_ao 14:89665bcef3f0 58
Inscape_ao 14:89665bcef3f0 59 #define SPI_RD (1)
Inscape_ao 14:89665bcef3f0 60 #define SPI_WR (0)
Inscape_ao 14:89665bcef3f0 61 #define SPI_EMPTY_SEND (0x00)
Inscape_ao 14:89665bcef3f0 62
Inscape_ao 14:89665bcef3f0 63
Inscape_ao 14:89665bcef3f0 64 /***************************************************************/
Inscape_ao 14:89665bcef3f0 65 /* Device Driver Interface */
Inscape_ao 14:89665bcef3f0 66 /***************************************************************/
Inscape_ao 14:89665bcef3f0 67 /** This handler is called
Inscape_ao 14:89665bcef3f0 68 * in SRS command */
APS_Lab 20:2f2687580ecb 69 static bool adxl355_simple_reset(void)
Inscape_ao 14:89665bcef3f0 70 {
Inscape_ao 14:89665bcef3f0 71 /* TODO */
APS_Lab 20:2f2687580ecb 72 dbgprintf("debug:adxl355_simple_reset\n");
Inscape_ao 14:89665bcef3f0 73 mesureTick.detach();
Inscape_ao 14:89665bcef3f0 74 return true;
Inscape_ao 14:89665bcef3f0 75 }
Inscape_ao 14:89665bcef3f0 76
Inscape_ao 14:89665bcef3f0 77 /** This handler is called
Inscape_ao 14:89665bcef3f0 78 * in the first time of mesuments */
APS_Lab 20:2f2687580ecb 79 static int adxl355_simple_init(void)
Inscape_ao 14:89665bcef3f0 80 {
Inscape_ao 14:89665bcef3f0 81 /* TODO */
APS_Lab 20:2f2687580ecb 82 dbgprintf("debug:adxl355_simple_init\n");
Inscape_ao 14:89665bcef3f0 83 mesureTick.detach();
Inscape_ao 14:89665bcef3f0 84
APS_Lab 20:2f2687580ecb 85 initConnectionToAdxl355();
Inscape_ao 14:89665bcef3f0 86
Inscape_ao 14:89665bcef3f0 87 return 0;
Inscape_ao 14:89665bcef3f0 88 }
Inscape_ao 14:89665bcef3f0 89
Inscape_ao 14:89665bcef3f0 90 /** This handler is called
Inscape_ao 14:89665bcef3f0 91 * in the repling mesurement data to Host (ASAP) */
APS_Lab 20:2f2687580ecb 92 static bool adxl355_simple_exec(int deviceID, Serial *pOut, FILE *pSave)
Inscape_ao 14:89665bcef3f0 93 {
Inscape_ao 14:89665bcef3f0 94 char sendBuf[MAX_SEND_SIZE] = {0};
Inscape_ao 14:89665bcef3f0 95 int sendCharLen;
Inscape_ao 14:89665bcef3f0 96
APS_Lab 20:2f2687580ecb 97 dbgprintf("debug:adxl355_simple_exec\n");
Inscape_ao 14:89665bcef3f0 98
APS_Lab 20:2f2687580ecb 99 updateDeviceInfoAdxl355();
Inscape_ao 14:89665bcef3f0 100
APS_Lab 20:2f2687580ecb 101 a[AXIS_X] = ((double)readAccelAdxl355(AXIS_X)) * 9.8 * 0.1; /* only use 8bit/MSB in 12bit */
APS_Lab 20:2f2687580ecb 102 a[AXIS_Y] = ((double)readAccelAdxl355(AXIS_Y)) * 9.8 * 0.1; /* only use 8bit/MSB in 12bit */
APS_Lab 20:2f2687580ecb 103 a[AXIS_Z] = ((double)readAccelAdxl355(AXIS_Z)) * 9.8 * 0.1; /* only use 8bit/MSB in 12bit */
Inscape_ao 14:89665bcef3f0 104
Inscape_ao 14:89665bcef3f0 105 /* TODO */
Inscape_ao 14:89665bcef3f0 106 uprintf(":%d XDS ", deviceID);
Inscape_ao 14:89665bcef3f0 107 uprintf("0029 REG=%04x,AXIS=%d,ID=%08x\n",
Inscape_ao 14:89665bcef3f0 108 dummyreg, NUM_OF_AXIS, devSpiId);
Inscape_ao 14:89665bcef3f0 109 uprintf(":%d XFD ", deviceID);
Inscape_ao 14:89665bcef3f0 110 sprintf(sendBuf, "%4.4f %4.4f %4.4f", a[AXIS_X], a[AXIS_Y], a[AXIS_Z]);
Inscape_ao 14:89665bcef3f0 111 sendCharLen = strlen(sendBuf);
Inscape_ao 14:89665bcef3f0 112 uprintf("%04d %s\n", sendCharLen, sendBuf);
Inscape_ao 14:89665bcef3f0 113
Inscape_ao 14:89665bcef3f0 114 if (pSave != NULL) {
APS_Lab 20:2f2687580ecb 115 dbgprintf("debug:adxl355_simple_exec [Write SD card]\n");
Inscape_ao 14:89665bcef3f0 116 /* TODO Sd Card save */
Inscape_ao 14:89665bcef3f0 117 fprintf(pSave, "Device:%08d,%d,%f,%f,%f\n",
Inscape_ao 14:89665bcef3f0 118 devSpiId, senseUid, a[AXIS_X], a[AXIS_Y], a[AXIS_Z]);
Inscape_ao 14:89665bcef3f0 119 }
Inscape_ao 14:89665bcef3f0 120
Inscape_ao 14:89665bcef3f0 121 return true;
Inscape_ao 14:89665bcef3f0 122 }
Inscape_ao 14:89665bcef3f0 123
Inscape_ao 14:89665bcef3f0 124 /** This handler is called
Inscape_ao 14:89665bcef3f0 125 * in CRS command */
APS_Lab 20:2f2687580ecb 126 static bool adxl355_simple_ready2run(void)
Inscape_ao 14:89665bcef3f0 127 {
Inscape_ao 14:89665bcef3f0 128 /* TODO */
APS_Lab 20:2f2687580ecb 129 dbgprintf("debug:adxl355_simple_ready2run\n");
APS_Lab 20:2f2687580ecb 130 updateDeviceInfoAdxl355();
APS_Lab 20:2f2687580ecb 131 startMesumentAdxl355();
Inscape_ao 14:89665bcef3f0 132 mesureTick.attach(tickHanlderForSensorRead, 0.5);
Inscape_ao 14:89665bcef3f0 133 return true;
Inscape_ao 14:89665bcef3f0 134 }
Inscape_ao 14:89665bcef3f0 135
Inscape_ao 14:89665bcef3f0 136 /** This handler is called
Inscape_ao 14:89665bcef3f0 137 * in End of Mesument */
APS_Lab 20:2f2687580ecb 138 static bool adxl355_simple_run2ready(void)
Inscape_ao 14:89665bcef3f0 139 {
Inscape_ao 14:89665bcef3f0 140 /* TODO */
APS_Lab 20:2f2687580ecb 141 dbgprintf("debug:adxl355_simple_ready2run\n");
APS_Lab 20:2f2687580ecb 142 stopMesumentAdxl355();
Inscape_ao 14:89665bcef3f0 143 mesureTick.detach();
Inscape_ao 14:89665bcef3f0 144 return true;
Inscape_ao 14:89665bcef3f0 145 }
Inscape_ao 14:89665bcef3f0 146
Inscape_ao 14:89665bcef3f0 147 /** This handler is called
Inscape_ao 14:89665bcef3f0 148 * in CFW after CID */
APS_Lab 20:2f2687580ecb 149 static bool adxl355_simple_get_config(int id_pos, int*get)
Inscape_ao 14:89665bcef3f0 150 {
Inscape_ao 14:89665bcef3f0 151 /* TODO */
APS_Lab 20:2f2687580ecb 152 dbgprintf("debug:adxl355_simple_get_config(ID=%x)\n", id_pos);
Inscape_ao 14:89665bcef3f0 153 *get = dummyreg;
Inscape_ao 14:89665bcef3f0 154 return true;
Inscape_ao 14:89665bcef3f0 155 }
Inscape_ao 14:89665bcef3f0 156
Inscape_ao 14:89665bcef3f0 157 /** This handler is called
Inscape_ao 14:89665bcef3f0 158 * in CFW after CID */
APS_Lab 20:2f2687580ecb 159 static bool adxl355_simple_set_config(int id_pos, int set)
Inscape_ao 14:89665bcef3f0 160 {
Inscape_ao 14:89665bcef3f0 161 /* TODO */
APS_Lab 20:2f2687580ecb 162 dbgprintf("debug:adxl355_simple_set_config(ID=%x)\n", id_pos);
Inscape_ao 14:89665bcef3f0 163 dummyreg = set;
Inscape_ao 14:89665bcef3f0 164 return true;
Inscape_ao 14:89665bcef3f0 165 }
Inscape_ao 14:89665bcef3f0 166
Inscape_ao 14:89665bcef3f0 167 /****************************************************/
Inscape_ao 14:89665bcef3f0 168 /* for Mesurement */
Inscape_ao 14:89665bcef3f0 169 /****************************************************/
Inscape_ao 14:89665bcef3f0 170 static void tickHanlderForSensorRead(void)
Inscape_ao 14:89665bcef3f0 171 {
Inscape_ao 14:89665bcef3f0 172 /* TODO */
Inscape_ao 14:89665bcef3f0 173 senseUid++;
Inscape_ao 14:89665bcef3f0 174 return;
Inscape_ao 14:89665bcef3f0 175 }
Inscape_ao 14:89665bcef3f0 176
Inscape_ao 14:89665bcef3f0 177 /***************************************************************/
Inscape_ao 14:89665bcef3f0 178 /* Device Driver Body */
Inscape_ao 14:89665bcef3f0 179 /***************************************************************/
APS_Lab 20:2f2687580ecb 180 static void initConnectionToAdxl355(void)
Inscape_ao 14:89665bcef3f0 181 {
APS_Lab 20:2f2687580ecb 182 /** Init SPI for ADXL355
Inscape_ao 14:89665bcef3f0 183 * CPHA = CPOL = 0, 1MHz(max.10MHz))
Inscape_ao 14:89665bcef3f0 184 * CS = inactive
Inscape_ao 14:89665bcef3f0 185 */
Inscape_ao 14:89665bcef3f0 186 myspi.format(8,0);
Inscape_ao 14:89665bcef3f0 187 myspi.frequency(1000000);
Inscape_ao 14:89665bcef3f0 188 mycs = 1;
Inscape_ao 14:89665bcef3f0 189 }
Inscape_ao 14:89665bcef3f0 190
APS_Lab 20:2f2687580ecb 191 static void startMesumentAdxl355(void)
Inscape_ao 14:89665bcef3f0 192 {
APS_Lab 20:2f2687580ecb 193 spiWriteAdxl355(ADXL355_REG_FIFO_CTL, 0); /* all data will be bipassed FIFO. */
APS_Lab 20:2f2687580ecb 194 spiWriteAdxl355(ADXL355_REG_POWER_CTL, 1); /* WAKEUP mode */
Inscape_ao 14:89665bcef3f0 195 }
Inscape_ao 14:89665bcef3f0 196
APS_Lab 20:2f2687580ecb 197 static void stopMesumentAdxl355(void)
Inscape_ao 14:89665bcef3f0 198 {
APS_Lab 20:2f2687580ecb 199 spiWriteAdxl355(ADXL355_REG_FIFO_CTL, 0); /* all data will be bipassed FIFO. */
APS_Lab 20:2f2687580ecb 200 spiWriteAdxl355(ADXL355_REG_POWER_CTL, 0); /* STANDBY mode */
Inscape_ao 14:89665bcef3f0 201 }
Inscape_ao 14:89665bcef3f0 202
APS_Lab 20:2f2687580ecb 203 static int readAccelAdxl355(int selAxis)
Inscape_ao 14:89665bcef3f0 204 {
Inscape_ao 14:89665bcef3f0 205 int ret;
Inscape_ao 14:89665bcef3f0 206 switch(selAxis) {
Inscape_ao 14:89665bcef3f0 207 case AXIS_X:
APS_Lab 20:2f2687580ecb 208 ret = spiReadDualAdxl355(ADXL355_REG_XDATA_H);
Inscape_ao 14:89665bcef3f0 209 break;
Inscape_ao 14:89665bcef3f0 210 case AXIS_Y:
APS_Lab 20:2f2687580ecb 211 ret = spiReadDualAdxl355(ADXL355_REG_YDATA_H);
Inscape_ao 14:89665bcef3f0 212 break;
Inscape_ao 14:89665bcef3f0 213 case AXIS_Z:
APS_Lab 20:2f2687580ecb 214 ret = spiReadDualAdxl355(ADXL355_REG_ZDATA_H);
Inscape_ao 14:89665bcef3f0 215 break;
Inscape_ao 14:89665bcef3f0 216 default:
Inscape_ao 14:89665bcef3f0 217 ret = 0xFFFFFFFF;
Inscape_ao 14:89665bcef3f0 218 }
Inscape_ao 14:89665bcef3f0 219 ret = ret >> 4;
Inscape_ao 14:89665bcef3f0 220 if ((ret & 0x00000800) != 0) {
Inscape_ao 14:89665bcef3f0 221 ret |= 0xFFFFF800;
Inscape_ao 14:89665bcef3f0 222 }
APS_Lab 20:2f2687580ecb 223 dbgprintf("debug:readAccelAdxl355(AXIS=%d)=0x%08x\n", selAxis, ret);
Inscape_ao 14:89665bcef3f0 224 return ret;
Inscape_ao 14:89665bcef3f0 225 }
Inscape_ao 14:89665bcef3f0 226
APS_Lab 20:2f2687580ecb 227 static void updateDeviceInfoAdxl355(void)
Inscape_ao 14:89665bcef3f0 228 {
Inscape_ao 14:89665bcef3f0 229
Inscape_ao 14:89665bcef3f0 230 int devid_ad;
Inscape_ao 14:89665bcef3f0 231 int devid_mst;
Inscape_ao 14:89665bcef3f0 232 int devid_part;
Inscape_ao 14:89665bcef3f0 233 int devid_rev;
Inscape_ao 14:89665bcef3f0 234
APS_Lab 20:2f2687580ecb 235 devid_ad = spiReadAdxl355(ADXL355_REG_DEVID_AD);
APS_Lab 20:2f2687580ecb 236 devid_mst = spiReadAdxl355(ADXL355_REG_DEVID_MST);
APS_Lab 20:2f2687580ecb 237 devid_part = spiReadAdxl355(ADXL355_REG_PARTID);
APS_Lab 20:2f2687580ecb 238 devid_rev = spiReadAdxl355(ADXL355_REG_REVID);
Inscape_ao 14:89665bcef3f0 239 devSpiId = (devid_ad << 0)
Inscape_ao 14:89665bcef3f0 240 | (devid_mst << 8)
Inscape_ao 14:89665bcef3f0 241 | (devid_part << 16)
Inscape_ao 14:89665bcef3f0 242 | (devid_rev << 24);
Inscape_ao 14:89665bcef3f0 243 }
Inscape_ao 14:89665bcef3f0 244
APS_Lab 20:2f2687580ecb 245 static int spiReadAdxl355(int reg)
Inscape_ao 14:89665bcef3f0 246 {
Inscape_ao 14:89665bcef3f0 247 int val;
Inscape_ao 14:89665bcef3f0 248 mycs = 0;
Inscape_ao 14:89665bcef3f0 249 myspi.write(reg << 1 | SPI_RD);
Inscape_ao 14:89665bcef3f0 250 val = myspi.write(SPI_EMPTY_SEND);
Inscape_ao 14:89665bcef3f0 251 mycs = 1;
APS_Lab 20:2f2687580ecb 252 dbgprintf("debug:spiReadAdxl355(reg=0x%08x)=0x%08x\n", reg, val);
Inscape_ao 14:89665bcef3f0 253 return val;
Inscape_ao 14:89665bcef3f0 254 }
Inscape_ao 14:89665bcef3f0 255
APS_Lab 20:2f2687580ecb 256 static int spiReadDualAdxl355(int reg)
Inscape_ao 14:89665bcef3f0 257 {
Inscape_ao 14:89665bcef3f0 258 int valh, vall, val;
Inscape_ao 14:89665bcef3f0 259 mycs = 0;
Inscape_ao 14:89665bcef3f0 260 myspi.write(reg << 1 | SPI_RD);
Inscape_ao 14:89665bcef3f0 261 valh = myspi.write(SPI_EMPTY_SEND);
Inscape_ao 14:89665bcef3f0 262 vall = myspi.write(SPI_EMPTY_SEND);
Inscape_ao 14:89665bcef3f0 263 mycs = 1;
Inscape_ao 14:89665bcef3f0 264 val = valh << 8 | vall;
APS_Lab 20:2f2687580ecb 265 dbgprintf("debug:spiReadDualAdxl355(reg=0x%08x)=0x%08x\n", reg, val);
Inscape_ao 14:89665bcef3f0 266 return val;
Inscape_ao 14:89665bcef3f0 267 }
Inscape_ao 14:89665bcef3f0 268
APS_Lab 20:2f2687580ecb 269 static void spiWriteAdxl355(int reg, int val)
Inscape_ao 14:89665bcef3f0 270 {
Inscape_ao 14:89665bcef3f0 271 mycs = 0;
Inscape_ao 14:89665bcef3f0 272 myspi.write(reg << 1 | SPI_WR);
Inscape_ao 14:89665bcef3f0 273 myspi.write(val);
Inscape_ao 14:89665bcef3f0 274 mycs = 1;
APS_Lab 20:2f2687580ecb 275 dbgprintf("debug:spiWriteAdxl355(reg=0x%08x)=0x%08x\n", reg, val);
Inscape_ao 14:89665bcef3f0 276 }
Inscape_ao 14:89665bcef3f0 277
Inscape_ao 14:89665bcef3f0 278 /****************************************************/
Inscape_ao 14:89665bcef3f0 279 /* for Registration of Device Driver */
Inscape_ao 14:89665bcef3f0 280 /****************************************************/
APS_Lab 20:2f2687580ecb 281 DeviceDriver Adxl355Simple = {
APS_Lab 20:2f2687580ecb 282 .init = adxl355_simple_init,
APS_Lab 20:2f2687580ecb 283 .set_config = adxl355_simple_set_config,
APS_Lab 20:2f2687580ecb 284 .get_config = adxl355_simple_get_config,
APS_Lab 20:2f2687580ecb 285 .reset = adxl355_simple_reset,
APS_Lab 20:2f2687580ecb 286 .exec = adxl355_simple_exec,
APS_Lab 20:2f2687580ecb 287 .ready2run = adxl355_simple_ready2run,
APS_Lab 20:2f2687580ecb 288 .run2ready = adxl355_simple_run2ready,
Inscape_ao 14:89665bcef3f0 289 };