Library DS2782 Stand-Alone Fuel Gauge IC
Diff: ds2782.cpp
- Revision:
- 0:e6d413e57654
- Child:
- 1:7cd80eb4df4c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ds2782.cpp Sun Nov 30 23:23:42 2014 +0000 @@ -0,0 +1,106 @@ +#include "ds2782.h" + + +DS2782::DS2782(PinName sda, PinName scl,int i2cFrequencyHz,uint8_t address):mI2c(sda,scl),mI2cAddr(address){ + + mI2c.frequency(i2cFrequencyHz); + mTemperature=0; +} + + +bool DS2782::initDS2782(void){ + + return true; +} + +//write data to the sensor +bool DS2782::write(uint8_t regAddress, uint8_t* data,int dataLength) +{ + uint8_t tempBuf[dataLength+1]; + tempBuf[0]=regAddress; + memcpy(&(tempBuf[1]),data,dataLength); + return mI2c.write(mI2cAddr,(char*)tempBuf,dataLength+1)==0; + +} + +//read data from the sensor +bool DS2782::read(uint8_t regAddress, uint8_t *data,int dataLength) +{ + mI2c.write(mI2cAddr,(char*)®Address,1,true); + return (mI2c.read(mI2cAddr,(char*)data,dataLength)==0); +} + +bool DS2782::readTemperature(void) +{ + uint8_t rawData[2]; + uint16_t rawTemp=0; + if(!read(TEMP_MSB_REG, rawData,2)) return false; + rawTemp= (((rawData[0]&~(1<<7))<<3)|((rawData[1]>>5)&0xF)); + mTemperature = (float)(rawTemp*0.125); + return true; +} + +float DS2782::getTemperature(void) +{ + return mTemperature; +} + + +bool DS2782::readCurrent(void){ + + uint8_t rawData[2]; + uint16_t rawRes=0; + if(!read(CURRENT_MSB_REG, rawData,2)) return false; + rawRes= get16BitData(rawData[0],rawData[1]); + //rawRes&=~(1<<15); + if(rawRes &0x8000){ + mCurrent = (float)(rawRes-65536)*0.07813; + } + else + //mCurrent = (float)(rawRes-32768)*0.07813; + mCurrent = (float)(rawRes)*0.07813; + return true; +} + +float DS2782::getCurrent(void) +{ + return mCurrent; +} + + + +bool DS2782::readVoltage(void){ + + uint8_t rawData[2]; + uint16_t rawVolt=0; + if(!read(VOLT_MSB_REG, rawData,2)) return false; + rawVolt= (((rawData[0]&~(1<<7))<<3)|((rawData[1]>>5)&0xF)); + mVoltage= (float)(rawVolt*4.88); + return true; +} + +float DS2782::getVoltage(void) +{ + return mVoltage; +} + + + + + +float DS2782::readTest(void){ + + uint8_t rawData[2]; + uint16_t rawRes=0; + /*if(!read(ACR_MSB_REG, rawData,2)) return false; + rawRes= get16BitData(rawData[0],rawData[1]); + */ + /*if(rawRes &0x8000){ + return ((float)(rawRes-65536)*0.07813); + } + else + */ + if(!read(RARC_REG, rawData,1)) return false; + rawRes= get16BitData(rawData[0],rawData[1]); + return ((float)(rawData[0]*0.3906)); +}