ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

STM32 SPI通信协议3——读取MAX6675温度传感器

2026/9/14 5:56:12 拓冰建站 浏览量
STM32 SPI通信协议3——读取MAX6675温度传感器

         在上两章中,我们已经配置了相应的GPIO和SPI功能。这里说一下MAX6675如何读取温度。

 

        从MAX6675手册中我们可以看到,当\overline{CS}==0的时候SCK启动,数据线开始发送信息,此时可以读取数据,当数据读完后,再拉高电平停止发送。

int main(void)
{u16 max6675;SPI1_Configuration();while(1){MAX6675_CS_LOW;max6675 = SPI_read();MAX6675_CS_HIGH;}
}
#ifndef __BSP_SPI_H__
#define __BSP_SPI_H__
#include <stm32f10x.h>#define MAX6675_CS_LOW GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET)
#define MAX6675_CS_HIGH GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_SET)void SPI1_Configuration(void);
u16 SPI_read(void);
#endif

    SPI_I2S_SendData():通过外设SPIx发送一个数据。

参数一:SPIx,例如SPI1,SPI2。

参数二:Data(待发送数据)

        当\overline{CS}==0的时候,MAX6675启动,此时你需要发送一个激励给他,让他启动,启动后MAX6675开始发送数据,这时候就要用到SPI_I2S_ReceiveData开始接收数据。

        SPI_I2S_ReceiveData():通过SPIx接收数据。

参数一:SPIx,例如SPI1,SPI2。

u16 SPI_read(void)
{SPI_I2S_SendData(SPI1,0x00);return SPI_I2S_ReceiveData(SPI1);
}

        SPI_GetFlagStatus():判断SPI标志位。

参数一:SPIx,例如SPI1,SPI2。

参数二:SPI_FLAG,待检查的SPI标志位

SPI_FLAG描述
SPI_FLAG_BSY忙标志位
SPI_FLAG_OVR超出标志位
SPI_FLAG_MODF模式错位标志位
SPI_FLAG_CRCERRCRC错误标志位
SPI_FLAG_TXE发送缓存空标志位
SPI_FLAG_RXNE接受缓存非空标志位

        无论是发送还是接收都要判断一下标志位,因为串行通信的缓冲区只有一个,即是发送缓冲区,也是接收缓冲区。所以我们要判断一下标志位看一下标志位是否为空(使用SPI_FLAG_TXE),如果不为空就一直等待。接收的时候也是如此。

u16 SPI_read(void)
{while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);SPI_I2S_SendData(SPI1,0x00);while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);return SPI_I2S_ReceiveData(SPI1);
}

从MAX6675的数据手册能看到D15是虚假的位,D14-D3是我们的温度数据位,D2在正常工作时为0(低电平)。

温度值=1023.75*转换后的数字量/4095

int main(void)
{u16 max6675;u16 temp;float temperature;unsigned int flag_D2;SPI1_Configuration();Uart1_Configuration();while(1){MAX6675_CS_LOW;max6675 = SPI_read();MAX6675_CS_HIGH;flag_D2=(max6675 & 0x4); //取出max6675的第2位if(flag_D2 == 0){temp=max6675 << 1;temp=temp>>4;temperature=temp*=0.25;printf("Temperature = %4.2f\n",temperature);}elseprintf("MAX6675 Sensor is broken\n");Delay_s(1);}}