Files
tempMeter/src/max31856.cpp
2025-11-24 16:57:26 +01:00

132 lines
2.8 KiB
C++

#include "pico/stdlib.h"
#include "hardware/spi.h"
#include <cstdint>
#include <stdint.h>
#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));
}