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

发布时间:2024年01月13日

?????????在上两章中,我们已经配置了相应的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);
		}
	    else
			printf("MAX6675 Sensor is broken\n");
		Delay_s(1);
	}
	
}

文章来源:https://blog.csdn.net/m0_73671341/article/details/134828591
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。