diff --git a/max31855.c b/max31855.c new file mode 100644 --- /dev/null +++ b/max31855.c @@ -0,0 +1,94 @@ +#include "stm32f0xx_hal.h" + +#include "config.h" +#include "stringhelpers.h" +#include "states.h" +#include "gpio.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->ignore_tc_error) { + status->tc_errno = 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->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->temp_offset; + } + + // Use Celsius values + else + { + status->temp = temp_pre * signint; + status->temp += set->temp_offset; + } + } +} + +