在上两章中,我们已经配置了相应的GPIO和SPI功能。这里说一下MAX6675如何读取温度。
从MAX6675手册中我们可以看到,当==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(待发送数据)
当==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);
}
}