generated from LailaTheElf/rp2040_c
132 lines
2.8 KiB
C++
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));
|
|
}
|