Files @ 9294a623e8e5
Branch filter:

Location: therm/max31855.c

Ethan Zonca
Added support for both heaters and coolers as well as thermostatic control
#include "max31865.h"

// Grab temperature reading from MAX31855
void max31855_readtemp(SPI_HandleTypeDef* hspi1, therm_settings_t* set, therm_status_t* status)
{
    // Assert CS
    HAL_GPIO_WritePin(MAX_CS, 0);

    uint8_t rxdatah[1] = {0x00};
    uint8_t rxdatal[1] = {0x00};

    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 temp_pre = rxdatal[0] | (rxdatah[0]<<8);
/*
    if(temp_pre & 0b010) {
        ssd1306_clearscreen();
        HAL_Delay(400); // FIXME: remove?
        status.tc_errno = 4;
        status.state = STATE_TC_ERROR;
        status.temp = 0;
        status.temp_frac = 0;
    } */
    if(temp_pre & 0b001 && !set->val.ignore_error) {
        status->error_code = 1;
        HAL_Delay(400); // FIXME: remove?
        status->state_resume = status->state;
        status->state = STATE_TC_ERROR;
        status->temp = 0;
        status->temp_frac = 0;
    }/*
    else if(temp_pre & 0b100 && !set.ignore_tc_error) {
        status.tc_errno = 8;
        HAL_Delay(400); // FIXME: remove?
        status.state_resume = status.state;
        status.state = STATE_TC_ERROR;
        status.temp = 0;
        status.temp_frac = 0;
    }*/
    else 
    {
        //if(status.state == STATE_TC_ERROR)
        //{
        //    status.state = status.state_resume;
        //    ssd1306_clearscreen();
        //}

        uint8_t sign = status->temp >> 15;// top bit is sign

        temp_pre = temp_pre >> 2; // Drop 2 lowest bits
        status->temp_frac = temp_pre & 0b11; // get fractional part
        status->temp_frac *= 25; // each bit is .25 a degree, up to fixed point
        temp_pre = temp_pre >> 2; // Drop 2 fractional bits 

        int8_t signint;

        if(sign) {
            signint = -1;
        }
        else {
            signint = 1;
        }

        // Convert to Fahrenheit
        if(set->val.temp_units == TEMP_UNITS_FAHRENHEIT)
        {
            status->temp = signint * ((temp_pre*100) + status->temp_frac);
            status->temp = status->temp * 1.8;
            status->temp += 3200;
            status->temp_frac = status->temp % 100;
            status->temp /= 100;
            status->temp += set->val.temp_offset;
        }

        // Use Celsius values
        else
        {
            status->temp = temp_pre * signint;
            status->temp += set->val.temp_offset;
        }
    }
}

// vim:softtabstop=4 shiftwidth=4 expandtab