Files @ 6d43230d5986
Branch filter:

Location: therm/max31865.c - annotation

matthewreed
Untested changes for RTDs
860001bb7681
a76c60e8cc43
b77b97fa501d
b77b97fa501d
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
b77b97fa501d
860001bb7681
b77b97fa501d
b77b97fa501d
b77b97fa501d
860001bb7681
b77b97fa501d
b77b97fa501d
b77b97fa501d
b77b97fa501d
b77b97fa501d
b77b97fa501d
b77b97fa501d
b77b97fa501d
b77b97fa501d
b77b97fa501d
b77b97fa501d
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
b77b97fa501d
a76c60e8cc43
a76c60e8cc43
a76c60e8cc43
a76c60e8cc43
db81b1787e6e
b77b97fa501d
a76c60e8cc43
a76c60e8cc43
860001bb7681
860001bb7681
860001bb7681
a76c60e8cc43
a76c60e8cc43
a76c60e8cc43
860001bb7681
a76c60e8cc43
a76c60e8cc43
a76c60e8cc43
a76c60e8cc43
a76c60e8cc43
a76c60e8cc43
a76c60e8cc43
b41e2aea6dd8
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
b41e2aea6dd8
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
860001bb7681
6d43230d5986
6d43230d5986
6d43230d5986
6d43230d5986
6d43230d5986
6d43230d5986
6d43230d5986
6d43230d5986
6d43230d5986
6d43230d5986
6d43230d5986
a76c60e8cc43
a76c60e8cc43
a76c60e8cc43
a76c60e8cc43
235f584ead39
a76c60e8cc43
b41e2aea6dd8
b41e2aea6dd8
b41e2aea6dd8
b41e2aea6dd8
6d43230d5986
f34fa8317622
b41e2aea6dd8
b41e2aea6dd8
f34fa8317622
b41e2aea6dd8
f34fa8317622
b41e2aea6dd8
f34fa8317622
b41e2aea6dd8
235f584ead39
a76c60e8cc43
a76c60e8cc43
b41e2aea6dd8
a76c60e8cc43
a76c60e8cc43
b41e2aea6dd8
b41e2aea6dd8
b41e2aea6dd8
b41e2aea6dd8
6d43230d5986
f34fa8317622
b41e2aea6dd8
b41e2aea6dd8
f34fa8317622
b41e2aea6dd8
f34fa8317622
b41e2aea6dd8
f34fa8317622
b41e2aea6dd8
235f584ead39
a76c60e8cc43
a76c60e8cc43
860001bb7681
860001bb7681
a76c60e8cc43
a76c60e8cc43
a76c60e8cc43
#include "max31855.h"


// Registers
#define MAX31865_REG_CONFIG 0x00
#define MAX31865_REG_RTD_MSB 0x01
#define MAX31865_REG_RTD_LSB 0x02
#define MAX31865_REG_HFAULT_THRESH_MSB 0x03
#define MAX31865_REG_HFAULT_THRESH_LSB 0x04
#define MAX31865_REG_LFAULT_THRESH_MSB 0x05
#define MAX31865_REG_LFAULT_THRESH_LSB 0x06
#define MAX31865_REG_FAULTSTATUS 0x07

#define MAX31865_REG_WRITE_MODIFIER 0x80

// Fields 
#define MAX31865_CONF_VBIAS (1<<7)
#define MAX31865_CONF_AUTO_CONVERT (1<<6)
#define MAX31865_CONF_1SHOT (1<<5)
#define MAX31865_CONF_3WIRE (1<<4)

#define MAX31865_CONF_FAULT_NOACTION    0b0000
#define MAX31865_CONF_FAULT_AUTODELAY   0b0100
#define MAX31865_CONF_FAULT_MANUALELAY1 0b1000
#define MAX31865_CONF_FAULT_MANUALELAY2 0b1100

#define MAX31865_CONF_FAULT_CLEAR (1<<1)
#define MAX31865_CONF_50_60HZ_FILTER (1<<0)

void max31865_config(SPI_HandleTypeDef* hspi1)
{
    uint8_t config = 0x00;
    config |= MAX31865_CONF_VBIAS;
    config |= MAX31865_CONF_AUTO_CONVERT;
    config |= MAX31865_CONF_FAULT_CLEAR;
    
    uint8_t reg = (MAX31865_REG_WRITE_MODIFIER | MAX31865_REG_CONFIG);
    
    // Assert CS
    HAL_GPIO_WritePin(MAX_CS, 0);
    
    HAL_SPI_Transmit(hspi1, &reg, 1, 100);
    HAL_SPI_Transmit(hspi1, &config, 1, 100);
    
    // Release CS
    HAL_GPIO_WritePin(MAX_CS, 1);
}

void max31865_clear_errors(SPI_HandleTypeDef* hspi1) {
	max31865_config(hspi1);
}

// Grab temperature reading from MAX31865
void max31865_readtemp(SPI_HandleTypeDef* hspi1, therm_settings_t* set, therm_status_t* status)
{

    // TODO: Set RTD ref resistance in set struct

    // Assert CS
    HAL_GPIO_WritePin(MAX_CS, 0);
    
    uint8_t regh = MAX31865_REG_RTD_MSB;
    
    uint8_t rxdatah[1] = {0x00};
    uint8_t rxdatal[1] = {0x00};

    HAL_SPI_Transmit(hspi1, &regh, 1, 100);
    HAL_SPI_Receive(hspi1, rxdatah, 1, 100);
    HAL_SPI_Receive(hspi1, rxdatal, 1, 100);

    // Release CS
    HAL_GPIO_WritePin(MAX_CS, 1);

    // Assemble data array into one var
    uint16_t adc_count = ((rxdatah[0] & 0x7F) << 8) | rxdatal[0];
    
    if((rxdatah[0] & 0x80) && !set->val.ignore_error) {

        // Assert CS
        HAL_GPIO_WritePin(MAX_CS, 0);

        uint8_t reg = MAX31865_REG_FAULTSTATUS;

        uint8_t data[1] = {0x00};

        HAL_SPI_Transmit(hspi1, &reg, 1, 100);
        HAL_SPI_Receive(hspi1, data, 1, 100);

        // Release CS
        HAL_GPIO_WritePin(MAX_CS, 1);

        // check to see if it's an error we care about
        if(data[0] & 0b00111100) {
			status->error_code = data[0];
			status->state_resume = status->state;
			status->state = STATE_TC_ERROR;
			status->temp = 0;
			status->temp_frac = 0;
        }
        else {
        	max31865_clear_errors(spi_get());
        }
    }
    else 
    {
        // Convert to Fahrenheit
        if(set->val.temp_units == TEMP_UNITS_FAHRENHEIT)
        {
        	//use all fixed point math!

        	//convert adc to resistance
        	//Rrtd = adc / range * Rref
        	status->temp = (int32_t) adc_count * 40200L;
        	status->temp /= 32768L;
        	//resistance to temp
        	//(x - in1) * (cal2 - cal1) / (in2 - in1) + cal1
        	status->temp = ((status->temp) - 10000L) * (39200L - 3200L) / (17586L - 10000L) + 3200L;
        	//grab the fraction
        	status->temp_frac = (status->temp / 10) % 10L;
        	//scale back to degrees
        	status->temp = status->temp / 100L;
        	//add in the offset
            status->temp += set->val.temp_offset;
        }

        // Convert to Celsius
        else
        {
        	//use all fixed point math!

        	//convert adc to resistance
        	//Rrtd = adc / range * Rref
        	status->temp = (int32_t) adc_count * 40200L;
        	status->temp /= 32768L;
        	//resistance to temp
        	//(x - in1) * (cal2 - cal1) / (in2 - in1) + cal1
        	status->temp = (((status->temp) - 10000L) * (20000L- 0L)) / (17586L - 10000L) + 0L;
        	//grab the fraction
        	status->temp_frac = (status->temp / 10) % 100L;
        	//scale back to degrees
        	status->temp = status->temp / 100L;
        	//add in the offset
            status->temp += set->val.temp_offset;
        }
    }


}

// vim:softtabstop=4 shiftwidth=4 expandtab