Republished Library, to be refined for use with the SparkFun 9DOF in HARP project.
Fork of ADXL345 by
Diff: ADXL345.cpp
- Revision:
- 6:5fb29534a6cf
- Parent:
- 5:122a504fcfa3
- Child:
- 8:4cdd4315189f
--- a/ADXL345.cpp Sat Sep 29 14:15:24 2012 +0000 +++ b/ADXL345.cpp Thu Nov 01 15:54:31 2012 +0000 @@ -5,14 +5,14 @@ * today, religion is thought of as something that you do or believe and has about as * little impact on a person as their political stance. But for me, God gives me daily * strength and has filled my life with the satisfaction that I could never find in any - * of the other things that I once looked for it in. + * of the other things that I once looked for it in. * If your interested, heres verse that changed my life: * Rom 8:1-3: "Therefore, there is now no condemnation for those who are in Christ Jesus, * because through Christ Jesus, the law of the Spirit who gives life has set - * me free from the law of sin (which brings...) and death. For what the law + * me free from the law of sin (which brings...) and death. For what the law * was powerless to do in that it was weakened by the flesh, God did by sending * His own Son in the likeness of sinful flesh to be a sin offering. And so He - * condemned sin in the flesh in order that the righteous requirements of the + * condemned sin in the flesh in order that the righteous requirements of the * (God's) law might be fully met in us, who live not according to the flesh * but according to the Spirit." * @@ -45,8 +45,8 @@ * Datasheet: * * http://www.analog.com/static/imported-files/data_sheets/ADXL345.pdf - */ - + */ + /* * Includes */ @@ -54,57 +54,37 @@ //#include "mbed.h" -ADXL345::ADXL345(PinName sda, PinName scl) : i2c_(*(new I2C(sda, scl))) { +ADXL345::ADXL345(PinName sda, PinName scl) : i2c_(*(new I2C(sda, scl))) +{ myI2c = &i2c_; } -ADXL345::~ADXL345(){ +ADXL345::~ADXL345() +{ delete myI2c; } -void ADXL345::init(){ - - //400kHz, allowing us to use the fastest data rates. - //there are other chips on board, sorry - i2c_.frequency(100000); -// initialize the BW data rate - char tx[2]; - tx[0] = ADXL345_BW_RATE_REG; - tx[1] = ADXL345_1600HZ; //value greater than or equal to 0x0A is written into the rate bits (Bit D3 through Bit D0) in the BW_RATE register - i2c_.write( ADXL345_WRITE , tx, 2); +void ADXL345::init() +{ + // initialize the BW data rate + setDataRate(ADXL345_6HZ25); // 6.25 Hz -//Data format (for +-16g) - This is done by setting Bit D3 of the DATA_FORMAT register (Address 0x31) and writing a value of 0x03 to the range bits (Bit D1 and Bit D0) of the DATA_FORMAT register (Address 0x31). - - char rx[2]; - rx[0] = ADXL345_DATA_FORMAT_REG; - rx[1] = 0x0B; - // full res and +_16g - i2c_.write( ADXL345_WRITE , rx, 2); - - // Set Offset - programmed into the OFSX, OFSY, and OFXZ registers, respectively, as 0xFD, 0x03 and 0xFE. - char x[2]; - x[0] = ADXL345_OFSX_REG ; - x[1] = 0xFD; - i2c_.write( ADXL345_WRITE , x, 2); - char y[2]; - y[0] = ADXL345_OFSY_REG ; - y[1] = 0x03; - i2c_.write( ADXL345_WRITE , y, 2); - char z[2]; - z[0] = ADXL345_OFSZ_REG ; - z[1] = 0xFE; - i2c_.write( ADXL345_WRITE , z, 2); + //Data format (for +-16g) - This is done by setting Bit D3 of the DATA_FORMAT register (Address 0x31) + //and writing a value of 0x03 to the range bits (Bit D1 and Bit D0) of the DATA_FORMAT register (Address 0x31). + setDataFormatControl(ADXL345_FULL_RES | ADXL345_2G); // full resolution, right justified, 2g range + + // Set Offset - programmed into the OFSX, OFSY, and OFXZ registers, respectively, as 0xFD, 0x03 and 0xFE. } -char ADXL345::SingleByteRead(char address){ - char tx = address; - char output; +char ADXL345::SingleByteRead(char address) +{ + char tx = address; + char output; i2c_.write( ADXL345_WRITE , &tx, 1); //tell it what you want to read i2c_.read( ADXL345_READ , &output, 1); //tell it where to store the data return output; - } @@ -117,86 +97,88 @@ returns 0 on success (ack), or non-0 on failure (nack) */ -int ADXL345::SingleByteWrite(char address, char data){ - int ack = 0; - char tx[2]; - tx[0] = address; - tx[1] = data; - return ack | i2c_.write( ADXL345_WRITE , tx, 2); +int ADXL345::SingleByteWrite(char address, char data) +{ + int ack = 0; + char tx[2]; + tx[0] = address; + tx[1] = data; + return ack | i2c_.write( ADXL345_WRITE , tx, 2); } -void ADXL345::multiByteRead(char address, char* output, int size) { +void ADXL345::multiByteRead(char address, char* output, int size) +{ i2c_.write( ADXL345_WRITE, &address, 1); //tell it where to read from i2c_.read( ADXL345_READ , output, size); //tell it where to store the data read } -int ADXL345::multiByteWrite(char address, char* ptr_data, int size) { - int ack; - - ack = i2c_.write( ADXL345_WRITE, &address, 1); //tell it where to write to - return ack | i2c_.write( ADXL345_READ, ptr_data, size); //tell it what data to write - +int ADXL345::multiByteWrite(char address, char* ptr_data, int size) +{ + int ack; + + ack = i2c_.write( ADXL345_WRITE, &address, 1); //tell it where to write to + return ack | i2c_.write( ADXL345_READ, ptr_data, size); //tell it what data to write + } -void ADXL345::getOutput(int* readings){ - char buffer[6]; +void ADXL345::getOutput(int* readings) +{ + char buffer[6]; multiByteRead(ADXL345_DATAX0_REG, buffer, 6); - + readings[0] = wordExtend(&buffer[0]); readings[1] = wordExtend(&buffer[2]); readings[2] = wordExtend(&buffer[4]); } - - -char ADXL345::getDeviceID() { +char ADXL345::getDeviceID() +{ return SingleByteRead(ADXL345_DEVID_REG); - } +} // -int ADXL345::setPowerMode(char mode) { - +int ADXL345::setPowerMode(char mode) +{ //Get the current register contents, so we don't clobber the rate value. char registerContents = (mode << 4) | SingleByteRead(ADXL345_BW_RATE_REG); - return SingleByteWrite(ADXL345_BW_RATE_REG, registerContents); - + return SingleByteWrite(ADXL345_BW_RATE_REG, registerContents); } -char ADXL345::getPowerControl() { +char ADXL345::getPowerControl() +{ return SingleByteRead(ADXL345_POWER_CTL_REG); } -int ADXL345::setPowerControl(char settings) { +int ADXL345::setPowerControl(char settings) +{ return SingleByteWrite(ADXL345_POWER_CTL_REG, settings); } - - -char ADXL345::getDataFormatControl(void){ - +char ADXL345::getDataFormatControl(void) +{ return SingleByteRead(ADXL345_DATA_FORMAT_REG); } -int ADXL345::setDataFormatControl(char settings){ - - return SingleByteWrite(ADXL345_DATA_FORMAT_REG, settings); - +int ADXL345::setDataFormatControl(char settings) +{ + return SingleByteWrite(ADXL345_DATA_FORMAT_REG, settings); } -int ADXL345::setDataFormatControl(char settings, char mask, char *prev){ +int ADXL345::setDataFormatControl(char settings, char mask, char *prev) +{ char old = SingleByteRead(ADXL345_DATA_FORMAT_REG); if(prev) *prev = old; return SingleByteWrite(ADXL345_DATA_FORMAT_REG, (old | (settings & mask)) & (settings | ~mask)); } -int ADXL345::setDataRate(char rate) { - +int ADXL345::setDataRate(char rate) +{ //Get the current register contents, so we don't clobber the power bit. char registerContents = SingleByteRead(ADXL345_BW_RATE_REG); @@ -204,12 +186,11 @@ registerContents |= rate; return SingleByteWrite(ADXL345_BW_RATE_REG, registerContents); - } -char ADXL345::getOffset(char axis) { - +char ADXL345::getOffset(char axis) +{ char address = 0; if (axis == ADXL345_X) { @@ -220,11 +201,11 @@ address = ADXL345_OFSZ_REG; } - return SingleByteRead(address); + return SingleByteRead(address); } -int ADXL345::setOffset(char axis, char offset) { - +int ADXL345::setOffset(char axis, char offset) +{ char address = 0; if (axis == ADXL345_X) { @@ -235,206 +216,181 @@ address = ADXL345_OFSZ_REG; } - return SingleByteWrite(address, offset); - -} - - -char ADXL345::getFifoControl(void){ - - return SingleByteRead(ADXL345_FIFO_CTL); - -} - -int ADXL345::setFifoControl(char settings){ - return SingleByteWrite(ADXL345_FIFO_STATUS, settings); - -} - -char ADXL345::getFifoStatus(void){ - - return SingleByteRead(ADXL345_FIFO_STATUS); - -} - - - -char ADXL345::getTapThreshold(void) { - - return SingleByteRead(ADXL345_THRESH_TAP_REG); -} - -int ADXL345::setTapThreshold(char threshold) { - - return SingleByteWrite(ADXL345_THRESH_TAP_REG, threshold); - + return SingleByteWrite(address, offset); } -float ADXL345::getTapDuration(void) { +char ADXL345::getFifoControl(void) +{ + return SingleByteRead(ADXL345_FIFO_CTL); +} + +int ADXL345::setFifoControl(char settings) +{ + return SingleByteWrite(ADXL345_FIFO_STATUS, settings); +} +char ADXL345::getFifoStatus(void) +{ + return SingleByteRead(ADXL345_FIFO_STATUS); +} + +char ADXL345::getTapThreshold(void) +{ + return SingleByteRead(ADXL345_THRESH_TAP_REG); +} + +int ADXL345::setTapThreshold(char threshold) +{ + return SingleByteWrite(ADXL345_THRESH_TAP_REG, threshold); +} + +float ADXL345::getTapDuration(void) +{ return (float)SingleByteRead(ADXL345_DUR_REG)*625; } -int ADXL345::setTapDuration(short int duration_us) { - +int ADXL345::setTapDuration(short int duration_us) +{ short int tapDuration = duration_us / 625; char tapChar[2]; - tapChar[0] = (tapDuration & 0x00FF); - tapChar[1] = (tapDuration >> 8) & 0x00FF; + tapChar[0] = (tapDuration & 0x00FF); + tapChar[1] = (tapDuration >> 8) & 0x00FF; return multiByteWrite(ADXL345_DUR_REG, tapChar, 2); - } -float ADXL345::getTapLatency(void) { - +float ADXL345::getTapLatency(void) +{ return (float)SingleByteRead(ADXL345_LATENT_REG)*1.25; } -int ADXL345::setTapLatency(short int latency_ms) { - +int ADXL345::setTapLatency(short int latency_ms) +{ latency_ms = latency_ms / 1.25; char latChar[2]; - latChar[0] = (latency_ms & 0x00FF); - latChar[1] = (latency_ms << 8) & 0xFF00; + latChar[0] = (latency_ms & 0x00FF); + latChar[1] = (latency_ms << 8) & 0xFF00; return multiByteWrite(ADXL345_LATENT_REG, latChar, 2); - } -float ADXL345::getWindowTime(void) { - +float ADXL345::getWindowTime(void) +{ return (float)SingleByteRead(ADXL345_WINDOW_REG)*1.25; } -int ADXL345::setWindowTime(short int window_ms) { - +int ADXL345::setWindowTime(short int window_ms) +{ window_ms = window_ms / 1.25; char windowChar[2]; windowChar[0] = (window_ms & 0x00FF); windowChar[1] = ((window_ms << 8) & 0xFF00); - return multiByteWrite(ADXL345_WINDOW_REG, windowChar, 2); - + return multiByteWrite(ADXL345_WINDOW_REG, windowChar, 2); } -char ADXL345::getActivityThreshold(void) { - +char ADXL345::getActivityThreshold(void) +{ return SingleByteRead(ADXL345_THRESH_ACT_REG); } -int ADXL345::setActivityThreshold(char threshold) { +int ADXL345::setActivityThreshold(char threshold) +{ return SingleByteWrite(ADXL345_THRESH_ACT_REG, threshold); - } -char ADXL345::getInactivityThreshold(void) { +char ADXL345::getInactivityThreshold(void) +{ return SingleByteRead(ADXL345_THRESH_INACT_REG); - } //int FUNCTION(short int * ptr_Output) //short int FUNCTION () -int ADXL345::setInactivityThreshold(char threshold) { +int ADXL345::setInactivityThreshold(char threshold) +{ return SingleByteWrite(ADXL345_THRESH_INACT_REG, threshold); - } -char ADXL345::getTimeInactivity(void) { - +char ADXL345::getTimeInactivity(void) +{ return SingleByteRead(ADXL345_TIME_INACT_REG); - } -int ADXL345::setTimeInactivity(char timeInactivity) { +int ADXL345::setTimeInactivity(char timeInactivity) +{ return SingleByteWrite(ADXL345_TIME_INACT_REG, timeInactivity); - } -char ADXL345::getActivityInactivityControl(void) { - +char ADXL345::getActivityInactivityControl(void) +{ return SingleByteRead(ADXL345_ACT_INACT_CTL_REG); - } -int ADXL345::setActivityInactivityControl(char settings) { +int ADXL345::setActivityInactivityControl(char settings) +{ return SingleByteWrite(ADXL345_ACT_INACT_CTL_REG, settings); - } -char ADXL345::getFreefallThreshold(void) { - +char ADXL345::getFreefallThreshold(void) +{ return SingleByteRead(ADXL345_THRESH_FF_REG); - } -int ADXL345::setFreefallThreshold(char threshold) { - return SingleByteWrite(ADXL345_THRESH_FF_REG, threshold); - +int ADXL345::setFreefallThreshold(char threshold) +{ + return SingleByteWrite(ADXL345_THRESH_FF_REG, threshold); } -char ADXL345::getFreefallTime(void) { - +char ADXL345::getFreefallTime(void) +{ return SingleByteRead(ADXL345_TIME_FF_REG)*5; - } -int ADXL345::setFreefallTime(short int freefallTime_ms) { - freefallTime_ms = freefallTime_ms / 5; - char fallChar[2]; - fallChar[0] = (freefallTime_ms & 0x00FF); - fallChar[1] = (freefallTime_ms << 8) & 0xFF00; - +int ADXL345::setFreefallTime(short int freefallTime_ms) +{ + freefallTime_ms = freefallTime_ms / 5; + char fallChar[2]; + fallChar[0] = (freefallTime_ms & 0x00FF); + fallChar[1] = (freefallTime_ms << 8) & 0xFF00; + return multiByteWrite(ADXL345_TIME_FF_REG, fallChar, 2); - } -char ADXL345::getTapAxisControl(void) { - +char ADXL345::getTapAxisControl(void) +{ return SingleByteRead(ADXL345_TAP_AXES_REG); - } -int ADXL345::setTapAxisControl(char settings) { - return SingleByteWrite(ADXL345_TAP_AXES_REG, settings); - +int ADXL345::setTapAxisControl(char settings) +{ + return SingleByteWrite(ADXL345_TAP_AXES_REG, settings); } -char ADXL345::getTapSource(void) { - +char ADXL345::getTapSource(void) +{ return SingleByteRead(ADXL345_ACT_TAP_STATUS_REG); - } - - -char ADXL345::getInterruptEnableControl(void) { - +char ADXL345::getInterruptEnableControl(void) +{ return SingleByteRead(ADXL345_INT_ENABLE_REG); - } -int ADXL345::setInterruptEnableControl(char settings) { - return SingleByteWrite(ADXL345_INT_ENABLE_REG, settings); - +int ADXL345::setInterruptEnableControl(char settings) +{ + return SingleByteWrite(ADXL345_INT_ENABLE_REG, settings); } -char ADXL345::getInterruptMappingControl(void) { - +char ADXL345::getInterruptMappingControl(void) +{ return SingleByteRead(ADXL345_INT_MAP_REG); - } -int ADXL345::setInterruptMappingControl(char settings) { +int ADXL345::setInterruptMappingControl(char settings) +{ return SingleByteWrite(ADXL345_INT_MAP_REG, settings); - } -char ADXL345::getInterruptSource(void){ - +char ADXL345::getInterruptSource(void) +{ return SingleByteRead(ADXL345_INT_SOURCE_REG); - -} - - - - +} \ No newline at end of file