diff --git a/max31865.c b/max31865.c new file mode 100644 --- /dev/null +++ b/max31865.c @@ -0,0 +1,74 @@ +#include "stm32f0xx_hal.h" + +#include "config.h" +#include "stringhelpers.h" +#include "states.h" +#include "gpio.h" + +// Grab temperature reading from MAX31865 +void max31865_readtemp(SPI_HandleTypeDef* hspi1, therm_settings_t* set, therm_status_t* status) +{ + // ** FIXME ** FIXME ** FIXME ** // + // This is duplicated from MAX31855, update for MAX31865 registers/etc + /////////////////////////////////// + + // 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 & 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 + { + 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; + } + } +} + +// vim:softtabstop=4 shiftwidth=4 expandtab