| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19966
 
 
 
			    
 
 | 
			
				| Basic library for the MAX31865 |  
				|  Posted: Thu Aug 26, 2021 11:58 am |   |  
				| 
 |  
				| This is based on some code posted by Jody, fixed by me, and adapted to use spi_xfer. Gives a basis for anyone wanting to use this chip.
 
 //main31865.c
 
  	  | Code: |  	  | #include <18F87J50.h>
 #device ADC=10
 
 #FUSES NOWDT                    //No Watch Dog Timer
 #FUSES NOXINST
 #FUSES NOIESO
 
 #use delay(crystal=8000000)
 
 #use SPI(SPI1, baud=4000000, MODE=1, bits=32, STREAM=MAX)
 
 #include "math.h"
 #include "stdint.h"
 #include "MAX31865.h"
 
 void main()
 {
 float   Rref    = 470.0;
 uint16_t   result    = 0;
 float   Temperature_vriezer;
 uint16_t   vriezer;
 float   Resistance;
 
 output_high(MAX31865_CS);
 delay_ms(100); //ensure chip has time to wake up
 MAX31865_init(); //wake up chip
 
 while(1)
 {
 result = MAX31865_read_data();
 if (result & 1)
 {
 //error bit is set, read the error status
 result=MAX31865_read8(MAX31856_FAULTSTAT_REG);
 //here add fault diagmostics
 }
 else
 {
 result>>=1; //remove low bit
 if(result == 0x7fff) result = 0;
 Resistance = ((double)result*Rref)/32768;
 Temperature_vriezer = CallendarVanDusen(Resistance);
 vriezer = (int16) Temperature_vriezer;
 delay_ms(17); //minimum 16.5mSec between readings;
 }
 }
 }
 
 | 
 
 //max31865.h
 
  	  | Code: |  	  | /***************************************************************************************/
 // SPI chip select pin
 #define MAX31865_CS  PIN_D1
 
 #define MAX31856_CONFIG_REG_READ       0x00
 #define MAX31856_CONFIG_REG_WRITE      0x80
 #define MAX31856_CONFIG_BIAS           0x80
 #define MAX31856_CONFIG_MODEAUTO       0x40
 #define MAX31856_CONFIG_MODEOFF        0x00
 #define MAX31856_CONFIG_1SHOT          0x20
 #define MAX31856_CONFIG_3WIRE          0x10
 #define MAX31856_CONFIG_24WIRE         0x00
 #define MAX31856_CONFIG_FAULTSTAT      0x02
 #define MAX31856_CONFIG_FILT50HZ       0x01
 #define MAX31856_CONFIG_FILT60HZ       0x00
 
 #define MAX31856_RTDMSB_REG           0x01
 #define MAX31856_RTDLSB_REG           0x02
 #define MAX31856_HFAULTMSB_REG        0x03
 #define MAX31856_HFAULTLSB_REG        0x04
 #define MAX31856_LFAULTMSB_REG        0x05
 #define MAX31856_LFAULTLSB_REG        0x06
 #define MAX31856_FAULTSTAT_REG        0x07
 
 #define MAX31865_FAULT_HIGHTHRESH     0x80
 #define MAX31865_FAULT_LOWTHRESH      0x40
 #define MAX31865_FAULT_REFINLOW       0x20
 #define MAX31865_FAULT_REFINHIGH      0x10
 #define MAX31865_FAULT_RTDINLOW       0x08
 #define MAX31865_FAULT_OVUV           0x04
 /***************************************************************************************/
 
 //---------------------------------------
 // Call this function to read a 16bit value from a register pair
 uint16_t MAX31865_read16(int regno)
 {
 uint16_t rtd;
 
 output_low(MAX31865_CS);
 delay_us(1);
 spi_xfer(MAX,regno,8); //send the register number
 rtd = spi_xfer(MAX,0L,16);  // clock out 16 dummy bits and read the reply
 delay_us(1);
 output_high(MAX31865_CS);
 return(rtd);
 }
 
 // Call this function to read an 8bit value from a register
 uint8_t MAX31865_read8(int regno)
 {
 uint8_t rtd;
 
 output_low(MAX31865_CS);
 delay_us(1);
 spi_xfer(MAX,regno,8); //send the register number
 rtd = spi_xfer(MAX,0,8);  // clock out 8 dummy bits and read the reply
 delay_us(1);
 output_high(MAX31865_CS);
 return(rtd);
 }
 
 //specific version for data register
 #define MAX31865_read_data() MAX31865_read16(MAX31856_RTDMSB_REG)
 
 //---------------------------------------
 // Call this function to write a 8-bit value
 // to a MAX31865 register.
 void MAX31865_write_register(uint8_t reg_address,uint8_t value)
 {
 output_low(MAX31865_CS);
 delay_us(1);
 spi_xfer(MAX,reg_address,8);
 spi_xfer(MAX,value,8);
 delay_us(1);
 output_high(MAX31865_CS);
 }
 
 //Resistance to degrees celcius - your PIC does not support a double type
 float CallendarVanDusen(float r)
 {
 
 float a     = 3.9083E-03;
 float b     = -5.7750E-07;
 float R0    = 100;//bij 0C
 float deel1 = -R0*a;
 float deel2 = ((R0*a)*(R0*a));
 float deel3 = 4*(R0*b*(R0-r));
 float deel4 = 2*R0*b;
 float deel5 = sqrt(deel2 - deel3);
 
 float temp = (deel1+deel5)/deel4;
 if(r == 0) temp =0;
 delay_us(1);
 return (temp);
 }
 
 void MAX31865_init(void)
 {
 MAX31865_write_register(MAX31856_CONFIG_REG_WRITE,0xC3);//BIAS, AUTO, 50Hz
 delay_ms(63); //minimum 62.5mSec before a result can be read
 }
 
 | 
 
 Remember needs to be a 3.3v PIC.
 |  |