first publish
Fork of MAX31855 by
Diff: max31855.cpp
- Revision:
- 0:656c522152d4
- Child:
- 1:5eeee89cb281
diff -r 000000000000 -r 656c522152d4 max31855.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/max31855.cpp Thu Aug 16 12:46:52 2012 +0000 @@ -0,0 +1,98 @@ + +#include <mbed.h> +#include "max31855.h" + +max31855::max31855(SPI& _spi, PinName _ncs) : spi(_spi), ncs(_ncs) { + +} + +float max31855::read_temp() { + 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; + + if (pollTimer.read_ms() > 250){ + //Set CS to initiate transfer and stop conversion + select(); + + //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.25; + + //Check for a fault (last bit of transfer is fault bit) + if ((tempProbeLow & 1)==1){ + //Chip reports a fault, extract fault from Chip Temperature data + int faultType = (tempChipLow & 7); + + if (faultType==1){ + //Open circuit (no TC) + return 0.1; + }else if (faultType==2){ + //Short to GND + return 0.2; + }else if (faultType==4){ + //Short to VCC + return 0.4; + }else{ + return 0.5; + } + }else{ + //Set CS to stop transfer and restart conversion + deselect(); + + //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; + } + }else{ + //Chip not ready for reading + return -1; + } +} + +void max31855::select() { + //Set CS low to start transmission (interrupts conversion) + ncs = 0; +} + +void max31855::deselect() { + //Set CS high to stop transmission (restarts conversion) + ncs = 1; + //Reset conversion timer + pollTimer.reset(); +} + +void max31855::initialise() { + //Start the conversion timer + pollTimer.start(); +} + +int max31855::ready() { + //Check to see if conversion is complete + if (pollTimer.read_ms() > 250) { + //Conversion complete + return 1; + }else{ + //Conversion incomplete + return 0; + } +} \ No newline at end of file