Library DS2782 Stand-Alone Fuel Gauge IC

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ds2782.cpp Source File

ds2782.cpp

00001 #include "ds2782.h"
00002 
00003 
00004 DS2782::DS2782(PinName sda, PinName scl,int i2cFrequencyHz,uint8_t address):mI2c(sda,scl),mI2cAddr(address){
00005     
00006     mI2c.frequency(i2cFrequencyHz);
00007     mTemperature=0;
00008     //initDS2782();
00009     //setACRRegister(0xffff);  //to clear flags
00010 }   
00011     
00012     
00013 bool DS2782::initDS2782(void){
00014      
00015      uint16_t full40Reg = 0x3200;
00016      uint8_t buf[2];
00017      fillBuf(full40Reg, buf);
00018      setEepromBlockRegister(FULL_40_MSB,buf, 2);
00019     
00020      buf[0]= 0xD5;
00021      setEepromBlockRegister(VCHG,buf, 1);
00022      
00023      buf[0]=0x14;
00024      setEepromBlockRegister(IMIN,buf,1);
00025      
00026      buf[0]=0xB3;
00027      setEepromBlockRegister(VAE,buf,1);
00028      
00029      buf[0]=0x0a;
00030      setEepromBlockRegister(IAE,buf,1);
00031      
00032      buf[0]=0x06;
00033      setEepromBlockRegister(ACTIVE_EMPTY_40,buf,1);
00034      
00035      //fillBuf(full40Reg, buf);
00036      //setEepromBlockRegister(RSGAIN_MSB,buf,2);
00037      
00038      buf[0]=0;
00039      setEepromBlockRegister(RSTC,buf,1);
00040      
00041      buf[0]=0x32;
00042      setEepromBlockRegister(RSNSP,buf,1);
00043      
00044      buf[0]=0;
00045      setEepromBlockRegister(AB,buf,1);
00046      
00047      
00048      return true;
00049 }
00050 
00051 //write data to the sensor
00052 bool DS2782::write(uint8_t regAddress, uint8_t* data,int dataLength)
00053 {
00054     uint8_t tempBuf[dataLength+1];
00055     tempBuf[0]=regAddress;
00056     memcpy(&(tempBuf[1]),data,dataLength);
00057     return mI2c.write(mI2cAddr,(char*)tempBuf,dataLength+1)==0;
00058 
00059 }
00060 
00061 //read data from the sensor
00062 bool DS2782::read(uint8_t regAddress, uint8_t *data,int dataLength)
00063 {
00064     mI2c.write(mI2cAddr,(char*)&regAddress,1,true);
00065     return (mI2c.read(mI2cAddr,(char*)data,dataLength)==0);
00066 }
00067 
00068 bool DS2782::readTemperature(void)
00069 {  
00070    uint8_t rawData[2];
00071    uint16_t rawTemp=0;
00072    if(!read(TEMP_MSB_REG, rawData,2)) return false;
00073       rawTemp= (((rawData[0]&~(1<<7))<<3)|((rawData[1]>>5)&0xF));
00074       mTemperature = (float)(rawTemp*0.125);
00075    return true;
00076 }
00077 
00078 float DS2782::getTemperature(void)
00079 {
00080     return mTemperature;
00081 }
00082 
00083 
00084 bool DS2782::readCurrent(void){
00085 
00086    uint8_t rawData[2];
00087    uint16_t rawRes=0;
00088    if(!read(CURRENT_MSB_REG, rawData,2)) return false;
00089       rawRes= get16BitData(rawData[0],rawData[1]);
00090       //rawRes&=~(1<<15);
00091     if(rawRes &0x8000){
00092       mCurrent = (float)(rawRes-65536)*0.07813;
00093     }
00094     else 
00095       //mCurrent = (float)(rawRes-32768)*0.07813;
00096       mCurrent = (float)(rawRes)*0.07813;
00097    return true;
00098 }
00099 
00100 float DS2782::getCurrent(void)
00101 {
00102     return mCurrent;
00103 }
00104 
00105 
00106 
00107 bool DS2782::readVoltage(void){
00108 
00109    uint8_t rawData[2];
00110    uint16_t rawVolt=0;
00111    if(!read(VOLT_MSB_REG, rawData,2)) return false;
00112       rawVolt= (((rawData[0]&~(1<<7))<<3)|((rawData[1]>>5)&0xF));
00113       mVoltage= (float)(rawVolt*4.88);
00114    return true;
00115 }
00116 
00117 float DS2782::getVoltage(void)
00118 {
00119     return mVoltage;
00120 }
00121 
00122 
00123 bool DS2782::setACRRegister(uint16_t reg)
00124 {    
00125     uint8_t buf[2];
00126     buf[0]= ((reg>>8)&0xFF);
00127     buf[1]= ((reg)&0xFF);
00128     if(!(write(ACR_MSB_REG, buf,2))) return false;
00129     return true;        
00130 }
00131 
00132 
00133 float DS2782::readAcrReg(void){
00134 
00135    uint8_t rawData[2];
00136    uint16_t rawRes=0;
00137    if(!read(ACR_MSB_REG, rawData,2)) return false;
00138       rawRes= get16BitData(rawData[0],rawData[1]);
00139       
00140     if(rawRes &0x8000){
00141       return ((float)(rawRes-65536)*1.5625);
00142     }
00143     else 
00144       return ((float)(rawRes)*1.5625);
00145 }
00146 
00147 
00148 bool DS2782::setEepromBlockRegister(ParamEepromReg reg, uint8_t * value, uint8_t length){
00149     uint8_t buf[length];
00150     memcpy(buf,value,length);
00151     if(!(write(reg, buf,length))) return false;
00152     return true; 
00153     
00154 }
00155 
00156 uint8_t DS2782::readRarcReg(void){
00157     uint8_t rarcRegVal;  //unit [%]
00158     if(!read(RARC_REG, &rarcRegVal,1)) return 255;    
00159     return rarcRegVal;
00160 }
00161 
00162 
00163 uint8_t DS2782::readStatusReg(void){
00164     uint8_t statusRegVal;
00165     if(!read(STATUS, &statusRegVal,1)) return 255;    
00166     return statusRegVal;
00167     
00168 }