temperature library
Fork of LM75B by
Diff: LM75B.cpp
- Revision:
- 2:cc474eead249
- Parent:
- 1:6a70c9303bbe
--- a/LM75B.cpp Fri Oct 26 21:40:51 2012 +0000 +++ b/LM75B.cpp Wed Feb 24 15:50:09 2016 +0000 @@ -1,26 +1,283 @@ +/* LM75B Driver Library + * Copyright (c) 2013 Neil Thiessen + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include "LM75B.h" -LM75B::LM75B(PinName sda, PinName scl) : i2c(sda, scl) +LM75B::LM75B(PinName sda, PinName scl, Address addr) : m_I2C(sda, scl) +{ + //Set the internal device address + m_Addr = (int)addr; +} + +bool LM75B::open(void) +{ + //Probe for the LM75B using a Zero Length Transfer + if (!m_I2C.write(m_Addr, NULL, 0)) { + //Reset the device to default configuration + write8(REG_CONF, 0x00); + write16(REG_THYST, 0x4B00); + write16(REG_TOS, 0x5000); + + //Return success + return true; + } else { + //Return failure + return false; + } +} + +LM75B::PowerMode LM75B::powerMode(void) +{ + //Read the 8-bit register value + char value = read8(REG_CONF); + + //Return the status of the SHUTDOWN bit + if (value & (1 << 0)) + return POWER_SHUTDOWN; + else + return POWER_NORMAL; +} + +void LM75B::powerMode(PowerMode mode) +{ + //Read the current 8-bit register value + char value = read8(REG_CONF); + + //Set or clear the SHUTDOWN bit + if (mode == POWER_SHUTDOWN) + value |= (1 << 0); + else + value &= ~(1 << 0); + + //Write the value back out + write8(REG_CONF, value); +} + +LM75B::OSMode LM75B::osMode(void) { - char cmd[2]; - cmd[0] = LM75B_Conf; - cmd[1] = 0x0; - i2c.write( LM75B_ADDR, cmd, 2); + //Read the 8-bit register value + char value = read8(REG_CONF); + + //Return the status of the OS_COMP_INT bit + if (value & (1 << 1)) + return OS_INTERRUPT; + else + return OS_COMPARATOR; +} + +void LM75B::osMode(OSMode mode) +{ + //Read the current 8-bit register value + char value = read8(REG_CONF); + + //Set or clear the OS_COMP_INT bit + if (mode == OS_INTERRUPT) + value |= (1 << 1); + else + value &= ~(1 << 1); + + //Write the value back out + write8(REG_CONF, value); +} + +LM75B::OSPolarity LM75B::osPolarity(void) +{ + //Read the 8-bit register value + char value = read8(REG_CONF); + + //Return the status of the OS_POL bit + if (value & (1 << 2)) + return OS_ACTIVE_HIGH; + else + return OS_ACTIVE_LOW; +} + +void LM75B::osPolarity(OSPolarity polarity) +{ + //Read the current 8-bit register value + char value = read8(REG_CONF); + + //Set or clear the OS_POL bit + if (polarity == OS_ACTIVE_HIGH) + value |= (1 << 2); + else + value &= ~(1 << 2); + + //Write the value back out + write8(REG_CONF, value); +} + +LM75B::OSFaultQueue LM75B::osFaultQueue(void) +{ + //Read the 8-bit register value + char value = read8(REG_CONF); + + //Return the status of the OS_F_QUE bits + if ((value & (1 << 3)) && (value & (1 << 4))) + return OS_FAULT_QUEUE_6; + else if (!(value & (1 << 3)) && (value & (1 << 4))) + return OS_FAULT_QUEUE_4; + else if ((value & (1 << 3)) && !(value & (1 << 4))) + return OS_FAULT_QUEUE_2; + else + return OS_FAULT_QUEUE_1; } +void LM75B::osFaultQueue(OSFaultQueue queue) +{ + //Read the current 8-bit register value + char value = read8(REG_CONF); + //Clear the old OS_F_QUE bits + value &= ~(3 << 3); + + //Set the new OS_F_QUE bits + if (queue == OS_FAULT_QUEUE_2) + value |= (1 << 3); + else if (queue == OS_FAULT_QUEUE_4) + value |= (2 << 3); + else if (queue == OS_FAULT_QUEUE_6) + value |= (3 << 3); + + //Write the value back out + write8(REG_CONF, value); +} + +float LM75B::alertTemp(void) +{ + //Use the 9-bit helper to read the TOS register + return readAlertTempHelper(REG_TOS); +} + +void LM75B::alertTemp(float temp) +{ + //Use the 9-bit helper to write to the TOS register + return writeAlertTempHelper(REG_TOS, temp); +} -LM75B::~LM75B() +float LM75B::alertHyst(void) +{ + //Use the 9-bit helper to read the THYST register + return readAlertTempHelper(REG_THYST); +} + +void LM75B::alertHyst(float temp) +{ + //Use the 9-bit helper to write to the THYST register + return writeAlertTempHelper(REG_THYST, temp); +} + +float LM75B::temp(void) { + //Signed return value + short value; + //Read the 11-bit raw temperature value + value = read16(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 + m_I2C.write(m_Addr, ®, 1); + + //Read the 8-bit register + m_I2C.read(m_Addr, ®, 1); + + //Return the byte + return reg; } -float LM75B::read() +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 + m_I2C.write(m_Addr, buff, 2); +} + +unsigned short LM75B::read16(char reg) +{ + //Create a temporary buffer + char buff[2]; + + //Select the register + m_I2C.write(m_Addr, ®, 1); + + //Read the 16-bit register + m_I2C.read(m_Addr, buff, 2); + + //Return the combined 16-bit value + return (buff[0] << 8) | buff[1]; +} + +void LM75B::write16(char reg, unsigned short data) { - char cmd[2]; - cmd[0] = LM75B_Temp; - - i2c.write( LM75B_ADDR, cmd, 1); // Send command string - i2c.read( LM75B_ADDR, cmd, 2); // Send command string - return ( float((cmd[0]<<8)|cmd[1]) / 256.0 ); + //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 + m_I2C.write(m_Addr, buff, 3); } + +float LM75B::readAlertTempHelper(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::writeAlertTempHelper(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); +}