MAX6675 带冷端补偿的热电偶测温芯片驱动-基于STM32 HAL库

MAX6675 简介

MAX6675 是一款带冷端补偿的热电偶测温芯片,通过3线SPI总线直接输出热电偶测量温度值。
引脚如下:
MAX6675 带冷端补偿的热电偶测温芯片驱动-基于STM32 HAL库_第1张图片
与单片机连接关系如下:
MAX6675 带冷端补偿的热电偶测温芯片驱动-基于STM32 HAL库_第2张图片
通信时序与数据格式如下:
MAX6675 带冷端补偿的热电偶测温芯片驱动-基于STM32 HAL库_第3张图片


MAX6675 驱动max6675.c

#include "max6675.h"
SPI_HandleTypeDef hspi2;

/* SPI2 init function */
void SPI2_Init(void)
{
  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi2) != HAL_OK)
  {
    Error_Handler();
  }
}

void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(spiHandle->Instance==SPI2)
  {
    __HAL_RCC_SPI2_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**SPI2 GPIO Configuration
    PB13     ------> SPI2_SCK
    PB14     ------> SPI2_MISO
    PB15     ------> SPI2_MOSI
    */
    GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_14;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  }
}

void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
{
  if(spiHandle->Instance==SPI2)
  {
    __HAL_RCC_SPI2_CLK_DISABLE();
    /**SPI2 GPIO Configuration
    PB13     ------> SPI2_SCK
    PB14     ------> SPI2_MISO
    PB15     ------> SPI2_MOSI
    */
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
  }
}

//MAX6675 片选引脚初始化
void GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOB_CLK_ENABLE();

  HAL_GPIO_WritePin(GPIOB, MAX6675_CS_Pin, GPIO_PIN_SET);
  /*引脚配置 */
  GPIO_InitStruct.Pin = MAX6675_CS_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

/**
  * @brief  max66675模块初始化
  * @param  None
  * @retval None
  */
void MAX6675_Init(void)
{
  GPIO_Init();  //片选引脚初始化
  SPI2_Init();  //spi总线初始化
} 
 
/**
  * @brief  max6675模块读写一个字节的数据
  * @param  txData:要发送的数据
  * @retval 接收到的数据
  */
uint8_t MAX6675_ReadWriteByte(uint8_t txData)
{		
  unsigned char txdata,rxdata;
  txdata = txData;
  HAL_SPI_TransmitReceive(&hspi2,&txdata,&rxdata,1,1000);
  return rxdata;
}  
 
/**
  * @brief  max6675模块读取测得的原始数据
  * @param  None
  * @retval 温度的原始数据
  */
uint16_t MAX6675_ReadRawValue(void)
{
  uint16_t tmp;
  MAX6675_CS(0);
  tmp = MAX6675_ReadWriteByte(0XFF); //read MSB
  tmp <<= 8;
  tmp |= MAX6675_ReadWriteByte(0XFF); //read LSB
  
  MAX6675_CS(1);
  
  if (tmp & 4) 
  {
    // thermocouple open
    tmp = 4095; //未检测到热电偶
  }
  else 
  {
    tmp = tmp >> 3;
  }
  return tmp;
}
 
/**
  * @brief  max6675模块读取温度
  * @param  None
  * @retval 温度值(单位:℃)
  */
float MAX6675_ReadTemperature(void)
{
  return (MAX6675_ReadRawValue() * 1024.0 / 4096);
}

//MAX6675 片选控制
void MAX6675_CS(unsigned char choose)
{
  if(choose == 1)
  {
    HAL_GPIO_WritePin(GPIOB, MAX6675_CS_Pin, GPIO_PIN_SET);
  }
  else
  {
    HAL_GPIO_WritePin(GPIOB, MAX6675_CS_Pin, GPIO_PIN_RESET);
  }
}

MAX6675 驱动max6675.h

#ifndef _MAX6675_H_ 
#define _MAX6675_H_
#include "stm32f1xx_hal.h"
#define MAX6675_CS_Pin GPIO_PIN_12
#define MAX6675_CS_GPIO_Port GPIOB
extern SPI_HandleTypeDef hspi2;

void SPI2_Init(void);
void MAX6675_Init(void);			 //初始化max6675模块 
uint8_t MAX6675_ReadWriteByte(uint8_t txData); //max6675模块读写一个字节
uint16_t MAX6675_ReadRawValue(void);
float MAX6675_ReadTemperature(void);
void MAX6675_CS(unsigned char choose);
#endif

main.c

#include "max6675.h"
int main(void)
{
  float K_Temperature ; //K型热电偶 温度值
  HAL_Init();
  SystemClock_Config();
  MAX6675_Init();       //K型热电偶初始化
  while(1)
  {
	K_Temperature = MAX6675_ReadTemperature();  //读取热电偶温度值
	HAL_Delay(1000);
  }
}

你可能感兴趣的:(STM32,个人笔记,随笔,stm32,spi,单片机)