diff --git a/max31865.c b/max31865.c --- a/max31865.c +++ b/max31865.c @@ -1,26 +1,21 @@ -#include "stm32f0xx_hal.h" - -#include "config.h" -#include "stringhelpers.h" -#include "states.h" -#include "gpio.h" +#include "max31855.h" // Registers -#define MAX31855_REG_CONFIG 0x00 -#define MAX31855_REG_RTD_MSB 0x01 -#define MAX31855_REG_RTD_LSB 0x02 -#define MAX31855_REG_HFAULT_THRESH_MSB 0x03 -#define MAX31855_REG_HFAULT_THRESH_LSB 0x04 -#define MAX31855_REG_LFAULT_THRESH_MSB 0x05 -#define MAX31855_REG_LFAULT_THRESH_LSB 0x06 -#define MAX31855_REG_FAULTSTATUS 0x07 +#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 MAX31855_REGWRITEMODIFIER 0x80 +#define MAX31865_REG_WRITE_MODIFIER 0x80 // Fields #define MAX31865_CONF_VBIAS (1<<7) -#define MAX31865_CONF_CONVMODE (1<<6) +#define MAX31865_CONF_AUTO_CONVERT (1<<6) #define MAX31865_CONF_1SHOT (1<<5) #define MAX31865_CONF_3WIRE (1<<4) @@ -32,6 +27,28 @@ #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) @@ -49,10 +66,13 @@ void max31865_readtemp(SPI_HandleTypeDef // 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); @@ -60,50 +80,59 @@ void max31865_readtemp(SPI_HandleTypeDef 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->val.ignore_tc_error) { - status->tc_errno = 1; + uint16_t temp_pre = (rxdatah[0]<<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] = {0x11}; + + HAL_SPI_Transmit(hspi1, ®, 1, 100); + HAL_SPI_Receive(hspi1, data, 1, 100); + + // Release CS + HAL_GPIO_WritePin(MAX_CS, 1); + + status->error_code = data[0]; + 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 decimal + //temp_pre = temp_pre >> 1; + uint16_t adc_count = temp_pre & 0x7FFF; //do some scaling? // 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 = adc_count; + //convert to fahrenheit status->temp += set->val.temp_offset; } // Use Celsius values else { - status->temp = temp_pre * signint; + //convert to celsius + int32_t temp = (((int32_t) adc_count) / 32) - 256; + status->temp = temp; status->temp += set->val.temp_offset; } } + + + + } // vim:softtabstop=4 shiftwidth=4 expandtab