#include "pico/stdlib.h" #include "hardware/spi.h" #include #include #include "max31856.h" void max31856_init(max31856_t *max) { // init GPIO for CS gpio_init(max->pin_cs); gpio_set_dir(max->pin_cs, GPIO_OUT); gpio_put(max->pin_cs, 1); // init SPI spi_init(SPI_MAX31856, SPI_MAX31856_BOUD); spi_set_format(SPI_MAX31856, SPI_MAX31856_BLOCK_SIZE, SPI_MAX31856_SPO, SPI_MAX31856_SPH, SPI_MAX31856_BIT_ORDER); max->initilzed = true; } void max31856_deinit(max31856_t *max) { max->initilzed = false; spi_deinit(SPI_MAX31856); gpio_deinit(max->pin_cs); } int max31856_write8(max31856_t *max, uint8_t addr, uint8_t value) { if (!(max->initilzed)) { return -1; } uint8_t buff[2] = {addr | 0x80, value}; gpio_put(max->pin_cs, 0); spi_write_blocking(SPI_MAX31856, &buff[0], 2); gpio_put(max->pin_cs, 1); return 0; } uint8_t max31856_read8(max31856_t *max, uint8_t addr) { if (!(max->initilzed)) { return -1; } uint8_t buff_tx = addr & 0x7F; uint8_t buff_rx[] = {0, 0}; gpio_put(max->pin_cs, 0); spi_read_blocking(SPI_MAX31856, buff_tx, &buff_rx[0], 2); gpio_put(max->pin_cs, 1); return buff_rx[1]; } uint16_t max31856_read16(max31856_t *max, uint8_t addr) { if (!(max->initilzed)) { return -1; } uint8_t buff_tx = addr & 0x7F; uint8_t buff_rx[] = {0, 0, 0}; gpio_put(max->pin_cs, 0); spi_read_blocking(SPI_MAX31856, buff_tx, &buff_rx[0], 3); gpio_put(max->pin_cs, 1); return buff_rx[1]<<8 | buff_rx[2]; } uint32_t max31856_read24(max31856_t *max, uint8_t addr) { if (!(max->initilzed)) { return -1; } uint8_t buff_tx = addr & 0x7F; uint8_t buff_rx[] = {0, 0, 0, 0}; gpio_put(max->pin_cs, 0); spi_read_blocking(SPI_MAX31856, buff_tx, &buff_rx[0], 4); gpio_put(max->pin_cs, 1); return 0 | buff_rx[1]<<16 | buff_rx[2]<<8 | buff_rx[3]; } max31856_temp_t max31856_convert_cj_temp_c(uint16_t row) { bool negarive = ((row & 0x8000) == 0) ? false : true; if (negarive) { row = (~row) + 1; } max31856_temp_t temp = { (int16_t)(row >> 8), (uint8_t)(((row & 0xFF)*100)/256) }; if (negarive) { temp.i = -temp.i; } return temp; } max31856_temp_t max31856_convert_tc_temp_c(uint32_t row) { bool negarive = ((row & 0x800000) == 0) ? false : true; if (negarive) { row = (row^0xFFFFFF) + 1; } row &= 0xFFFFFF; max31856_temp_t temp = { (int16_t)(row >> 12), (uint8_t)(((row & 0xFFF)*100)/0x1000) }; if (negarive) { temp.i = -temp.i; } return temp; } max31856_temp_t max31856_get_cj_temp_c(max31856_t *max) { return max31856_convert_cj_temp_c(max31856_read16(max, MAX31856_REG_CJTH)); } max31856_temp_t max31856_get_tc_temp_c(max31856_t *max) { return max31856_convert_tc_temp_c(max31856_read24(max, MAX31856_REG_LTCBH)); }