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

Committer:
laserdad
Date:
Wed Aug 16 17:33:09 2017 +0000
Revision:
0:8ba1cde7adb6
no changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
laserdad 0:8ba1cde7adb6 1 #include "MAX31725.h"
laserdad 0:8ba1cde7adb6 2 #include "mbed.h"
laserdad 0:8ba1cde7adb6 3
laserdad 0:8ba1cde7adb6 4
laserdad 0:8ba1cde7adb6 5 extern Serial pc;
laserdad 0:8ba1cde7adb6 6 extern I2C i2c;
laserdad 0:8ba1cde7adb6 7
laserdad 0:8ba1cde7adb6 8
laserdad 0:8ba1cde7adb6 9 void MAX31725::writeRegister(uint8_t addr, uint8_t reg, uint8_t val)
laserdad 0:8ba1cde7adb6 10 {
laserdad 0:8ba1cde7adb6 11 /*writes 1 byte to a single register*/
laserdad 0:8ba1cde7adb6 12 char writeData[2];
laserdad 0:8ba1cde7adb6 13 writeData[0] = reg ;
laserdad 0:8ba1cde7adb6 14 writeData[1] = val;
laserdad 0:8ba1cde7adb6 15 i2c.write(addr,writeData, 2);
laserdad 0:8ba1cde7adb6 16 }
laserdad 0:8ba1cde7adb6 17
laserdad 0:8ba1cde7adb6 18 void MAX31725::writeBlock(uint8_t addr, uint8_t startReg, uint8_t *data, uint8_t numBytes)
laserdad 0:8ba1cde7adb6 19 {
laserdad 0:8ba1cde7adb6 20 /*writes data from an array beginning at the startReg*/
laserdad 0:8ba1cde7adb6 21 char writeData[numBytes+1];
laserdad 0:8ba1cde7adb6 22 writeData[0]=startReg;
laserdad 0:8ba1cde7adb6 23 for(int n=1; n<numBytes; n++)
laserdad 0:8ba1cde7adb6 24 {
laserdad 0:8ba1cde7adb6 25 writeData[n]=data[n-1];
laserdad 0:8ba1cde7adb6 26 }
laserdad 0:8ba1cde7adb6 27 i2c.write(addr,writeData,numBytes+1);
laserdad 0:8ba1cde7adb6 28 }
laserdad 0:8ba1cde7adb6 29
laserdad 0:8ba1cde7adb6 30 void MAX31725::readRegisters(uint8_t addr, uint8_t startReg, char *regData, int numBytes)
laserdad 0:8ba1cde7adb6 31 {
laserdad 0:8ba1cde7adb6 32 char writeData = startReg;
laserdad 0:8ba1cde7adb6 33 i2c.write(addr,&writeData,1,true); //true is for repeated start
laserdad 0:8ba1cde7adb6 34 i2c.read(addr,regData,numBytes);
laserdad 0:8ba1cde7adb6 35 }
laserdad 0:8ba1cde7adb6 36
laserdad 0:8ba1cde7adb6 37 uint16_t MAX31725::LSB_MSB_2uint16(char *data)
laserdad 0:8ba1cde7adb6 38 {
laserdad 0:8ba1cde7adb6 39 /*returns an unsinged 16 bit integer from a 2 data bytes, where the second byte is the MSB*/
laserdad 0:8ba1cde7adb6 40 return ((uint16_t)data[1] << 8) + (uint16_t)data[0];
laserdad 0:8ba1cde7adb6 41 }
laserdad 0:8ba1cde7adb6 42
laserdad 0:8ba1cde7adb6 43 uint16_t MAX31725::MSB_LSB_2uint16(char *data)
laserdad 0:8ba1cde7adb6 44 {
laserdad 0:8ba1cde7adb6 45 /*returns an unsinged 16 bit integer from a 2 data bytes, where the second byte is the MSB*/
laserdad 0:8ba1cde7adb6 46 return ((uint16_t)data[0] << 8) + (uint16_t)data[1];
laserdad 0:8ba1cde7adb6 47 }
laserdad 0:8ba1cde7adb6 48
laserdad 0:8ba1cde7adb6 49 void MAX31725::regDump(uint8_t Addr, uint8_t startByte, uint8_t endByte)
laserdad 0:8ba1cde7adb6 50 {
laserdad 0:8ba1cde7adb6 51 /*print the values of up to 20 registers*/
laserdad 0:8ba1cde7adb6 52 char regData[20];
laserdad 0:8ba1cde7adb6 53 int numBytes;
laserdad 0:8ba1cde7adb6 54 if (endByte>=startByte)
laserdad 0:8ba1cde7adb6 55 {
laserdad 0:8ba1cde7adb6 56 numBytes = (endByte-startByte+1) < 20 ? (endByte-startByte+1) : 20;
laserdad 0:8ba1cde7adb6 57 }
laserdad 0:8ba1cde7adb6 58 else
laserdad 0:8ba1cde7adb6 59 {
laserdad 0:8ba1cde7adb6 60 numBytes=1;
laserdad 0:8ba1cde7adb6 61 }
laserdad 0:8ba1cde7adb6 62
laserdad 0:8ba1cde7adb6 63 regData[0] = startByte;
laserdad 0:8ba1cde7adb6 64 i2c.write(Addr,regData,1,true);
laserdad 0:8ba1cde7adb6 65 i2c.read(Addr, regData, numBytes);
laserdad 0:8ba1cde7adb6 66 for(int n=0; n<numBytes; n++)
laserdad 0:8ba1cde7adb6 67 {
laserdad 0:8ba1cde7adb6 68 pc.printf("%X, %X \r\n", startByte+n, regData[n]);
laserdad 0:8ba1cde7adb6 69 }
laserdad 0:8ba1cde7adb6 70 }
laserdad 0:8ba1cde7adb6 71
laserdad 0:8ba1cde7adb6 72
laserdad 0:8ba1cde7adb6 73 bool MAX31725::bitRead(uint16_t data, uint8_t bitNum)
laserdad 0:8ba1cde7adb6 74 {
laserdad 0:8ba1cde7adb6 75 uint16_t mask = 1<<bitNum;
laserdad 0:8ba1cde7adb6 76 uint16_t masked_bit = data & mask;
laserdad 0:8ba1cde7adb6 77 return masked_bit >> bitNum;
laserdad 0:8ba1cde7adb6 78 }
laserdad 0:8ba1cde7adb6 79
laserdad 0:8ba1cde7adb6 80 float MAX31725::getTemp(void)
laserdad 0:8ba1cde7adb6 81 {
laserdad 0:8ba1cde7adb6 82 char tempData[2];
laserdad 0:8ba1cde7adb6 83 uint16_t tempBits;
laserdad 0:8ba1cde7adb6 84 const float LSB =0.00390625;
laserdad 0:8ba1cde7adb6 85
laserdad 0:8ba1cde7adb6 86 // read temperature
laserdad 0:8ba1cde7adb6 87 readRegisters(MAX31725_ADDR,0x00,tempData,2);
laserdad 0:8ba1cde7adb6 88 tempBits = MSB_LSB_2uint16(tempData);
laserdad 0:8ba1cde7adb6 89 if(bitRead(tempBits,15) == 1 )
laserdad 0:8ba1cde7adb6 90 {
laserdad 0:8ba1cde7adb6 91 return( (32768-tempBits)*LSB ); //negative temp
laserdad 0:8ba1cde7adb6 92 }
laserdad 0:8ba1cde7adb6 93 else
laserdad 0:8ba1cde7adb6 94 {
laserdad 0:8ba1cde7adb6 95 return ( tempBits*LSB ); //positive temp
laserdad 0:8ba1cde7adb6 96 }
laserdad 0:8ba1cde7adb6 97 }