Library DS2782 Stand-Alone Fuel Gauge IC

Committer:
igbt6
Date:
Sun Nov 30 23:23:42 2014 +0000
Revision:
0:e6d413e57654
Child:
1:7cd80eb4df4c
firs tcommit for the 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 0:e6d413e57654 8 }
igbt6 0:e6d413e57654 9
igbt6 0:e6d413e57654 10
igbt6 0:e6d413e57654 11 bool DS2782::initDS2782(void){
igbt6 0:e6d413e57654 12
igbt6 0:e6d413e57654 13 return true;
igbt6 0:e6d413e57654 14 }
igbt6 0:e6d413e57654 15
igbt6 0:e6d413e57654 16 //write data to the sensor
igbt6 0:e6d413e57654 17 bool DS2782::write(uint8_t regAddress, uint8_t* data,int dataLength)
igbt6 0:e6d413e57654 18 {
igbt6 0:e6d413e57654 19 uint8_t tempBuf[dataLength+1];
igbt6 0:e6d413e57654 20 tempBuf[0]=regAddress;
igbt6 0:e6d413e57654 21 memcpy(&(tempBuf[1]),data,dataLength);
igbt6 0:e6d413e57654 22 return mI2c.write(mI2cAddr,(char*)tempBuf,dataLength+1)==0;
igbt6 0:e6d413e57654 23
igbt6 0:e6d413e57654 24 }
igbt6 0:e6d413e57654 25
igbt6 0:e6d413e57654 26 //read data from the sensor
igbt6 0:e6d413e57654 27 bool DS2782::read(uint8_t regAddress, uint8_t *data,int dataLength)
igbt6 0:e6d413e57654 28 {
igbt6 0:e6d413e57654 29 mI2c.write(mI2cAddr,(char*)&regAddress,1,true);
igbt6 0:e6d413e57654 30 return (mI2c.read(mI2cAddr,(char*)data,dataLength)==0);
igbt6 0:e6d413e57654 31 }
igbt6 0:e6d413e57654 32
igbt6 0:e6d413e57654 33 bool DS2782::readTemperature(void)
igbt6 0:e6d413e57654 34 {
igbt6 0:e6d413e57654 35 uint8_t rawData[2];
igbt6 0:e6d413e57654 36 uint16_t rawTemp=0;
igbt6 0:e6d413e57654 37 if(!read(TEMP_MSB_REG, rawData,2)) return false;
igbt6 0:e6d413e57654 38 rawTemp= (((rawData[0]&~(1<<7))<<3)|((rawData[1]>>5)&0xF));
igbt6 0:e6d413e57654 39 mTemperature = (float)(rawTemp*0.125);
igbt6 0:e6d413e57654 40 return true;
igbt6 0:e6d413e57654 41 }
igbt6 0:e6d413e57654 42
igbt6 0:e6d413e57654 43 float DS2782::getTemperature(void)
igbt6 0:e6d413e57654 44 {
igbt6 0:e6d413e57654 45 return mTemperature;
igbt6 0:e6d413e57654 46 }
igbt6 0:e6d413e57654 47
igbt6 0:e6d413e57654 48
igbt6 0:e6d413e57654 49 bool DS2782::readCurrent(void){
igbt6 0:e6d413e57654 50
igbt6 0:e6d413e57654 51 uint8_t rawData[2];
igbt6 0:e6d413e57654 52 uint16_t rawRes=0;
igbt6 0:e6d413e57654 53 if(!read(CURRENT_MSB_REG, rawData,2)) return false;
igbt6 0:e6d413e57654 54 rawRes= get16BitData(rawData[0],rawData[1]);
igbt6 0:e6d413e57654 55 //rawRes&=~(1<<15);
igbt6 0:e6d413e57654 56 if(rawRes &0x8000){
igbt6 0:e6d413e57654 57 mCurrent = (float)(rawRes-65536)*0.07813;
igbt6 0:e6d413e57654 58 }
igbt6 0:e6d413e57654 59 else
igbt6 0:e6d413e57654 60 //mCurrent = (float)(rawRes-32768)*0.07813;
igbt6 0:e6d413e57654 61 mCurrent = (float)(rawRes)*0.07813;
igbt6 0:e6d413e57654 62 return true;
igbt6 0:e6d413e57654 63 }
igbt6 0:e6d413e57654 64
igbt6 0:e6d413e57654 65 float DS2782::getCurrent(void)
igbt6 0:e6d413e57654 66 {
igbt6 0:e6d413e57654 67 return mCurrent;
igbt6 0:e6d413e57654 68 }
igbt6 0:e6d413e57654 69
igbt6 0:e6d413e57654 70
igbt6 0:e6d413e57654 71
igbt6 0:e6d413e57654 72 bool DS2782::readVoltage(void){
igbt6 0:e6d413e57654 73
igbt6 0:e6d413e57654 74 uint8_t rawData[2];
igbt6 0:e6d413e57654 75 uint16_t rawVolt=0;
igbt6 0:e6d413e57654 76 if(!read(VOLT_MSB_REG, rawData,2)) return false;
igbt6 0:e6d413e57654 77 rawVolt= (((rawData[0]&~(1<<7))<<3)|((rawData[1]>>5)&0xF));
igbt6 0:e6d413e57654 78 mVoltage= (float)(rawVolt*4.88);
igbt6 0:e6d413e57654 79 return true;
igbt6 0:e6d413e57654 80 }
igbt6 0:e6d413e57654 81
igbt6 0:e6d413e57654 82 float DS2782::getVoltage(void)
igbt6 0:e6d413e57654 83 {
igbt6 0:e6d413e57654 84 return mVoltage;
igbt6 0:e6d413e57654 85 }
igbt6 0:e6d413e57654 86
igbt6 0:e6d413e57654 87
igbt6 0:e6d413e57654 88
igbt6 0:e6d413e57654 89
igbt6 0:e6d413e57654 90
igbt6 0:e6d413e57654 91 float DS2782::readTest(void){
igbt6 0:e6d413e57654 92
igbt6 0:e6d413e57654 93 uint8_t rawData[2];
igbt6 0:e6d413e57654 94 uint16_t rawRes=0;
igbt6 0:e6d413e57654 95 /*if(!read(ACR_MSB_REG, rawData,2)) return false;
igbt6 0:e6d413e57654 96 rawRes= get16BitData(rawData[0],rawData[1]);
igbt6 0:e6d413e57654 97 */
igbt6 0:e6d413e57654 98 /*if(rawRes &0x8000){
igbt6 0:e6d413e57654 99 return ((float)(rawRes-65536)*0.07813);
igbt6 0:e6d413e57654 100 }
igbt6 0:e6d413e57654 101 else
igbt6 0:e6d413e57654 102 */
igbt6 0:e6d413e57654 103 if(!read(RARC_REG, rawData,1)) return false;
igbt6 0:e6d413e57654 104 rawRes= get16BitData(rawData[0],rawData[1]);
igbt6 0:e6d413e57654 105 return ((float)(rawData[0]*0.3906));
igbt6 0:e6d413e57654 106 }