#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