请教大家一个温度检测程序

2019-07-20 16:38发布

我想用STM32F4读取MAX31855的温度(SPI读取),然后用串口显示在PC机上面,主要部分已经写上,能不能帮我参考一下,看正不正确。

#include "MAX31855.h"
/*********************************************************************************
 * 文件名  :MAX31855.c
 * 描述    :通过stm32的spi1读取max31855的温度值,并通过uart1发送出来
 *          
 * 实验平台:STM32开发板
 * 库版本  :ST4.0.0
 * 硬件连接: ------------------------------------
 *           |PA5-SPI1-SCK :MAX31855-SCK         |
 *           |PA6-SPI1-MISO:MAX31855-SO          |        
 *           |PC5-SPI1-CNV :MAX31855-CS          |
 *            ------------------------------------
**********************************************************************************/


void SPI_MAX31855_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;

//时钟使能  SPI/GPIOA时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
/* ---------通信I/O初始化----------------
* PA5-SPI1-SCK :MAX31855_SCK
* PA6-SPI1-MISO:MAX31855_SO
*
*/
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5|GPIO_Pin_6; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推免输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化I/O口

/* ---------控制I/O初始化----------------*/
/* PC5-SPI1-NSS:MAX31855_CS */ // 片选
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推免输出
GPIO_Init(GPIOC, &GPIO_InitStructure);  
GPIO_SetBits(GPIOC, GPIO_Pin_5); // 先把片选拉高,真正用的时候再拉低

/* SPI1 配置 */ 
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;  //定义波特率预分频的值:波特率预分频值为8
SPI_InitStructure.SPI_CPHA = SPI_CPOL_Low; //串行同步时钟的空闲状态为低电平
SPI_InitStructure.SPI_CPOL = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制

SPI_Init(SPI1,&SPI_InitStructure); //初始化SPI

/* 使能 SPI1  */
SPI_Cmd(SPI1, ENABLE); 
}



unsigned char MAX31855_ReadByte(void)
{


while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET); //等待发送区空  

SPI_I2S_SendData(SPI1, 0xff); //通过外设SPIx发送一个byte  数据

while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); //等待接收完一个byte

return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据
}

#include "sys.h"
#include "usart1.h"
#include "stdio.h"
#include "delay.h"
#include "MAX31855.h"

//#define MAX31855_CS GPIO_Pin_4
#define MAX31855_CSL() GPIO_ResetBits(GPIOC,GPIO_Pin_5) // GPIOA->BRR = MAX31855_CS;
#define MAX31855_CSH() GPIO_SetBits(GPIOC,GPIO_Pin_5) // GPIOA->BSRR = MAX31855_CS;

int main(void)
{
  unsigned int t1,t2,i; //i32位,原始数据,t1,t2中间变量
unsigned short int c; //每次SPI读取的数据(16位)            unsigned char c;
unsigned char flag;
float thermocouple_temprature; //热电偶温度数据
float internal_temprature; //参考端温度数据
/* 配置系统时钟为168M */
SystemInit();
    delay_init(168); //初始化延时函数
/* MAX6675 SPI 接口初始化 */
SPI_MAX31855_Init();
USART1_Config();

while(1)
{

MAX31855_CSL(); //片选
c = MAX31855_ReadByte(); //读取高16位数据
i = c;
i = i<<16; //读取高16位数据存储在高16位
c = MAX31855_ReadByte();
MAX31855_CSH();

i = i|c; //i是读出来的原始数据
flag = i&0x00010000; //flag保存了热电偶故障状态 D16位
t1 = i<<1;
t1 = t1>>19; //热电偶温度数据
t2 = i<<17;
t2 = t2>>21; //参考端温度数据
thermocouple_temprature = t1*0.25; //热电偶端温度
internal_temprature = t2*0.0625; //参考端温度

if(i!=0) //max31855有数据返回
{
if(flag==0) //热电偶无故障
{
printf("原始数据是:%04X,  热电偶温度是:%4.2f,参考端温度是:%4.2f。 ",i,thermocouple_temprature,internal_temprature);
}
else //热电偶掉线
{
printf("未检测到热电偶,请检查。 ");
}

}
else //max6675没有数据返回
{
printf("max31855没有数据返回,请检查max31855连接。 ");
}
for(i=0;i<0x2fffff;i++); //max31855的转换时间是0.2秒左右,所以两次转换间隔不要太近
}

}








望指教
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。