base program for tilt measurement

Dependencies:   COG4050_ADT7420

Fork of COG4050_adxl355_adxl357 by ADI_CAC

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ADXL355.cpp Source File

ADXL355.cpp

00001 #include <stdint.h>
00002 #include "mbed.h"
00003 #include "ADXL355.h"
00004 
00005 
00006 //DigitalOut(cs);                  ///< DigitalOut instance for the chipselect of the ADXL
00007 //DigitalOut int1;                ///< DigitalOut instance for the chipselect of the ADXL
00008 //DigitalOut int2;                ///< DigitalOut instance for the chipselect of the ADXL
00009 
00010 ADXL355::ADXL355(PinName cs_pin, PinName MOSI, PinName MISO, PinName SCK): adxl355(MOSI, MISO, SCK), cs(cs_pin)
00011 {
00012     cs = 1;
00013     adxl355.format(8,_SPI_MODE);
00014     adxl355.lock();
00015 }
00016 
00017 /** SPI bus frequency   */
00018 void ADXL355::frequency(int hz)
00019 {
00020     adxl355.frequency(hz);
00021 }
00022 
00023 /**  Software resets    */
00024 void ADXL355::reset(void)
00025 {
00026     adxl355.format(8, _SPI_MODE);
00027     cs = false;
00028     // Writing Code 0x52 (representing the letter, R, in ASCII or unicode) to this register immediately resets the ADXL362.
00029     write_reg(RESET, _RESET);
00030     cs = true;
00031 }
00032 /** ----------------------------------- */
00033 /** Writes the reg register with data   */
00034 /** ----------------------------------- */
00035 void ADXL355::write_reg(ADXL355_register_t reg, uint8_t data)
00036 {
00037     adxl355.format(8, _SPI_MODE);
00038     cs = false;
00039     adxl355.write(static_cast<uint8_t>(reg<<1) | _WRITE_REG_CMD);
00040     adxl355.write(data);
00041     cs = true;
00042 }
00043 void ADXL355::write_reg_u16(ADXL355_register_t reg, uint16_t data)
00044 {
00045     adxl355.format(8, _SPI_MODE);
00046     cs = false;
00047     adxl355.write(static_cast<uint8_t>(reg<<1) | _WRITE_REG_CMD);
00048     adxl355.write(static_cast<uint8_t>(data & 0xff));
00049     adxl355.write(static_cast<uint8_t>((data & 0xff00) >> 8));
00050     cs = true;
00051 }
00052 /** ----------------------------------- */
00053 /** Reads the reg register              */
00054 /** ----------------------------------- */
00055 uint8_t ADXL355::read_reg(ADXL355_register_t reg)
00056 {
00057     uint8_t ret_val;
00058     adxl355.format(8, _SPI_MODE);
00059     cs = false;
00060     adxl355.write(static_cast<uint8_t>(reg<<1) | _READ_REG_CMD);
00061     ret_val = adxl355.write(_DUMMY_BYTE);
00062     cs = true;
00063     return ret_val;
00064 }
00065 uint16_t ADXL355::read_reg_u16(ADXL355_register_t reg){
00066     uint16_t ret_val = 0;
00067     adxl355.format(8, _SPI_MODE);
00068     cs = false;
00069     adxl355.write(static_cast<uint8_t>(reg<<1) | _READ_REG_CMD);
00070     ret_val = adxl355.write(_DUMMY_BYTE);
00071     ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE);
00072     cs = true;
00073     return ret_val;
00074 }
00075 uint32_t ADXL355::read_reg_u32(ADXL355_register_t reg){
00076     uint32_t ret_val = 0;
00077     adxl355.format(8, _SPI_MODE);
00078     cs = false;
00079     adxl355.write((reg<<1) | _READ_REG_CMD);
00080     ret_val = adxl355.write(_DUMMY_BYTE);
00081     ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE);
00082     ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE);
00083     cs = true;
00084     return ret_val;
00085 }
00086 /** ----------------------------------- */
00087 /** Sets the CTL registers              */
00088 /** ----------------------------------- */
00089 void ADXL355::set_power_ctl_reg(uint8_t data){
00090      write_reg(POWER_CTL, data);
00091 }
00092 void ADXL355::set_filter_ctl_reg(ADXL355_filter_ctl_t hpf, ADXL355_filter_ctl_t odr){
00093     write_reg(FILTER, static_cast<uint8_t>(hpf|odr));
00094 }
00095 void ADXL355::set_clk(ADXL355_sync_ctl_t data) {
00096     write_reg(SYNC, static_cast<uint8_t>(data));
00097 }
00098 void ADXL355::set_device(ADXL355_range_ctl_t range) {
00099     write_reg(RANGE, static_cast<uint8_t>(range));
00100 }
00101 /** ----------------------------------- */
00102 /** Read the STATUS registers           */
00103 /** ----------------------------------- */
00104 uint8_t ADXL355::read_status(){
00105     return read_reg(STATUS);
00106 }
00107 /** ----------------------------------- */
00108 /** ADXL must be set in measurement     */
00109 /** mode to read the data registers     */
00110 /** ----------------------------------- */
00111 uint32_t ADXL355::scanx(){
00112     return read_reg_u32(XDATA3);
00113 }
00114 uint32_t ADXL355::scany(){
00115     return read_reg_u32(YDATA3);
00116 }
00117 uint32_t ADXL355::scanz(){
00118     return read_reg_u32(ZDATA3);
00119 }
00120 uint16_t ADXL355::scant(){
00121     return read_reg_u16(TEMP2);
00122 }
00123 /** ----------------------------------- */
00124 /** ----------------------------------- */
00125 void ADXL355::set_activity_axis(ADXL355_act_ctl_t axis) {}
00126 void ADXL355::set_activity_cnt(uint8_t count) {}
00127 void ADXL355::set_activity_threshold(uint8_t data_h, uint8_t data_l) {
00128     uint16_t ret_val = static_cast<uint16_t>((data_h<<8)|data_l);
00129     write_reg_u16(ACT_THRESH_H, ret_val);
00130 }
00131 void ADXL355::set_inactivity() {}
00132 /** ----------------------------------- */
00133 /** ----------------------------------- */
00134 void ADXL355::set_interrupt1_pin(PinName in, ADXL355_intmap_ctl_t mode) {}
00135 void ADXL355::set_interrupt2_pin(PinName in, ADXL355_intmap_ctl_t mode) {}
00136 void ADXL355::enable_interrupt1() {}
00137 void ADXL355::enable_interrupt2() {}
00138 void ADXL355::disable_interrupt1() {}
00139 void ADXL355::disable_interrupt2() {}
00140 void ADXL355::set_polling_interrupt1_pin(uint8_t data) {}
00141 void ADXL355::set_polling_interrupt2_pin(uint8_t data) {}
00142 bool get_int1() {}
00143 bool get_int2() {}
00144 /** ----------------------------------- */
00145 /** FIFO set up and read operation      */
00146 /** ----------------------------------- */
00147 uint8_t ADXL355::fifo_read_nr_of_entries(){
00148     return read_reg(FIFO_ENTRIES);
00149 }
00150 void ADXL355::fifo_setup(uint8_t nr_of_entries){
00151     if (nr_of_entries > 0x60) {
00152         nr_of_entries = nr_of_entries;
00153     }
00154     write_reg(FIFO_SAMPLES, nr_of_entries);
00155 }    
00156 uint32_t ADXL355::fifo_read_u32() {
00157     uint32_t ret_val = 0;
00158     adxl355.format(8, _SPI_MODE);
00159     cs = false;
00160     adxl355.write(_READ_FIFO_CMD);
00161     ret_val = adxl355.write(_DUMMY_BYTE);
00162     ret_val = (ret_val<<8) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE));
00163     ret_val = (ret_val<<4) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)>>4);
00164     cs = true;
00165     return ret_val;
00166     }
00167 uint64_t ADXL355::fifo_scan() {
00168     uint64_t ret_val = 0;
00169     uint32_t x = 0, y = 0, z = 0, dummy;
00170     adxl355.format(8, _SPI_MODE);
00171     cs = false;
00172     adxl355.write(_READ_FIFO_CMD);
00173     for(uint8_t i = 0; i < 3; i++) {
00174         dummy = adxl355.write(_DUMMY_BYTE);
00175         dummy = (dummy<<8) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE));
00176         dummy = (dummy<<4) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)>>4);
00177         dummy = dummy & 0xffff;
00178         switch(i) {
00179             case 0: // x
00180                 x = dummy;
00181                 break;
00182             case 1: // y
00183                 y = dummy;
00184                 break;
00185             case 2: // z
00186                 z = dummy;
00187                 break;
00188         }
00189     } 
00190     cs = true;
00191     // format (24)xx(24)yy(24)zz
00192     ret_val = static_cast<uint64_t> (x) << 48;
00193     ret_val |= static_cast<uint64_t>(y) << 24;
00194     ret_val |= static_cast<uint64_t>(z) ;
00195     return ret_val;
00196     }