A feature complete driver for the LM75B temperature sensor from NXP.
Fork of LM75B by
Diff: LM75B.cpp
- Revision:
- 0:557a92280097
- Child:
- 1:3da8df4319e8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LM75B.cpp Wed Jul 31 22:04:57 2013 +0000 @@ -0,0 +1,273 @@ +/* mbed LM75B Library + * Copyright (c) 2013 neilt6 + * + * 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); +}