xrocusOS_ADXL355 version
Dependencies: mbed SDFileSystem
Adxl355Drv.cpp
00001 #include "mbed.h" 00002 #include "Adxl355Drv.h" 00003 00004 /* --- Definitions --- */ 00005 #define MAX_SEND_SIZE (128) 00006 00007 /* AXIS */ 00008 #define AXIS_X (0) 00009 #define AXIS_Y (1) 00010 #define AXIS_Z (2) 00011 #define NUM_OF_AXIS (3) 00012 00013 /* REGISTERS */ 00014 #define ADXL355_REG_DEVID_AD (0x00) 00015 #define ADXL355_REG_DEVID_MST (0x01) 00016 #define ADXL355_REG_PARTID (0x02) 00017 #define ADXL355_REG_REVID (0x03) 00018 00019 #define ADXL355_REG_XDATA_H (0x08) 00020 #define ADXL355_REG_XDATA_L (0x09) 00021 #define ADXL355_REG_YDATA_H (0x0A) 00022 #define ADXL355_REG_YDATA_L (0x0B) 00023 #define ADXL355_REG_ZDATA_H (0x0C) 00024 #define ADXL355_REG_ZDATA_L (0x0D) 00025 00026 00027 #define ADXL355_REG_FIFO_CTL (0x3A) 00028 #define ADXL355_REG_MESURE (0x3E) 00029 #define ADXL355_REG_POWER_CTL (0x3F) 00030 00031 /* --- Static Variables --- */ 00032 static int dummyreg = 0; 00033 static int devSpiId = 0; 00034 static int senseUid = 0; 00035 static float a[3] = {0.0}; 00036 00037 static Ticker mesureTick; 00038 00039 /* --- Prototypes --- */ 00040 static void tickHanlderForSensorRead(void); 00041 00042 /* DeviceDriverBody*/ 00043 static void initConnectionToAdxl355(void); 00044 static void updateDeviceInfoAdxl355(void); 00045 static void startMesumentAdxl355(void); 00046 static void stopMesumentAdxl355(void); 00047 static int readAccelAdxl355(int selAxis); 00048 static void spiWriteAdxl355(int reg, int val); 00049 static int spiReadAdxl355(int reg); 00050 static int spiReadDualAdxl355(int reg); 00051 00052 extern Serial pc; 00053 00054 static SPI myspi(SPI_MOSI, SPI_MISO, SPI_SCK); /* D13, D12, D11 */ 00055 static DigitalOut mycs(SPI_CS); /* D10 */ 00056 static DigitalIn int1(D7); /* D7/D6 */ 00057 static DigitalIn int2(D5); /* D5/D4 */ 00058 00059 #define SPI_RD (1) 00060 #define SPI_WR (0) 00061 #define SPI_EMPTY_SEND (0x00) 00062 00063 00064 /***************************************************************/ 00065 /* Device Driver Interface */ 00066 /***************************************************************/ 00067 /** This handler is called 00068 * in SRS command */ 00069 static bool adxl355_simple_reset(void) 00070 { 00071 /* TODO */ 00072 dbgprintf("debug:adxl355_simple_reset\n"); 00073 mesureTick.detach(); 00074 return true; 00075 } 00076 00077 /** This handler is called 00078 * in the first time of mesuments */ 00079 static int adxl355_simple_init(void) 00080 { 00081 /* TODO */ 00082 dbgprintf("debug:adxl355_simple_init\n"); 00083 mesureTick.detach(); 00084 00085 initConnectionToAdxl355(); 00086 00087 return 0; 00088 } 00089 00090 /** This handler is called 00091 * in the repling mesurement data to Host (ASAP) */ 00092 static bool adxl355_simple_exec(int deviceID, Serial *pOut, FILE *pSave) 00093 { 00094 char sendBuf[MAX_SEND_SIZE] = {0}; 00095 int sendCharLen; 00096 00097 dbgprintf("debug:adxl355_simple_exec\n"); 00098 00099 updateDeviceInfoAdxl355(); 00100 00101 a[AXIS_X] = ((double)readAccelAdxl355(AXIS_X)) * 9.8 * 0.1; /* only use 8bit/MSB in 12bit */ 00102 a[AXIS_Y] = ((double)readAccelAdxl355(AXIS_Y)) * 9.8 * 0.1; /* only use 8bit/MSB in 12bit */ 00103 a[AXIS_Z] = ((double)readAccelAdxl355(AXIS_Z)) * 9.8 * 0.1; /* only use 8bit/MSB in 12bit */ 00104 00105 /* TODO */ 00106 uprintf(":%d XDS ", deviceID); 00107 uprintf("0029 REG=%04x,AXIS=%d,ID=%08x\n", 00108 dummyreg, NUM_OF_AXIS, devSpiId); 00109 uprintf(":%d XFD ", deviceID); 00110 sprintf(sendBuf, "%4.4f %4.4f %4.4f", a[AXIS_X], a[AXIS_Y], a[AXIS_Z]); 00111 sendCharLen = strlen(sendBuf); 00112 uprintf("%04d %s\n", sendCharLen, sendBuf); 00113 00114 if (pSave != NULL) { 00115 dbgprintf("debug:adxl355_simple_exec [Write SD card]\n"); 00116 /* TODO Sd Card save */ 00117 fprintf(pSave, "Device:%08d,%d,%f,%f,%f\n", 00118 devSpiId, senseUid, a[AXIS_X], a[AXIS_Y], a[AXIS_Z]); 00119 } 00120 00121 return true; 00122 } 00123 00124 /** This handler is called 00125 * in CRS command */ 00126 static bool adxl355_simple_ready2run(void) 00127 { 00128 /* TODO */ 00129 dbgprintf("debug:adxl355_simple_ready2run\n"); 00130 updateDeviceInfoAdxl355(); 00131 startMesumentAdxl355(); 00132 mesureTick.attach(tickHanlderForSensorRead, 0.5); 00133 return true; 00134 } 00135 00136 /** This handler is called 00137 * in End of Mesument */ 00138 static bool adxl355_simple_run2ready(void) 00139 { 00140 /* TODO */ 00141 dbgprintf("debug:adxl355_simple_ready2run\n"); 00142 stopMesumentAdxl355(); 00143 mesureTick.detach(); 00144 return true; 00145 } 00146 00147 /** This handler is called 00148 * in CFW after CID */ 00149 static bool adxl355_simple_get_config(int id_pos, int*get) 00150 { 00151 /* TODO */ 00152 dbgprintf("debug:adxl355_simple_get_config(ID=%x)\n", id_pos); 00153 *get = dummyreg; 00154 return true; 00155 } 00156 00157 /** This handler is called 00158 * in CFW after CID */ 00159 static bool adxl355_simple_set_config(int id_pos, int set) 00160 { 00161 /* TODO */ 00162 dbgprintf("debug:adxl355_simple_set_config(ID=%x)\n", id_pos); 00163 dummyreg = set; 00164 return true; 00165 } 00166 00167 /****************************************************/ 00168 /* for Mesurement */ 00169 /****************************************************/ 00170 static void tickHanlderForSensorRead(void) 00171 { 00172 /* TODO */ 00173 senseUid++; 00174 return; 00175 } 00176 00177 /***************************************************************/ 00178 /* Device Driver Body */ 00179 /***************************************************************/ 00180 static void initConnectionToAdxl355(void) 00181 { 00182 /** Init SPI for ADXL355 00183 * CPHA = CPOL = 0, 1MHz(max.10MHz)) 00184 * CS = inactive 00185 */ 00186 myspi.format(8,0); 00187 myspi.frequency(1000000); 00188 mycs = 1; 00189 } 00190 00191 static void startMesumentAdxl355(void) 00192 { 00193 spiWriteAdxl355(ADXL355_REG_FIFO_CTL, 0); /* all data will be bipassed FIFO. */ 00194 spiWriteAdxl355(ADXL355_REG_POWER_CTL, 1); /* WAKEUP mode */ 00195 } 00196 00197 static void stopMesumentAdxl355(void) 00198 { 00199 spiWriteAdxl355(ADXL355_REG_FIFO_CTL, 0); /* all data will be bipassed FIFO. */ 00200 spiWriteAdxl355(ADXL355_REG_POWER_CTL, 0); /* STANDBY mode */ 00201 } 00202 00203 static int readAccelAdxl355(int selAxis) 00204 { 00205 int ret; 00206 switch(selAxis) { 00207 case AXIS_X: 00208 ret = spiReadDualAdxl355(ADXL355_REG_XDATA_H); 00209 break; 00210 case AXIS_Y: 00211 ret = spiReadDualAdxl355(ADXL355_REG_YDATA_H); 00212 break; 00213 case AXIS_Z: 00214 ret = spiReadDualAdxl355(ADXL355_REG_ZDATA_H); 00215 break; 00216 default: 00217 ret = 0xFFFFFFFF; 00218 } 00219 ret = ret >> 4; 00220 if ((ret & 0x00000800) != 0) { 00221 ret |= 0xFFFFF800; 00222 } 00223 dbgprintf("debug:readAccelAdxl355(AXIS=%d)=0x%08x\n", selAxis, ret); 00224 return ret; 00225 } 00226 00227 static void updateDeviceInfoAdxl355(void) 00228 { 00229 00230 int devid_ad; 00231 int devid_mst; 00232 int devid_part; 00233 int devid_rev; 00234 00235 devid_ad = spiReadAdxl355(ADXL355_REG_DEVID_AD); 00236 devid_mst = spiReadAdxl355(ADXL355_REG_DEVID_MST); 00237 devid_part = spiReadAdxl355(ADXL355_REG_PARTID); 00238 devid_rev = spiReadAdxl355(ADXL355_REG_REVID); 00239 devSpiId = (devid_ad << 0) 00240 | (devid_mst << 8) 00241 | (devid_part << 16) 00242 | (devid_rev << 24); 00243 } 00244 00245 static int spiReadAdxl355(int reg) 00246 { 00247 int val; 00248 mycs = 0; 00249 myspi.write(reg << 1 | SPI_RD); 00250 val = myspi.write(SPI_EMPTY_SEND); 00251 mycs = 1; 00252 dbgprintf("debug:spiReadAdxl355(reg=0x%08x)=0x%08x\n", reg, val); 00253 return val; 00254 } 00255 00256 static int spiReadDualAdxl355(int reg) 00257 { 00258 int valh, vall, val; 00259 mycs = 0; 00260 myspi.write(reg << 1 | SPI_RD); 00261 valh = myspi.write(SPI_EMPTY_SEND); 00262 vall = myspi.write(SPI_EMPTY_SEND); 00263 mycs = 1; 00264 val = valh << 8 | vall; 00265 dbgprintf("debug:spiReadDualAdxl355(reg=0x%08x)=0x%08x\n", reg, val); 00266 return val; 00267 } 00268 00269 static void spiWriteAdxl355(int reg, int val) 00270 { 00271 mycs = 0; 00272 myspi.write(reg << 1 | SPI_WR); 00273 myspi.write(val); 00274 mycs = 1; 00275 dbgprintf("debug:spiWriteAdxl355(reg=0x%08x)=0x%08x\n", reg, val); 00276 } 00277 00278 /****************************************************/ 00279 /* for Registration of Device Driver */ 00280 /****************************************************/ 00281 DeviceDriver Adxl355Simple = { 00282 .init = adxl355_simple_init, 00283 .set_config = adxl355_simple_set_config, 00284 .get_config = adxl355_simple_get_config, 00285 .reset = adxl355_simple_reset, 00286 .exec = adxl355_simple_exec, 00287 .ready2run = adxl355_simple_ready2run, 00288 .run2ready = adxl355_simple_run2ready, 00289 };
Generated on Sun Jul 17 2022 15:09:45 by 1.7.2