2018-02-18 14:02:33 +05:30

69 lines
1.6 KiB
C++

// LM73 I2C class
// Based on Texas Instruments datasheet http://www.ti.com/lit/ds/symlink/lm73.pdf
// Note that this is a bare-bones driver and does not support all of the features
// of the LM73. I only added what I needed.
// 12/03/2012 Abe Erdos (abe@erdosmiller.com)
#include "LM73.h"
LM73::LM73() {
devAddr = LM73_DEFAULT_ADDRESS;
devConfig.all = 0x40; // reset state
devCtrlStat.all = 0x08; // reset state
}
LM73::LM73(uint8_t address) {
devAddr = address;
devConfig.all = 0x40; // reset state
devCtrlStat.all = 0x08; // reset state
}
void LM73::initialize() {
// there's nothing to do, really
}
bool LM73::testConnection() {
uint16_t buf;
I2Cdev::readWord(devAddr, LM73_RA_ID, &buf);
return buf == 0x0190;
}
LM73ConfigReg LM73::getConfig() {
I2Cdev::readByte(devAddr, LM73_RA_CONFIG, buffer);
devConfig.all = buffer[0];
return devConfig;
}
LM73CtrlStatReg LM73::getCtrlStat() {
I2Cdev::readByte(devAddr, LM73_RA_CTRL_STAT, buffer);
devCtrlStat.all = buffer[0];
return devCtrlStat;
}
void LM73::setCtrlStat(LM73CtrlStatReg value) {
I2Cdev::writeByte(devAddr, LM73_RA_CTRL_STAT, value.all);
}
uint8_t LM73::getResolution() {
LM73::getCtrlStat();
return devCtrlStat.bit.RES + 11;
}
float LM73::getTemp() {
uint16_t buf;
int16_t temp;
I2Cdev::readWord(devAddr, LM73_RA_TEMP, &buf);
temp = buf;
temp = (temp>>2);
return 0.03125f * (float)temp;
}
void LM73::setResolution(uint8_t resolution) {
if(10 < resolution && resolution < 15) {
LM73::getCtrlStat();
devCtrlStat.bit.RES = resolution - 11;
LM73::setCtrlStat(devCtrlStat);
}
}