Maxim I2C temperature sensor library for MAX31725. Choose I2C address per data sheet based on pin connections.

Revision:
0:8ba1cde7adb6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MAX31725.cpp	Wed Aug 16 17:33:09 2017 +0000
@@ -0,0 +1,97 @@
+#include "MAX31725.h"
+#include "mbed.h"
+
+
+extern Serial pc;
+extern I2C i2c;
+
+
+void MAX31725::writeRegister(uint8_t addr, uint8_t reg, uint8_t val)
+{
+    /*writes 1 byte to a single register*/
+    char writeData[2];
+    writeData[0] = reg ;
+    writeData[1] = val;
+    i2c.write(addr,writeData, 2);
+}
+
+void MAX31725::writeBlock(uint8_t addr, uint8_t startReg, uint8_t *data, uint8_t numBytes)
+{
+    /*writes data from an array beginning at the startReg*/
+    char writeData[numBytes+1];
+    writeData[0]=startReg;
+    for(int n=1; n<numBytes; n++) 
+    {
+        writeData[n]=data[n-1];
+    }
+    i2c.write(addr,writeData,numBytes+1);
+}
+
+void MAX31725::readRegisters(uint8_t addr, uint8_t startReg, char *regData, int numBytes)
+{
+    char writeData = startReg;
+    i2c.write(addr,&writeData,1,true); //true is for repeated start
+    i2c.read(addr,regData,numBytes);
+}
+
+uint16_t MAX31725::LSB_MSB_2uint16(char *data) 
+{
+/*returns an unsinged 16 bit integer from a 2 data bytes, where the second byte is the MSB*/
+    return ((uint16_t)data[1] << 8) + (uint16_t)data[0];
+}
+
+uint16_t MAX31725::MSB_LSB_2uint16(char *data) 
+{
+/*returns an unsinged 16 bit integer from a 2 data bytes, where the second byte is the MSB*/
+    return ((uint16_t)data[0] << 8) + (uint16_t)data[1];
+}
+
+void MAX31725::regDump(uint8_t Addr, uint8_t startByte, uint8_t endByte)
+{
+    /*print the values of up to 20 registers*/
+    char regData[20];
+    int numBytes;
+    if (endByte>=startByte) 
+    {
+        numBytes =  (endByte-startByte+1) < 20 ? (endByte-startByte+1) : 20;
+    } 
+    else 
+    {
+        numBytes=1;
+    }
+
+    regData[0] = startByte;
+    i2c.write(Addr,regData,1,true);
+    i2c.read(Addr, regData, numBytes);
+    for(int n=0; n<numBytes; n++) 
+    {
+        pc.printf("%X, %X \r\n", startByte+n, regData[n]);
+    }
+}
+
+
+bool MAX31725::bitRead(uint16_t data, uint8_t bitNum)
+{
+    uint16_t mask = 1<<bitNum;
+    uint16_t masked_bit = data & mask;
+    return masked_bit >> bitNum;
+}
+
+float MAX31725::getTemp(void) 
+{
+    char tempData[2];
+    uint16_t tempBits; 
+    const float LSB =0.00390625;
+
+  // read temperature
+    readRegisters(MAX31725_ADDR,0x00,tempData,2);
+    tempBits = MSB_LSB_2uint16(tempData);
+    if(bitRead(tempBits,15) == 1 )
+    {
+        return( (32768-tempBits)*LSB ); //negative temp
+    }
+    else 
+    {
+        return ( tempBits*LSB ); //positive temp
+    }
+}