first parts for max31856

This commit is contained in:
MReenen 2024-02-25 18:35:09 +01:00
parent f4b64619ce
commit aac2f72fa3
5 changed files with 147 additions and 16 deletions

View File

@ -11,10 +11,11 @@ pico_sdk_init()
add_executable(my_project
src/main.c
src/max31856.c
)
# Add pico_stdlib library which aggregates commonly used features
target_link_libraries(my_project pico_stdlib)
target_link_libraries(my_project pico_stdlib hardware_spi)
# create map/bin/hex/uf2 file in addition to ELF.
pico_add_extra_outputs(my_project)

1
libs/pico-sdk Submodule

@ -0,0 +1 @@
Subproject commit 6a7db34ff63345a7badec79ebea3aaef1712f374

View File

@ -1,35 +1,64 @@
#include <stdio.h>
#include "pico/stdlib.h"
#include "max31856.h"
// pin rgb led on Seeed XIAO RP2040
#define PIN_RGB_R 17
#define PIN_RGB_G 16
#define PIN_RGB_B 25
int main() {
setup_default_uart();
printf("Hello, world!\n");
max31856_t temp[2];
void init_rbg()
{
gpio_init(PIN_RGB_R);
gpio_set_dir(PIN_RGB_R, GPIO_OUT);
gpio_init(PIN_RGB_G);
gpio_set_dir(PIN_RGB_G, GPIO_OUT);
gpio_init(PIN_RGB_B);
gpio_set_dir(PIN_RGB_B, GPIO_OUT);
}
void rgb_rainbow()
{
gpio_put(PIN_RGB_G, 1);
sleep_ms(250);
gpio_put(PIN_RGB_R, 0);
sleep_ms(250);
gpio_put(PIN_RGB_B, 1);
sleep_ms(250);
gpio_put(PIN_RGB_G, 0);
sleep_ms(250);
gpio_put(PIN_RGB_R, 1);
sleep_ms(250);
gpio_put(PIN_RGB_B, 0);
sleep_ms(250);
gpio_put(PIN_RGB_R, 0);
}
int main() {
setup_default_uart();
printf("Hello, world!\n");
init_rbg();
rgb_rainbow();
// init temp sensors
temp[0].pin_cs = 4;
max31856_init(&(temp[0]));
temp[1].pin_cs = 5;
max31856_init(&(temp[1]));
// config temp sensor 0
max31856_write8(&(temp[0]), MAX31856_REG_CR0, MAX31856_REG_CR0_CMODE | /*MAX31856_REG_CR0_OCFAULT |*/ MAX31856_REG_CR0_50HZ);
max31856_write8(&(temp[0]), MAX31856_REG_CR1, MAX31856_REG_CR1_AVGSEL_1 | MAX31856_REG_CR1_TC_TYPE_K);
// config temp sensor 1
max31856_write8(&(temp[1]), MAX31856_REG_CR0, MAX31856_REG_CR0_CMODE | /*MAX31856_REG_CR0_OCFAULT |*/ MAX31856_REG_CR0_50HZ);
max31856_write8(&(temp[1]), MAX31856_REG_CR1, MAX31856_REG_CR1_AVGSEL_1 | MAX31856_REG_CR1_TC_TYPE_K);
while (true)
{
gpio_put(PIN_RGB_G, 1);
sleep_ms(250);
gpio_put(PIN_RGB_R, 0);
sleep_ms(250);
gpio_put(PIN_RGB_B, 1);
sleep_ms(250);
gpio_put(PIN_RGB_G, 0);
sleep_ms(250);
gpio_put(PIN_RGB_R, 1);
sleep_ms(250);
gpio_put(PIN_RGB_B, 0);
sleep_ms(250);
rgb_rainbow();
}
return 0;
}

47
src/max31856.c Normal file
View File

@ -0,0 +1,47 @@
#include "pico/stdlib.h"
#include "hardware/spi.h"
#include "max31856.h"
// max31856 pins
#define SPI_MAX31856 spi0
#define SPI_MAX31856_BOUD 1E6 // 1 MHz (max31856 can go up to 5 MHz)
#define SPI_MAX31856_SPO SPI_CPOL_0
#define SPI_MAX31856_SPH SPI_CPHA_1
#define SPI_MAX31856_BIT_ORDER SPI_MSB_FIRST
#define SPI_MAX31856_BLOCK_SIZE 8
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;
}
const 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;
}

53
src/max31856.h Normal file
View File

@ -0,0 +1,53 @@
#ifndef MAX31856_H
#define MAX31856_H
#include <stdint.h>
typedef struct max31856_s {
uint8_t pin_cs;
bool initilzed;
bool autoDeinit;
} max31856_t;
void max31856_init(max31856_t *max);
void max31856_deinit(max31856_t *max);
int max31856_write8(max31856_t *max, uint8_t addr, uint8_t value);
#define MAX31856_REG_CR0 0x00
#define MAX31856_REG_CR0_CMODE 0x80
#define MAX31856_REG_CR0_1SHOT 0x40
#define MAX31856_REG_CR0_OCFAULT 0x10
#define MAX31856_REG_CR0_JC 0x08
#define MAX31856_REG_CR0_FAULT 0x04
#define MAX31856_REG_CR0_FAULTCLR 0x02
#define MAX31856_REG_CR0_50HZ 0x01
#define MAX31856_REG_CR1 0x01
#define MAX31856_REG_CR1_AVGSEL_1 0x00
#define MAX31856_REG_CR1_AVGSEL_2 0x10
#define MAX31856_REG_CR1_AVGSEL_4 0x20
#define MAX31856_REG_CR1_AVGSEL_8 0x30
#define MAX31856_REG_CR1_AVGSEL_16 0x40
#define MAX31856_REG_CR1_TC_TYPE_B 0x00
#define MAX31856_REG_CR1_TC_TYPE_E 0x01
#define MAX31856_REG_CR1_TC_TYPE_J 0x02
#define MAX31856_REG_CR1_TC_TYPE_K 0x03
#define MAX31856_REG_CR1_TC_TYPE_N 0x04
#define MAX31856_REG_CR1_TC_TYPE_R 0x05
#define MAX31856_REG_CR1_TC_TYPE_S 0x06
#define MAX31856_REG_CR1_TC_TYPE_T 0x07
#define MAX31856_REG_CR1_VM_GAIN8 0x08
#define MAX31856_REG_CR1_VM_GAIN32 0x0C
#define MAX31856_REG_MASK 0x02
#define MAX31856_REG_CJHF 0x03
#define MAX31856_REG_CJLF 0x04
#define MAX31856_REG_LTHFTH 0x05
#define MAX31856_REG_LTHFTL 0x06
#define MAX31856_REG_LTLFTH 0x07
#define MAX31856_REG_LTLFTL 0x08
#define MAX31856_REG_CJTO 0x09
#define MAX31856_REG_CJTH 0x0A
#define MAX31856_REG_CJTL 0x0B
#endif