Giter Club home page Giter Club logo

stm32-max31855's Introduction

STM32 MAX31855

STM32 library for MAX31855 temperature sensor using HAL and SPI

proof of concept

Example:

 /* USER CODE BEGIN 2 */
	MAX31855_Init(&MAX31855_Handle, &hspi3,SPI3_NSS_GPIO_Port, SPI3_NSS_Pin);
	uint32_t Timer = HAL_GetTick();
 /* USER CODE END 2 */
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
	while (1) {

		if ((HAL_GetTick() - Timer) > 1000) {
			MAX31855_ReadData(&MAX31855_Handle);
			if(!MAX31855_GetFault(&MAX31855_Handle))
			{
			printf("Temperature: %f\r\nInternal temperature: %f\r\n", MAX31855_GetTemperature(&MAX31855_Handle),MAX31855_GetTemperatureInFahrenheit(&MAX31855_Handle));
			}
			Timer = HAL_GetTick();
		}
		/* USER CODE END WHILE */
		/* USER CODE BEGIN 3 */
	}
 /* USER CODE END 3 */

SPI Settings:

Options Value
Mode Full-Duplex Master
Frame Format Motorola
Data Size 8 Bits
First Bite MSB First
Clock Polarity (CPOL) Low
Clock Phase (CPHA) 1 Edge

If using SPI in "Receive only the Master" mode, see this case: #1

For using printf with float is needed add -u _printf_float in MCU GCC linker

stm32-max31855's People

Contributors

simplemethod avatar

Stargazers

 avatar

Watchers

 avatar  avatar

stm32-max31855's Issues

If you are using SPI mode "Receive Only Master" on STM32 F4 read this!

If you are using SPI in "Receive Only Master" mode you will most likely not be able to read the data properly.
In my case the problem was with the SCK line was always in high state and loss of the first data frame.
The solution to the problem is to set the SCK pin to "pull-down" and read array on first element instead of zero. An additional safeguard is to restart the SPI interface as advised in the thread:
https://www.eevblog.com/forum/microcontrollers/stm32-spi-slave-inconsistent/
Below is the prepared code for this mode, be sure you change __HAL_RCC_SPI3_FORCE_RESET and __HAL_RCC_SPI3_RELEASE_RESET to the correct SPI used in your project

void MAX31855_ReadData(MAX31855_StateHandle *MAX31855){
/* Code from the thread: https://www.eevblog.com/forum/microcontrollers/stm32-spi-slave-inconsistent/ Author: DavidAlpha*/
if((MAX31855->hspi->State>HAL_SPI_STATE_READY) && (MAX31855->hspi->State<HAL_SPI_STATE_ERROR)){	// Handler BUSY in any mode (But not error or reset);
MAX31855->hspi->State=HAL_SPI_STATE_READY;	// Force ready state
}
if((MAX31855->hspi->Instance->SR & SPI_SR_BSY) || (MAX31855->hspi->State!=HAL_SPI_STATE_READY)){	// If peripheral is actually busy or handler not ready
	MAX31855->hspi->State=HAL_SPI_STATE_RESET;	// Force reset state (HAL_SPI_Init will fail if not in reset state)
 
	__HAL_RCC_SPI3_FORCE_RESET();		// Change to the SPI used in the project
	asm("nop\nnop\nnop\nnop");		// Wait few clocks just in case
	while(MAX31855->hspi->Instance->SR & SPI_SR_BSY);	// Wait until Busy is gone
	__HAL_RCC_SPI3_RELEASE_RESET();		// Change to the SPI used in the project
	asm("nop\nnop\nnop\nnop");		// Wait few clocks just in case
	while(MAX31855->hspi->Instance->SR & SPI_SR_BSY);	// Check again
	if (HAL_SPI_Init(MAX31855->hspi) != HAL_OK){ Error_Handler(); }		// Re-init SPI
/**/		
	
uint8_t payload[5];
int32_t frame;
MAX31855_SetNSSState(MAX31855,GPIO_PIN_RESET);
HAL_SPI_Receive(MAX31855->hspi, payload, 5, 1000);
MAX31855_SetNSSState(MAX31855,GPIO_PIN_SET);
MAX31855->scvFault=0;
MAX31855->scgFault=0;
MAX31855->ocFault=0;
MAX31855->fault=0;
MAX31855->extTemp=0;
MAX31855->extTempSign=0;
MAX31855->intTemp=0;
MAX31855->intTempSign=0;
 
frame = payload[1];
frame = frame<<8;
frame = frame|payload[2];
frame = frame<<8;
frame = frame|payload[3];
frame = frame<<8;
frame = frame|payload[4];
int32_t extTemp=frame;
int32_t intTemp=frame;
 
if(frame& 0b00000000000000000000000000000100)
{
MAX31855->scvFault=1;
}
if(frame& 0b00000000000000000000000000000010)
{
MAX31855->scgFault=1;
}
if(frame& 0b00000000000000000000000000000001)
{
MAX31855->ocFault=1;
}
if(frame&0b00000000000000010000000000000000)
{
MAX31855->fault=1;
}
if(frame&0b10000000000000000000000000000000)
{
MAX31855->extTempSign=1;
}
if(frame&0b00000000000000010000000000000000)
{
MAX31855->intTempSign=1;
}
 
extTemp>>=18;
if (MAX31855->intTempSign) {
extTemp = ~(extTemp & 0b11111111111111);
}
MAX31855->extTemp=extTemp;
 
intTemp = ((intTemp>>4) & 0b11111111111);
if (MAX31855->intTempSign)
{
intTemp=~(intTemp|0b1111100000000000); //Experimental code, not tested!
}
MAX31855->intTemp=intTemp;	
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.