当前位置: 首页 > 编程日记 > 正文

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_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);
	}
	
}

相关文章:

ArrayList底层的实现原理

ArrayList底层的实现原理 ArrayList底层是用动态数组实现的 ArrayList初始化容量为0,当第一次添加数据的时候才会初始化为10。 ArrayList在进行扩容的时候是原来容量的1.5倍,每次扩容都需要拷贝数组。 ArrayList在添加数据的时候 确保数组已使用长度size+1之后足够存下下一个数据 计算数组的容量,如果当前数组已使用长度+1后的大于当前的数组长度,则调用grow方法扩容(原来的1.5倍) 确保新增的数据有地方存储之后,则将新

MySQL索引优化实战

对于这种varchar(255)的大字段可能会比较占用磁盘空间,可以稍微优化下,比如针对这个字段的前20个 字符建立索引,就是说,对这个字段里的每个值的前20个字符放在索引树里,类似于 KEY index(name(20),age,position)。此时你在where条件里搜索的时候,如果是根据name字段来搜索,那么此时就会先到索引树里根据name 字段的前20个字符去搜索,定位到之后前20个字符的前缀匹配的部分数据之后,再回到聚簇索引提取出来 完整的name字段值进行比对。

揭秘代理IP:原理、类型及其在大数据抓取中的作用

代理IP的原理:代理服务器作为客户端与目标网站之间的中介,当请求数据时,不是直接由用户的原始IP地址发送到目标网站,而是先发送到代理服务器。- 提升抓取效率:利用多个代理IP实现并发抓取,可以分散请求负载,提高数据采集速度,尤其是在需要大量数据或高频率访问时尤为关键。- 地域定位:某些代理IP能够提供特定地区的IP地址,这使得爬虫能够抓取特定区域的内容,比如针对不同国家或地区的本地化信息。- 绕过反爬机制:通过不断更换代理IP,爬虫可以避免因频繁访问而触发目标网站的反爬策略,从而继续高效地抓取数据。

SpringBoot--过滤器/拦截器/AOP--区别/使用/顺序

​ 本文介绍SpringMVC(SpringBoot)中的过滤器、拦截器、AOP的区别及其用法。​ 如果监听器、过滤器、 拦截器、 AOP都存在,则它们的执行顺序为:监听器 => 过滤器=> 拦截器=> AOP。

开发版ubuntu系统上如何进行开机自启(四种方法一览)

如果省略该字段,则 systemd 将默认将当前服务的启动顺序设置为与其他服务无关,即在启动过程中没有任何依赖性关系,服务的启动顺序由系统自行决定。【ExecStart】 关键字段,服务启动命令,指定服务启动时需要执行的命令或脚本【WantedBy】用于指定服务的自动启动级别,在 Linux 系统中,多用户模式是指允许多个用户同时登录并使用系统资源的模式,与之相对的是单用户模式,只有一个用户可以登录并使用系统资源。保存文件的方法根据所使用的编辑器而有所不同,通常是按下特定的键组合,然后选择保存并退出。

面试官:请说一下Mysql事务实现原理

在日常工作中,数据库是我们必须使用的,其中使用最多的也是大部分中小公司的选择是Mysql,跳槽面试中也是必问的,今天我们就说一下Mysql事务 MySQL中的事务实现原理主要涉及以下几个方面: ACID特性:MySQL支持事务的原因之一是它遵循ACID(原子性、一致性、隔离性和持久性)特性。这意味着

vue模板的首次渲染,和重新渲染,有哪些区别?

搞明白这个,能帮助我们理解开发中出现的很多问题。 一、我们先来回顾一下vue模板的渲染过程: (1)执行render函数,生成虚拟DOM。 render函数是根据render、templete、el这三个选项得来的,优先级依次降低。如果有render函数,则直接使用;否则如果有templete选项,

浅谈6种流行的API架构风格

API在现代软件开发中扮演着重要的角色,它们是不同应用程序之间的桥梁。编写业务API是日常开发工作中最常见的一部分,选择合适的API框架对项目的成功起到了至关重要的作用。本篇文章将浅谈一下当前6种流行的API架构风格的优点、缺点以及适用场景。这些 API 架构风格都各有优点和适用场景,您可以根据具体需求选择适合的架构风格来构建和设计 API。

C++重新认知:拷贝构造函数

对于简单变量来说,可以轻松完成拷贝。但是对于复杂的类对象来说,不仅存在变量成员,也存在各种函数等。因此相同类型的类对象是通过拷贝构造函数来完成复制过程的。可以看到成功拷贝了我们自己设计的String类(),当然这段代码是存在问题的我们可以看到两块指向m_buffer内存地址相同,所以会出现多次析构的情况(即a对象析构完了,将m_buffer释放掉后,因为b对象指向的也是m_buffer区域又要释放一次已经释放掉的),这也是浅拷贝,下面会详细讲解浅拷贝和深拷贝。

你了解计算机网络的发展历史吗?

计算机网络是指将一群具有独立功能的计算机通过被互联起来的,在通信软件的支持下,实现的系统。计算机网络是计算机技术与通信技术紧密结合的产物,两者的迅速发展渗透形成了计算机网络技术。简而言之呢,计算机网络就是实现两台计算机相互沟通的介质。

C#实现Excel合并单元格数据导入数据集

C#实现Excel合并单元格数据导入数据集

鸿蒙开发-ArkTS基础,它与TS区别在那?

ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。说明: 也就是前端开发过程中所有的js/ts语法大部分支持的,比如es6中的箭头函数-模板字符串-promise-async/await-数组对象方法- 注意: 根据对下一代的Next版本的内部沟通,下一版本的ArkTs对类型最了更一步的限制。

一文详解TensorFlow模型迁移及模型训练实操步骤

当前业界很多训练脚本是基于TensorFlow的Python API进行开发的,默认运行在CPU/GPU/TPU上,为了使这些脚本能够利用昇腾AI处理器的强大算力执行训练,需要对TensorFlow的训练脚本进行迁移。

Android Studio点击Run背后发生了什么

当点击Run的时候到底发生了什么呢

Docker的介绍及安装&基本操作命令

在讲到Docker之前,我们先了解虚拟机与容器之间的区别VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;容器,在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。特性容器虚拟机启动秒级分钟级硬盘使用一般为MB一般为GB性能接近原生弱于系统支持量单机支持上千个容器一般几十个。

即将消失的五种编程语言?

学习路径困难必然导致非常有限的活跃用户,而 Haskell 的上一个最新的稳定版本是在 2010 年发布,这对于促进它本身的发展无济于事。Perl 于 1987 年开始流行时,它被誉为是适合任何一个人的编程语言,曾经有一段时间,每个人都用Perl编程,但是后来发生了一些事情,开发者开始在不知道原因的情况下添加越来越大的功能,也许这增加了了问题的复杂性。甚至它的作者似乎已经含蓄地解释了Perl的一些问题,并选择停止从2000年开始的Perl 6开发,关键是,似乎现在也没人想要在用Perl。

JAVA中线程的run()和start()有什么区别?

run() 方法:start() 方法:区别总结:结语我的其他博客在Java中,线程的 和 是与多线程编程相关的两个方法,它们有着不同的作用和用法。 方法是 类的一个普通方法,用于定义线程的主体逻辑。当直接调用 方法时,该方法会在当前线程的上下文中执行,而不会创建新的线程。直接调用 方法,不会实现多线程的并发执行,而只是在当前线程中按照顺序执行 方法的内容。 方法: 方法是 类的一个

一文带你吃透JSP,增删改查实战案例详细解读

不得不说,JSP 现在已经是一门十分老旧的技术了,学习编程时,不仅要学习优秀的前言技术,还要对基础有一定的把握,所以学习 JSP 时,我们只做了解,不用刨根问底花费大量的时间,得不偿失。理解 JSP 及其原理学会使用 EL 表达式和 JSTL 标签理解 MVC 模式和三层架构(重点)学习 JSP 到什么程度呢?我们只需要能够使用 JSP 相关技术能够实现简单数据的增删改查即可。_jsp实现增删改查

教新手解决api-ms-win-crt-runtime-l1-1-0.dll丢失问题,简单有效修复dll文件问题

在使用电脑的过程中突然提示api-ms-win-crt-runtime-l1-1-0.dll错误的信息,那么出现在这样的问题有什么办法可以很好的解决api-ms-win-crt-runtime-l1-1-0.dll错误呢?今天就教大家解决api-ms-win-crt-runtime-l1-1-0.dll错误的几种办法,比较适合不懂电脑的萌新宝宝!如果你电脑电脑出现了这样的问题那么可以来试试吧!

vue+element ui实现图片上传并拖拽进行图片排序

vue+element ui实现图片上传并拖住进行图片排序

Linux安装MongoDB教程

将解压后的 mongodb-linux-x86_64-rhel70-4.2.23 中的所有文件全部移动到 /usr/local/mongodb 中 :注意/*是所有子文件。也可以不用设置环境变量进行启动,但是不设置环境变量启动的话要每次启动写很多启动参数,比较麻烦,所以做好配置环境变量。在 mongodb 下创建 data 和 logs 目录,以及日志文件mongodb.log。在 /usr/local 目录中创建 mongodb 文件夹。启动 MongoDB(-conf 使用配置文件方式启动)

websocket介绍并模拟股票数据推流

Websockt是一种网络通信协议,允许客户端和服务器双向通信。最大的特点就是允许服务器主动推送数据给客户端,比如股票数据在客户端实时更新,就能利用websocket。

IDEA中在Java项目中添加Web模块 与配置tomcat服务器

现有项目添加直接走第二步。

将 OpenCV 与 gdb 驱动的 IDE 结合使用

能力这个漂亮的打印机可以显示元素类型、标志和(可能被截断的)矩阵。众所周知,它可以在 Clion、VS Code 和 gdb 中工作。Clion 示例安装移入 .放在方便的地方,重命名并移动到您的个人文件夹中。将“source”行更改为指向您的路径。如果系统中安装的 python 3 版本与 gdb 中的版本不匹配,请使用完全相同的版本创建一个新的虚拟环境,相应地安装并更改 python3 的路径。用法调试器中以前缀为前缀的字段是为方便起见而添加的伪字段,其余字段保持原样。

Windows Copilot 更新及使用教程

GitHub Copilot 是一款基于机器学习的代码生成工具,可以帮助开发者快速生成高质量的代码。以下是 Windows Copilot 的更新及使用教程:

Linux之后台执行命令:nohup和&的使用

如果不将 nohup 命令的输出重定向,输出将附加到当前目录的 nohup.out 文件中。command>out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到out.file文件中。作业在后台运行的时候,可以把输出重定向到某个文件中,相当于一个日志文件,记录运行过程中的输出。将sh test.sh任务放到后台,但是依然可以使用标准输入,

Python实现PDF—>Excel的自动批量转换(附完整代码)

tkinter适用于简单的 GUI 应用,对于入门级开发者和小型项目而言是一个良好的选择。PyQt、PySide、Kivy 和 wxPython 适用于需要更丰富功能、更现代外观或跨平台移动应用的项目,但可能需要更多学习和配置。选择 GUI 库的最佳方法取决于项目的需求、开发者的经验水平以及对不同库的个人偏好。

Linux系统中Java new Date()的时间和系统时间不一致

出现问题:new Date(),的时间和当前时间不一样,发现差了8小时,看到8小时就应该明白了,时区的问题。

CentOS 7 设置 Jar包、MinIO、Nginx 开机自启动

根据需要,自己修改 Description 和 ExecStart 的内容即可(ExecStart后面的java命令需要全路径)ExecStart 服务运行执行的命令,放上面创建的脚本位置。[Install] 服务安装的相关设置,可设置为多用户。如果用 yum install 命令安装的,如果使用源码手动编译的则需要手动创建。文件,xxx 就是自定义的服务名称。After:设置在某个服务启动后启动。Description:服务的描述。可以使用这个命令来查看服务启动日志。里面的环境变量是必须的,将。

linux中&和&&,|和||及分号(;)的用法

在linux中,我们经常会用到&和&&,|和||及分号,但是好多人对其会混淆,不明白其中的意思,今天为大家讲解一下&和&&,|和||及分号(;)各自的说明和用法。