STM32+MAX6675利用SPI获取实时温度数据程序及代码
发布日期:2022-01-20 01:07:33 浏览次数:3 分类:技术文章

本文共 4113 字,大约阅读时间需要 13 分钟。

本文采用的芯片为STM32F103RCT6

温度芯片为MAX6675

模拟spi之前写过

里面的部分代码摘取的正点原子的函数库:sys、uart、delay等文件

原理图

在这里插入图片描述

max6675.h
#ifndef __MAX6675_H#define __MAX6675_H #include "stm32f10x.h"#include "sys.h" void max6675_init(void);			 //初始化max6675模块 u8 max6675_readWriteByte(u8 TxData);u16 max6675_readbits_II(void);float max6675_readTemp(void); #endif
max6675.c
#include "max6675.h"#include "spi.h"#include "sys.h" #include "delay.h"#include "usart.h"	/*max6675初始化程序*/void max6675_init(void){
GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PB12推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB12 GPIO_SetBits(GPIOB,GPIO_Pin_12); //PB12上拉}u8 max6675_readWriteByte(u8 TxData){
/* 接受SPI2返回数据 */ return SPI2_ReadWriteByte(TxData);} u16 max6675_readbits_II(void){
u16 d; GPIO_ResetBits(GPIOB,GPIO_Pin_12) ;//开CS d=max6675_readWriteByte(0xFF); d<<=8; d |=max6675_readWriteByte(0xFF); GPIO_SetBits(GPIOB,GPIO_Pin_12); if (d&0X04) {
d = 0; //未检测到热电偶 printf("未检测到热电偶2\n"); } else {
d<<=1;//去掉D15位 d>>=4;//去掉D0、1、2位 } return d; } float max6675_readTemp(void){
u16 d; float i,S; S=1; delay_ms(300); d=max6675_readbits_II(); i=d*1023.75/4095/S; return i; }
spi.h
#ifndef __SPI_H#define __SPI_H#include "sys.h"void SPI2_Init(void);			 //初始化SPI2口void SPI2_SetSpeed(u8 SpeedSet); //设置SPI2速度   u8 SPI2_ReadWriteByte(u8 TxData);//SPI总线读写一个字节		 #endif
spi.c
//SPI2初始化void SPI2_Init(void){
GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB13/14/15上拉 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串行同步时钟的空闲状态为低电平 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式 SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 SPI_Cmd(SPI2, ENABLE); //使能SPI外设} void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler){
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler)); SPI2->CR1&=0XFFC7; SPI2->CR1|=SPI_BaudRatePrescaler; //设置SPI2速度 SPI_Cmd(SPI2,ENABLE); } u8 SPI2_ReadWriteByte(u8 TxData){
u8 retry=0; while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位 {
retry++; if(retry>200)return 0; } SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据 retry=0; while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位 {
retry++; if(retry>200)return 0; } return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据 }
main.c
#include "stm32f10x.h"#include "usart.h"	#include "delay.h"#include "sys.h"#include "max6675.h"#include "spi.h"int main(void){
float t2; SystemInit(); //LED_init(); delay_init(); uart_init(9600); max6675_init(); SPI2_Init(); SPI2_SetSpeed(SPI_BaudRatePrescaler_8);//max6675的串行时钟频率为4.3Mhz while(1){
t2=max6675_readTemp(); printf("the II temperature is:%.2f\n",t2); printf("\n"); }}

测得的模拟的IO和实际spi的温度还是有差距的:

温度1为模拟spi
温度2为实际spi

在这里插入图片描述

代码中存在差距的原因:模拟SPI后续需要改进的地方
在上一个代码中:
在这里插入图片描述

转载地址:https://blog.csdn.net/answerMack/article/details/83310370 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:stm32+增量式pid+max6675 PWM温度控制
下一篇:STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月14日 21时44分08秒