JunMo Hong / ADXL362

Fork of ADXL362 by Richard McWilliam

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ADXL362.cpp Source File

ADXL362.cpp

00001 #include "mbed.h"
00002 #include "ADXL362.h"
00003 #include "main.h"
00004  
00005 // Class
00006  
00007 ADXL362::ADXL362(PinName mosi, PinName miso, PinName sclk, PinName cbs)
00008     : SPI_m(mosi, miso, sclk) 
00009     , CBS_m(cbs) {
00010     CBS_m=1;
00011     }
00012     
00013 // SPI 
00014 
00015 void ADXL362::init_spi(){
00016     // spi 8 bits, mode 0, 1 MHz for adxl362
00017     SPI_m.format(8,0);
00018     // 5 MHz, max for acc - works fine
00019     SPI_m.frequency(5000000);
00020 }
00021 
00022 
00023 
00024 void ADXL362::init_adxl362()
00025 {
00026     uint8_t reg;
00027     // reset the adxl362
00028     wait_ms(200);
00029     ACC_WriteReg(RESET, 0x52);
00030     wait_ms(200);
00031 
00032     // set FIFO
00033     ACC_WriteReg(FIFO_CTL,0x0A);  // stream mode, AH bit
00034 
00035 ///////////////////////////////////////////////////////////////////////////////////////
00036     reg = ACC_ReadReg(FILTER_CTL);  
00037     printf("1 ------------------Start : FILTER_CTL = 0x%X\r\n\n", reg);
00038     
00039 
00040 //    printf("2 ------------------Input : FILTER_CTL = 0x17\r\n");
00041     wait_ms(25);    
00042 
00043 ///////////////////////////////////////////////////////////////////////////////////////
00044 
00045     //ACC_WriteReg(FIFO_CTL,0x02);  // stream mode, no AH bit
00046     //reg = ACC_ReadReg(FIFO_CTL);
00047     //printf("FIFO_CTL = 0x%X\r\n", reg);
00048 
00049     // Not used but keep in case it is important to set FIFO parameters.
00050     //ACC_WriteReg(FIFO_SAM,SAMPLE_SET * 3);   // fifo depth
00051     //reg = ACC_ReadReg(FIFO_SAM);
00052     //pc.printf("FIFO_SAM = 0x%X\r\n", reg);
00053 
00054 
00055     printf("2 ------------------Connect accelerometer");
00056 
00057     while(reg != 0x17)
00058     {
00059         printf(" vib while...\n");
00060         
00061         // set adxl362 to 4g range, 25Hz
00062         //ACC_WriteReg(FILTER_CTL,0x51);
00063         // 2g, 25Hz
00064         ACC_WriteReg(FILTER_CTL,0x17);
00065         //reg = ACC_ReadReg(FILTER_CTL);
00066         //printf("FILTER_CTL = 0x%X\r\n", reg);
00067         
00068         reg = ACC_ReadReg(FILTER_CTL);
00069 
00070         if(reg == 0x17)
00071         {
00072             printf("  Success!!\n\n");
00073 //            printf("2 ------------------Output : FILTER_CTL = 0x%X\r\n\n\n", reg);
00074             }
00075         else
00076         {
00077             printf(".");
00078             }
00079         wait_ms(500);           
00080     }
00081  
00082     // map adxl362 interrupts
00083     //ACC_WriteReg(INTMAP1,0x01); //data ready
00084     ACC_WriteReg(INTMAP1,0x04); //watermark
00085     //reg = ACC_ReadReg(INTMAP1);
00086     //pc.printf("INTMAP1 = 0x%X\r\n", reg);
00087 
00088     // set adxl362 to measurement mode, ultralow noise
00089     ACC_WriteReg(POWER_CTL,0x22);
00090     //reg = ACC_ReadReg(POWER_CTL);
00091     //pc.printf("POWER_CTL = 0x%X\r\n", reg);
00092 }
00093 
00094 void ADXL362::ACC_GetXYZ16(int16_t* x16, int16_t* y16, int16_t* z16)
00095 {
00096     int8_t x8=0;
00097     int8_t y8=0;
00098     int8_t z8=0;
00099     
00100     CBS_m = DOWN;
00101     SPI_m.write(RD_SPI);
00102     
00103     SPI_m.write(0x0E);
00104     x8 = SPI_m.write(0x00);    
00105     *x16 = x8 << 0;    
00106     x8 = SPI_m.write(0x00);        
00107 //    *x16 |= x8 << 8; 
00108     *x16 = x8 << 8; 
00109     printf("[X Hex value]\n");
00110     printf("1. x8  : [%02X]\n", x8);
00111     printf("2. *x16 : [%04X]\n", *x16);
00112     
00113     printf("[X Decimal value]\n");
00114     printf("1. x8  : [%d]\n", x8);
00115     printf("2. *x16 : [%d]\n", *x16);
00116 
00117     y8 = SPI_m.write(0x00);    
00118     *y16 = y8 << 0;    
00119     y8 = SPI_m.write(0x00);    
00120 //    *y16 |= y8 << 8;
00121     *y16 = y8 << 8;
00122     printf("\n[Y Hex value]\n");
00123     printf("1. y8 : [%02X]\n", y8);
00124     printf("2. *y16 : [%04X]\n", *y16);
00125 
00126     z8 = SPI_m.write(0x00);
00127     *z16 = z8 << 0;
00128     z8 = SPI_m.write(0x00);
00129 //    *z16 |= z8 << 8;
00130     *z16 = z8 << 8;
00131     printf("\n[Z Hex value]\n");
00132     printf("1. z8 : [%02X]\n", z8);
00133     printf("2. *z16 : [%04X]\n", *z16);
00134     
00135     CBS_m = UP; 
00136 }
00137 
00138 void ADXL362::ACC_GetXYZ8(int8_t* x8, int8_t* y8, int8_t* z8)
00139 {
00140     
00141     CBS_m = DOWN;
00142     SPI_m.write(RD_SPI);
00143     //-> 레지스터 주소바꿈
00144     SPI_m.write(0x08);
00145     
00146     //-> 인자에 가속도 값 바로저장
00147     *x8 = SPI_m.write(0x00);
00148     *y8 = SPI_m.write(0x00);
00149     *z8 = SPI_m.write(0x00);
00150     
00151     CBS_m = UP; 
00152 }
00153 
00154 uint8_t ADXL362::ACC_ReadReg( uint8_t reg )
00155 {
00156     CBS_m = DOWN;
00157     SPI_m.write(RD_SPI);
00158     SPI_m.write(reg);
00159     uint8_t val = SPI_m.write(0x00);
00160     CBS_m = UP;
00161     return (val);
00162 }
00163 
00164 void ADXL362::ACC_WriteReg( uint8_t reg, uint8_t cmd )
00165 {
00166     CBS_m = DOWN;
00167     SPI_m.write(WR_SPI);
00168     SPI_m.write(reg);
00169     SPI_m.write(cmd);
00170     CBS_m = UP;
00171 }