Library DS2782 Stand-Alone Fuel Gauge IC
ds2782.cpp@1:7cd80eb4df4c, 2014-12-17 (annotated)
- 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?
User | Revision | Line number | New 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*)®Address,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 | } |