Library DS2782 Stand-Alone Fuel Gauge IC

Committer:
igbt6
Date:
Wed Dec 17 21:14:59 2014 +0000
Revision:
1:7cd80eb4df4c
Parent:
0:e6d413e57654
Library for DS2782 Stand-Alone Fuel Gauge IC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igbt6 0:e6d413e57654 1 #include "ds2782.h"
igbt6 0:e6d413e57654 2
igbt6 0:e6d413e57654 3
igbt6 0:e6d413e57654 4 DS2782::DS2782(PinName sda, PinName scl,int i2cFrequencyHz,uint8_t address):mI2c(sda,scl),mI2cAddr(address){
igbt6 0:e6d413e57654 5
igbt6 0:e6d413e57654 6 mI2c.frequency(i2cFrequencyHz);
igbt6 0:e6d413e57654 7 mTemperature=0;
igbt6 1:7cd80eb4df4c 8 //initDS2782();
igbt6 1:7cd80eb4df4c 9 //setACRRegister(0xffff); //to clear flags
igbt6 0:e6d413e57654 10 }
igbt6 0:e6d413e57654 11
igbt6 0:e6d413e57654 12
igbt6 0:e6d413e57654 13 bool DS2782::initDS2782(void){
igbt6 0:e6d413e57654 14
igbt6 1:7cd80eb4df4c 15 uint16_t full40Reg = 0x3200;
igbt6 1:7cd80eb4df4c 16 uint8_t buf[2];
igbt6 1:7cd80eb4df4c 17 fillBuf(full40Reg, buf);
igbt6 1:7cd80eb4df4c 18 setEepromBlockRegister(FULL_40_MSB,buf, 2);
igbt6 1:7cd80eb4df4c 19
igbt6 1:7cd80eb4df4c 20 buf[0]= 0xD5;
igbt6 1:7cd80eb4df4c 21 setEepromBlockRegister(VCHG,buf, 1);
igbt6 1:7cd80eb4df4c 22
igbt6 1:7cd80eb4df4c 23 buf[0]=0x14;
igbt6 1:7cd80eb4df4c 24 setEepromBlockRegister(IMIN,buf,1);
igbt6 1:7cd80eb4df4c 25
igbt6 1:7cd80eb4df4c 26 buf[0]=0xB3;
igbt6 1:7cd80eb4df4c 27 setEepromBlockRegister(VAE,buf,1);
igbt6 1:7cd80eb4df4c 28
igbt6 1:7cd80eb4df4c 29 buf[0]=0x0a;
igbt6 1:7cd80eb4df4c 30 setEepromBlockRegister(IAE,buf,1);
igbt6 1:7cd80eb4df4c 31
igbt6 1:7cd80eb4df4c 32 buf[0]=0x06;
igbt6 1:7cd80eb4df4c 33 setEepromBlockRegister(ACTIVE_EMPTY_40,buf,1);
igbt6 1:7cd80eb4df4c 34
igbt6 1:7cd80eb4df4c 35 //fillBuf(full40Reg, buf);
igbt6 1:7cd80eb4df4c 36 //setEepromBlockRegister(RSGAIN_MSB,buf,2);
igbt6 1:7cd80eb4df4c 37
igbt6 1:7cd80eb4df4c 38 buf[0]=0;
igbt6 1:7cd80eb4df4c 39 setEepromBlockRegister(RSTC,buf,1);
igbt6 1:7cd80eb4df4c 40
igbt6 1:7cd80eb4df4c 41 buf[0]=0x32;
igbt6 1:7cd80eb4df4c 42 setEepromBlockRegister(RSNSP,buf,1);
igbt6 1:7cd80eb4df4c 43
igbt6 1:7cd80eb4df4c 44 buf[0]=0;
igbt6 1:7cd80eb4df4c 45 setEepromBlockRegister(AB,buf,1);
igbt6 1:7cd80eb4df4c 46
igbt6 1:7cd80eb4df4c 47
igbt6 0:e6d413e57654 48 return true;
igbt6 0:e6d413e57654 49 }
igbt6 0:e6d413e57654 50
igbt6 0:e6d413e57654 51 //write data to the sensor
igbt6 0:e6d413e57654 52 bool DS2782::write(uint8_t regAddress, uint8_t* data,int dataLength)
igbt6 0:e6d413e57654 53 {
igbt6 0:e6d413e57654 54 uint8_t tempBuf[dataLength+1];
igbt6 0:e6d413e57654 55 tempBuf[0]=regAddress;
igbt6 0:e6d413e57654 56 memcpy(&(tempBuf[1]),data,dataLength);
igbt6 0:e6d413e57654 57 return mI2c.write(mI2cAddr,(char*)tempBuf,dataLength+1)==0;
igbt6 0:e6d413e57654 58
igbt6 0:e6d413e57654 59 }
igbt6 0:e6d413e57654 60
igbt6 0:e6d413e57654 61 //read data from the sensor
igbt6 0:e6d413e57654 62 bool DS2782::read(uint8_t regAddress, uint8_t *data,int dataLength)
igbt6 0:e6d413e57654 63 {
igbt6 0:e6d413e57654 64 mI2c.write(mI2cAddr,(char*)&regAddress,1,true);
igbt6 0:e6d413e57654 65 return (mI2c.read(mI2cAddr,(char*)data,dataLength)==0);
igbt6 0:e6d413e57654 66 }
igbt6 0:e6d413e57654 67
igbt6 0:e6d413e57654 68 bool DS2782::readTemperature(void)
igbt6 0:e6d413e57654 69 {
igbt6 0:e6d413e57654 70 uint8_t rawData[2];
igbt6 0:e6d413e57654 71 uint16_t rawTemp=0;
igbt6 0:e6d413e57654 72 if(!read(TEMP_MSB_REG, rawData,2)) return false;
igbt6 0:e6d413e57654 73 rawTemp= (((rawData[0]&~(1<<7))<<3)|((rawData[1]>>5)&0xF));
igbt6 0:e6d413e57654 74 mTemperature = (float)(rawTemp*0.125);
igbt6 0:e6d413e57654 75 return true;
igbt6 0:e6d413e57654 76 }
igbt6 0:e6d413e57654 77
igbt6 0:e6d413e57654 78 float DS2782::getTemperature(void)
igbt6 0:e6d413e57654 79 {
igbt6 0:e6d413e57654 80 return mTemperature;
igbt6 0:e6d413e57654 81 }
igbt6 0:e6d413e57654 82
igbt6 0:e6d413e57654 83
igbt6 0:e6d413e57654 84 bool DS2782::readCurrent(void){
igbt6 0:e6d413e57654 85
igbt6 0:e6d413e57654 86 uint8_t rawData[2];
igbt6 0:e6d413e57654 87 uint16_t rawRes=0;
igbt6 0:e6d413e57654 88 if(!read(CURRENT_MSB_REG, rawData,2)) return false;
igbt6 0:e6d413e57654 89 rawRes= get16BitData(rawData[0],rawData[1]);
igbt6 0:e6d413e57654 90 //rawRes&=~(1<<15);
igbt6 0:e6d413e57654 91 if(rawRes &0x8000){
igbt6 0:e6d413e57654 92 mCurrent = (float)(rawRes-65536)*0.07813;
igbt6 0:e6d413e57654 93 }
igbt6 0:e6d413e57654 94 else
igbt6 0:e6d413e57654 95 //mCurrent = (float)(rawRes-32768)*0.07813;
igbt6 0:e6d413e57654 96 mCurrent = (float)(rawRes)*0.07813;
igbt6 0:e6d413e57654 97 return true;
igbt6 0:e6d413e57654 98 }
igbt6 0:e6d413e57654 99
igbt6 0:e6d413e57654 100 float DS2782::getCurrent(void)
igbt6 0:e6d413e57654 101 {
igbt6 0:e6d413e57654 102 return mCurrent;
igbt6 0:e6d413e57654 103 }
igbt6 0:e6d413e57654 104
igbt6 0:e6d413e57654 105
igbt6 0:e6d413e57654 106
igbt6 0:e6d413e57654 107 bool DS2782::readVoltage(void){
igbt6 0:e6d413e57654 108
igbt6 0:e6d413e57654 109 uint8_t rawData[2];
igbt6 0:e6d413e57654 110 uint16_t rawVolt=0;
igbt6 0:e6d413e57654 111 if(!read(VOLT_MSB_REG, rawData,2)) return false;
igbt6 0:e6d413e57654 112 rawVolt= (((rawData[0]&~(1<<7))<<3)|((rawData[1]>>5)&0xF));
igbt6 0:e6d413e57654 113 mVoltage= (float)(rawVolt*4.88);
igbt6 0:e6d413e57654 114 return true;
igbt6 0:e6d413e57654 115 }
igbt6 0:e6d413e57654 116
igbt6 0:e6d413e57654 117 float DS2782::getVoltage(void)
igbt6 0:e6d413e57654 118 {
igbt6 0:e6d413e57654 119 return mVoltage;
igbt6 0:e6d413e57654 120 }
igbt6 0:e6d413e57654 121
igbt6 0:e6d413e57654 122
igbt6 1:7cd80eb4df4c 123 bool DS2782::setACRRegister(uint16_t reg)
igbt6 1:7cd80eb4df4c 124 {
igbt6 1:7cd80eb4df4c 125 uint8_t buf[2];
igbt6 1:7cd80eb4df4c 126 buf[0]= ((reg>>8)&0xFF);
igbt6 1:7cd80eb4df4c 127 buf[1]= ((reg)&0xFF);
igbt6 1:7cd80eb4df4c 128 if(!(write(ACR_MSB_REG, buf,2))) return false;
igbt6 1:7cd80eb4df4c 129 return true;
igbt6 1:7cd80eb4df4c 130 }
igbt6 0:e6d413e57654 131
igbt6 0:e6d413e57654 132
igbt6 1:7cd80eb4df4c 133 float DS2782::readAcrReg(void){
igbt6 0:e6d413e57654 134
igbt6 0:e6d413e57654 135 uint8_t rawData[2];
igbt6 0:e6d413e57654 136 uint16_t rawRes=0;
igbt6 1:7cd80eb4df4c 137 if(!read(ACR_MSB_REG, rawData,2)) return false;
igbt6 0:e6d413e57654 138 rawRes= get16BitData(rawData[0],rawData[1]);
igbt6 1:7cd80eb4df4c 139
igbt6 1:7cd80eb4df4c 140 if(rawRes &0x8000){
igbt6 1:7cd80eb4df4c 141 return ((float)(rawRes-65536)*1.5625);
igbt6 0:e6d413e57654 142 }
igbt6 0:e6d413e57654 143 else
igbt6 1:7cd80eb4df4c 144 return ((float)(rawRes)*1.5625);
igbt6 1:7cd80eb4df4c 145 }
igbt6 1:7cd80eb4df4c 146
igbt6 1:7cd80eb4df4c 147
igbt6 1:7cd80eb4df4c 148 bool DS2782::setEepromBlockRegister(ParamEepromReg reg, uint8_t * value, uint8_t length){
igbt6 1:7cd80eb4df4c 149 uint8_t buf[length];
igbt6 1:7cd80eb4df4c 150 memcpy(buf,value,length);
igbt6 1:7cd80eb4df4c 151 if(!(write(reg, buf,length))) return false;
igbt6 1:7cd80eb4df4c 152 return true;
igbt6 1:7cd80eb4df4c 153
igbt6 0:e6d413e57654 154 }
igbt6 1:7cd80eb4df4c 155
igbt6 1:7cd80eb4df4c 156 uint8_t DS2782::readRarcReg(void){
igbt6 1:7cd80eb4df4c 157 uint8_t rarcRegVal; //unit [%]
igbt6 1:7cd80eb4df4c 158 if(!read(RARC_REG, &rarcRegVal,1)) return 255;
igbt6 1:7cd80eb4df4c 159 return rarcRegVal;
igbt6 1:7cd80eb4df4c 160 }
igbt6 1:7cd80eb4df4c 161
igbt6 1:7cd80eb4df4c 162
igbt6 1:7cd80eb4df4c 163 uint8_t DS2782::readStatusReg(void){
igbt6 1:7cd80eb4df4c 164 uint8_t statusRegVal;
igbt6 1:7cd80eb4df4c 165 if(!read(STATUS, &statusRegVal,1)) return 255;
igbt6 1:7cd80eb4df4c 166 return statusRegVal;
igbt6 1:7cd80eb4df4c 167
igbt6 1:7cd80eb4df4c 168 }