Library DS2782 Stand-Alone Fuel Gauge IC
Embed:
(wiki syntax)
Show/hide line numbers
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*)®Address,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 }
Generated on Wed Aug 17 2022 10:58:41 by 1.7.2