Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
