valeria toffoli / Mbed OS COG4050_adxrs290_adxrs453

Dependencies:   COG4050_ADT7420

Fork of COG4050_adxl355_adxl357-ver2 by ADI_CAC

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ADXRS290.cpp Source File

ADXRS290.cpp

00001 #include <stdint.h>
00002 #include "mbed.h"
00003 #include "ADXRS290.h"
00004 
00005 /** ----------------------------------- */
00006 /** SPI - MAX 5MHZ                      */
00007 /** ----------------------------------- */
00008 ADXRS290::ADXRS290(PinName cs_pin, PinName MOSI, PinName MISO, PinName SCK): adxrs290(MOSI, MISO, SCK), cs(cs_pin)
00009 {
00010     cs = 1;
00011     adxrs290.format(8,_SPI_MODE);
00012     adxrs290.lock();
00013 }
00014 void ADXRS290::frequency(int hz)
00015 {
00016     adxrs290.frequency(hz);
00017 }
00018 
00019 /** ----------------------------------- */
00020 /** Writes the reg register with data   */
00021 /** ----------------------------------- */
00022 void ADXRS290::write_reg(ADXRS290_register_t reg, uint8_t data){
00023     adxrs290.format(8, _SPI_MODE);
00024     cs = false;
00025     adxrs290.write(static_cast<uint8_t>(reg) | _WRITE_REG_CMD);
00026     adxrs290.write(data);
00027     cs = true;
00028 }
00029 /** ----------------------------------- */
00030 /** Reads the reg register              */
00031 /** ----------------------------------- */
00032 uint8_t ADXRS290::read_reg(ADXRS290_register_t reg){
00033     uint8_t ret_val;
00034     adxrs290.format(8, _SPI_MODE);
00035     cs = false;
00036     adxrs290.write(static_cast<uint8_t>(reg) | _READ_REG_CMD);
00037     ret_val = adxrs290.write(_DUMMY_BYTE);
00038     cs = true;
00039     return ret_val;
00040 }
00041 uint16_t ADXRS290::read_reg_u16(ADXRS290_register_t reg){
00042     uint16_t ret_val = 0;
00043     adxrs290.format(8, _SPI_MODE);
00044     cs = false;
00045     adxrs290.write(static_cast<uint8_t>(reg) | _READ_REG_CMD);
00046     ret_val = adxrs290.write(_DUMMY_BYTE);
00047     ret_val = (ret_val) | (adxrs290.write(_DUMMY_BYTE)<<8);
00048     cs = true;
00049     return ret_val;
00050 }
00051 /** ----------------------------------- */
00052 /** Sets the CTL registers              */
00053 /** ----------------------------------- */    
00054 void ADXRS290::set_power_ctl_reg(uint8_t data){
00055     write_reg(POWER_CTL, data);
00056     wait(0.1);
00057 }
00058 void ADXRS290::set_filter_ctl_reg(ADXRS290_filter_ctl_t hpf, ADXRS290_filter_ctl_t lpf){
00059     write_reg(FILTER, hpf|lpf);
00060 }
00061 void ADXRS290::set_sync(ADXRS290_dataready_ctl_t data){
00062     }
00063 /** ----------------------------------- */
00064 /** READ data registers              */
00065 /** ----------------------------------- */ 
00066 uint16_t ADXRS290::scanx(){    
00067     return read_reg_u16(DATAX0);
00068 }
00069 uint16_t ADXRS290::scany(){
00070     return read_reg_u16(DATAY0);
00071 }
00072 uint16_t ADXRS290::scant(){
00073     return read_reg_u16(TEMP0);
00074 }    
00075 ADXRS290::ADXRS290_rate_t ADXRS290::scan(){
00076     uint16_t datax, datay, dataz;
00077     ADXRS290_rate_t res;
00078     // multiple byte read procedure
00079     adxrs290.format(8, _SPI_MODE);
00080     cs = false;
00081     adxrs290.write(static_cast<uint8_t>(DATAX0) | _READ_REG_CMD);
00082     datax = adxrs290.write(_DUMMY_BYTE);
00083     datax = (datax) | (adxrs290.write(_DUMMY_BYTE)<<8);
00084     datay = adxrs290.write(_DUMMY_BYTE);
00085     datay = (datay) | (adxrs290.write(_DUMMY_BYTE)<<8);
00086     dataz = adxrs290.write(_DUMMY_BYTE);
00087     dataz = (dataz) | (adxrs290.write(_DUMMY_BYTE)<<8);
00088     cs = true;
00089     // 2s compl conversion
00090     if ((datax & 0x8000) == 0) {res.rt_x=float(datax);}
00091     else{res.rt_x=float((~(datax - 0x01)) & 0xffff) * -1;}
00092     if ((datay & 0x8000) == 0) {res.rt_y=float(datay);}
00093     else{res.rt_y=float((~(datay - 0x01)) & 0xffff) * -1;}
00094     if ((dataz & 0x8000) == 0) {res.rt_z=float(dataz);}
00095     else{res.rt_z=float((~(dataz - 0x01)) & 0xffff) * -1;}
00096     return res;
00097 }