A feature complete driver for the LM75B temperature sensor from NXP.
Dependents: app-board-TempAlarm LM75B IoTWorkshopSensors EduRobot ... more
LM75B.cpp
- Committer:
- neilt6
- Date:
- 2013-07-31
- Revision:
- 1:3da8df4319e8
- Parent:
- 0:557a92280097
- Child:
- 2:9ecc39b2ca70
File content as of revision 1:3da8df4319e8:
/* Copyright (c) 2013 Neil Thiessen, MIT License * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or * substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "LM75B.h" #include "mbed.h" LM75B::LM75B(PinName sda, PinName scl, int addr) : _i2c(sda, scl) { //Set the internal device address _addr = addr; } LM75B_Power_t LM75B::getPowerMode(void) { //Read the 8-bit register value char value = _read8(LM75B_REG_CONF); //Return the status of the SHUTDOWN bit if (value & (1 << 0)) return LM75B_Power_Shutdown; else return LM75B_Power_Normal; } void LM75B::setPowerMode(LM75B_Power_t mode) { //Read the current 8-bit register value char value = _read8(LM75B_REG_CONF); //Set or clear the SHUTDOWN bit if (mode == LM75B_Power_Shutdown) value |= (1 << 0); else value &= ~(1 << 0); //Write the value back out _write8(LM75B_REG_CONF, value); } LM75B_OS_Mode_t LM75B::getOSMode(void) { //Read the 8-bit register value char value = _read8(LM75B_REG_CONF); //Return the status of the OS_COMP_INT bit if (value & (1 << 1)) return LM75B_OS_Interrupt; else return LM75B_OS_Comparator; } void LM75B::setOSMode(LM75B_OS_Mode_t mode) { //Read the current 8-bit register value char value = _read8(LM75B_REG_CONF); //Set or clear the OS_COMP_INT bit if (mode == LM75B_OS_Interrupt) value |= (1 << 1); else value &= ~(1 << 1); //Write the value back out _write8(LM75B_REG_CONF, value); } LM75B_OS_Polarity_t LM75B::getOSPolarity(void) { //Read the 8-bit register value char value = _read8(LM75B_REG_CONF); //Return the status of the OS_POL bit if (value & (1 << 2)) return LM75B_OS_ActiveHigh; else return LM75B_OS_ActiveLow; } void LM75B::setOSPolarity(LM75B_OS_Polarity_t polarity) { //Read the current 8-bit register value char value = _read8(LM75B_REG_CONF); //Set or clear the OS_POL bit if (polarity == LM75B_OS_ActiveHigh) value |= (1 << 2); else value &= ~(1 << 2); //Write the value back out _write8(LM75B_REG_CONF, value); } LM75B_OS_FaultQueue_t LM75B::getOSFaultQueue(void) { //Read the 8-bit register value char value = _read8(LM75B_REG_CONF); //Return the status of the OS_F_QUE bits if ((value & (1 << 3)) && (value & (1 << 4))) return LM75B_OS_FaultQueue_6; else if (!(value & (1 << 3)) && (value & (1 << 4))) return LM75B_OS_FaultQueue_4; else if ((value & (1 << 3)) && !(value & (1 << 4))) return LM75B_OS_FaultQueue_2; else return LM75B_OS_FaultQueue_1; } void LM75B::setOSFaultQueue(LM75B_OS_FaultQueue_t queue) { //Read the current 8-bit register value char value = _read8(LM75B_REG_CONF); //Clear the old OS_F_QUE bits value &= ~(3 << 3); //Set the new OS_F_QUE bits if (queue == LM75B_OS_FaultQueue_2) value |= (1 << 3); else if (queue == LM75B_OS_FaultQueue_4) value |= (2 << 3); else if (queue == LM75B_OS_FaultQueue_6) value |= (3 << 3); //Write the value back out _write8(LM75B_REG_CONF, value); } float LM75B::getAlertTemp(void) { //Use the 9-bit helper to read the TOS register return _readTempHelper(LM75B_REG_TOS); } void LM75B::setAlertTemp(float temp) { //Use the 9-bit helper to write to the TOS register return _writeTempHelper(LM75B_REG_TOS, temp); } float LM75B::getAlertHyst(void) { //Use the 9-bit helper to read the THYST register return _readTempHelper(LM75B_REG_THYST); } void LM75B::setAlertHyst(float temp) { //Use the 9-bit helper to write to the THYST register return _writeTempHelper(LM75B_REG_THYST, temp); } float LM75B::getTemp(void) { //Signed return value short value; //Read the 11-bit raw temperature value value = _read16(LM75B_REG_TEMP) >> 5; //Sign extend negative numbers if (value & (1 << 10)) value |= 0xFC00; //Return the temperature in °C return value * 0.125; } char LM75B::_read8(char reg) { //Select the register _i2c.write(_addr, ®, 1); //Read the 8-bit register _i2c.read(_addr, ®, 1); //Return the byte return reg; } void LM75B::_write8(char reg, char data) { //Create a temporary buffer char buff[2]; //Load the register address and 8-bit data buff[0] = reg; buff[1] = data; //Write the data _i2c.write(_addr, buff, 2); } unsigned short LM75B::_read16(char reg) { //Create a temporary buffer char buff[2]; //Select the register _i2c.write(_addr, ®, 1); //Read the 16-bit register _i2c.read(_addr, buff, 2); //Return the combined 16-bit value return (buff[0] << 8) | buff[1]; } void LM75B::_write16(char reg, unsigned short data) { //Create a temporary buffer char buff[3]; //Load the register address and 16-bit data buff[0] = reg; buff[1] = data >> 8; buff[2] = data; //Write the data _i2c.write(_addr, buff, 3); } float LM75B::_readTempHelper(char reg) { //Signed return value short value; //Read the 9-bit raw temperature value value = _read16(reg) >> 7; //Sign extend negative numbers if (value & (1 << 8)) value |= 0xFF00; //Return the temperature in °C return value * 0.5; } void LM75B::_writeTempHelper(char reg, float temp) { //Range limit temp if (temp < -55.0) temp = -55.0; else if (temp > 125.0) temp = 125.0; //Extract and shift the signed integer short value = temp * 2; value <<= 7; //Send the new value _write16(reg, value); }