base program for tilt measurement
Fork of COG4050_adxl355_adxl357 by
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 }
Generated on Thu Jul 14 2022 08:16:02 by 1.7.2