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_CRCERR CRC错误标志位
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);
	}
	
}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-13 07:52:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-13 07:52:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-13 07:52:04       87 阅读
  4. Python语言-面向对象

    2024-01-13 07:52:04       96 阅读

热门阅读

  1. LintCode 1098 · Path Sum IV (二叉树遍历好题)

    2024-01-13 07:52:04       52 阅读
  2. 【数据库系统概论】期末复习4

    2024-01-13 07:52:04       62 阅读
  3. Android事件冲突原理及解决方法

    2024-01-13 07:52:04       60 阅读
  4. LoadBalancer 替换 Ribbon

    2024-01-13 07:52:04       52 阅读
  5. flink创建表报错

    2024-01-13 07:52:04       56 阅读
  6. python连接sqlite3工具类

    2024-01-13 07:52:04       56 阅读
  7. 贪心算法part01 算法

    2024-01-13 07:52:04       58 阅读