xrocusOS_ADXL355 version

Dependencies:   mbed SDFileSystem

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Adxl355Drv.cpp Source File

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     };