library for MAX9611 /9612 Current-Sense Amplifiers
max9611.cpp
- Committer:
- igbt6
- Date:
- 2015-01-28
- Revision:
- 8:1e392bc95666
- Parent:
- 7:012f5b39405e
File content as of revision 8:1e392bc95666:
#include "max9611.h" MAX9611::MAX9611(PinName sda, PinName scl, int i2cFrequencyHz, int address):mI2c(sda,scl), mI2cAddr(address) { mI2c.frequency(i2cFrequencyHz); if(!initMax9611()); //while(1){ //TODO handle error} mTemperature=0; mCsaCurrentValueOffset=0x0a; //NOTE! set this parameter on your own, it depends on your used sensor } //write data to the sensor bool MAX9611::write(uint8_t regAddress, uint8_t* data,int dataLength) { uint8_t tempBuf[dataLength+1]; tempBuf[0]=regAddress; memcpy(&(tempBuf[1]),data,dataLength); return mI2c.write(mI2cAddr,(char*)tempBuf,dataLength+1)==0; } //read data from the sensor bool MAX9611::read(uint8_t regAddress, uint8_t *data,int dataLength) { mI2c.write(mI2cAddr,(char*)®Address,1,true); return (mI2c.read(mI2cAddr,(char*)data,dataLength)==0); } //configuration of MAX9611 bool MAX9611::initMax9611(eCtrlReg1MUX mux, eCtrlReg1SHDN shdn, eCtrlReg1LR lr, eCtrlReg1MODE mode, eCtrlReg2DTIM watchdogDelay, eCtrlReg2RTIM watchdogRetryDelay) { uint8_t retVal=0; uint8_t controlReg1=0; uint8_t controlReg2=0; controlReg1=(mode<<5|lr<<4|shdn<<3|mux); controlReg2=(watchdogDelay<<3|watchdogRetryDelay<<2); retVal+= write(CONTROL_REGISTER_1_ADRR,&controlReg1,1); retVal+= write(CONTROL_REGISTER_2_ADRR,&controlReg2,1); if(retVal!=2) return false; mMuxReg= mux; return true; } bool MAX9611::readTemp(void) { uint8_t rawData[2]; uint16_t rawTemp=0; if(!read(TEMP_DATA_BYTE_MSB_ADRR, rawData,2)) return false; rawTemp= get9BitData(rawData[0],rawData[1]); //mRawInt =rawTemp; if ( rawTemp & 0x100) { mTemperature = (float) (rawTemp- 256)*0.48; } else { mTemperature = (float)(rawTemp) *0.48; } return true; } bool MAX9611::readCSAOutputValue(void) { uint8_t rawData[2]; uint16_t rawCSAVal=0; if(!read(CSA_DATA_BYTE_MSB_ADRR, rawData,2)) return false; rawCSAVal= get12BitData(rawData[0],rawData[1]); //mRawInt = rawCSAVal; //debug if(rawCSAVal<=mCsaCurrentValueOffset) mCurrentSenseAmplifierOutput=0; else mCurrentSenseAmplifierOutput= (float)(rawCSAVal)*(getCSACurrentCoeffmA()); // to get result in [mA] return true; } // useful debug methods uint16_t MAX9611::readRawControl(void) { uint8_t rawData[2]; uint16_t rawCtrl=0; read(CONTROL_REGISTER_1_ADRR, rawData,2) ; rawCtrl= (rawData[0]<<8)|rawData[1]; return rawCtrl; } uint16_t MAX9611::readRawRsValue(void) { uint8_t rawData[2]; uint16_t rawRsVal=0; read(RS_DATA_BYTE_MSB_ADRR, rawData,2) ; rawRsVal= get12BitData(rawData[0],rawData[1]); return rawRsVal; } uint16_t MAX9611::readRawCSAOutValue(void) { uint8_t rawData[2]; uint16_t rawCSAOut=0; read(CSA_DATA_BYTE_MSB_ADRR, rawData,2) ; rawCSAOut= get12BitData(rawData[0],rawData[1]); return rawCSAOut; } uint16_t MAX9611::readRawOutValue(void) { uint8_t rawData[2]; uint16_t rawOut=0; read(OUT_DATA_BYTE_MSB_ADRR, rawData,2) ; rawOut= get12BitData(rawData[0],rawData[1]); return rawOut; }