#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, ®, 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, ®h, 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, ®, 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