improved MAX31855 Library with errorchecking

Fork of MAX31855 by Eric Patterson

max31855.cpp

Committer:
nielsvanmegen
Date:
2016-01-07
Revision:
4:064382cf8d8e
Parent:
3:e2731f1e595b

File content as of revision 4:064382cf8d8e:

#include <mbed.h>
#include "max31855.h"

max31855::max31855(SPI& _spi, PinName ncs1, PinName ncs2) : _spi(_spi), _CS_1(ncs1), _CS_2(ncs2)
{

}

float max31855::read_temp(max31855::THERMOCOUPLES thermo)
{
    short value = 0;
    float temp = 0;
    //Variables to hold probe temperature
    uint8_t tempProbeHigh=0;
    uint8_t tempProbeLow=0;
    //Variables to hold chip temperature and device status
    uint8_t tempChipHigh=0;
    uint8_t tempChipLow=0;
    //Set CS to initiate transfer and stop conversion
    select(thermo);
    //Read in Probe tempeature
    tempProbeHigh = _spi.write(0);
    tempProbeLow = _spi.write(0);
    //Get the chip temperature and the fault data
    tempChipHigh = _spi.write(0);
    tempChipLow = _spi.write(0);
    //Set the chip temperature
    _chipTemp = (tempChipHigh<<4 | tempChipLow>>4)*0.0625;
    //Set CS to stop transfer and restart conversion
    deselect(thermo);
    if (CHECK_BIT(tempProbeLow, 0)) {
        //not connected error
        if(CHECK_BIT(tempChipLow, 0))return -2;
        //short to ground
        else if(CHECK_BIT(tempChipLow, 1))return -3;
        //short to VCC
        else if(CHECK_BIT(tempChipLow, 2))return -4;
        else return -5;
    } else {
        //Integer value of temperature
        value = (tempProbeHigh<< 6 | tempProbeLow>>2);
        //Get actual temperature (last 2 bits of integer are decimal 0.5 and 0.25)
        temp = (value*0.25); // Multiply the value by 0.25 to get temp in C or
        //  * (9.0/5.0)) + 32.0;   // Convert value to F (ensure proper floats!)
        return temp;
    }
}

void max31855::select(THERMOCOUPLES thermo)
{
    //Set CS low to start transmission (interrupts conversion)
    if(thermo == THERMO_1) _CS_1 = 0;
    else _CS_2 = 0;
}

void max31855::deselect(THERMOCOUPLES thermo)
{
    //Set CS high to stop transmission (restarts conversion)
    if(thermo == THERMO_1) _CS_1 = 1;
    else _CS_2 = 1;
    _pollTimer.reset();
}

void max31855::initialise(uint32_t interval)
{
    //Start the conversion timer
    _readInterval = interval;
    _pollTimer.start();
    _faultCode=0;
}

bool max31855::ready()
{
    //Check to see if conversion is complete
    if(_pollTimer.read_ms() > _readInterval ) return true;
    else return false;
}