Maxim I2C temperature sensor library for MAX31725. Choose I2C address per data sheet based on pin connections.
MAX31725.cpp@0:8ba1cde7adb6, 2017-08-16 (annotated)
- Committer:
- laserdad
- Date:
- Wed Aug 16 17:33:09 2017 +0000
- Revision:
- 0:8ba1cde7adb6
no changes
Who changed what in which revision?
User | Revision | Line number | New 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 | } |