【STM32+cubemx】0013 HAL库开发:SPI总线访问气压计BMP280/BME280
本节我们介绍stm32的SPI总线接口,并使用SPI接口来访问气压计BMP280。
1)SPI基础知识
SPI(Serial Peripheral Interface)串行外围设备接口,是一种高速的,全双工,同步的通信总线,一般需要四根线:
MISO:主器件数据输入,从器件数据输出;
MOSI:主器件数据输出,从器件数据输入;
SCK:时钟信号,由主设备控制发出,MISO和MOSI上的数据在SCK信号的跳变沿发送变化;
CS(stm32中称为NSS):片选信号,由主设备控制,当CS为低电平时,表示选中从器件,主器件可以与该从器件通信。
当SPI总线上只有一个从设备时,可以把从机的片选直接接地,也即一直选中:
当SPI总线上有多个从器件时,需要给每个从设备分配一个CS信号,以保证可以和每个从设备独立通信,而其他三根线可以共用,如下图所示:
(这里我们只讲最常用的SPI总线,有3线制的,还有接线为菊花链式的不在本文讨论范围)
SPI的时钟和数据的关系可以有四种模式:
时钟极性(CPOL)定义了时钟空闲状态电平:
CPOL=0:空闲时,时钟为低电平;
CPOL=1:空闲时,时钟为高电平。
时钟相位(CPHA)定义数据的采集时间:
CPHA=0:在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样;
CPHA=1:在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。
四种模式的区别,如下图所示:
使用前我们需要依据从设备的要求,把主设备设置为相同的模式。
标准的4线制SPI总线是全双工通信。
从上面的图中,我们也可以看出,MOSI和MISO是同时在传输数据的,实际上,每个时钟周期,主设备都会向从设备传输1bit数据,而同时从设备也向主设备传输了1bit数据。只是,当主设备向从设备写入数据的时候,我们只关心MOSI的数据;而当主设备读取从设备的数据时,我们只关心MISO的数据。
以气压传感器BMP280为例,它用SPI接口通信时,时序要求如下图:
则我们使用stm32的SPI接口和它通信时,需要设置为CPOL=1空闲时,时钟为高电平、CPHA=1在时钟的第二个跳变沿进行数据采样。
2)stm32的SPI总线使用
Stm32带了硬件SPI,下面我们就使用stm32的硬件SPI读取气压计BMP280的数据。
我们仍然以串口的工程为基础,在它上面添加设置,如下图,选择SPI接口:
需要设置的包括:
Mode:选择全双工主设备(因为我们的stm32是主控,BMP280是从设备;全双工就是我们前面讲的4线制SPI,收、发各用一条线;也用收发共用一条线的,那么就是半双工,3线制SPI);
Prescaler:设置分频系数,即SPI总线的时钟频率(BMP280手册中要求不大于10M);
CPOL和CPHA:前面有详细说过,不罗嗦了;
NSS:CS片选这里使用软件方式,主要是软件方式可以适应挂载多个从设备,以后移植起来方便很多;片选设置为软件方式就是用软件控制一个IO口作为CS信号,所以还要设置一个输出的GPIO,图中设置的是PA4。
设置完成后,芯片引脚的PA4、5、6、7被占用为SPI的几个信号线。
在硬件连接上,我们把BMP280也按四线制SPI方式连接,如下图:
CSB连接到PA4,SCK连接到PA5,SDO连接到PA6,SDI连接到PA7
生成工程代码,在keil中打开。Stm32的hal库已经将SPI的初始化、SPI的读写操作封装成了函数,我们直接调用即可。
首先在main主循环之前,增加如下代码,拉高PA4(即拉高片选CS,初始状态不选中):
之后添加如下代码,读取BMP280的芯片id并打印:
操作过程是先拉低片选CS线,再访问从设备,访问完毕后拉高CS线。
主要讲讲访问从设备的HAL_SPI_TransmitReceive这个函数,用于读取从设备的的数据。
该函数的第二个参数是要发送的数据首地址,第三个参数是接收数据存放的首地址,第四个参数是要传输的数据字节数,最后是超时。
我们结合BMP280读取数据的方法来看:
按照数据手册,读取数据时,先发送寄存器地址(一个字节),然后之后从机就会回传数据(多个字节)。
这里要注意一下,因为4线制的SPI总线,本质上是主设备和从设备在数据交换。
BMP280的芯片id存放在其寄存器地址0xD0处,所以把0xD0存到tx_data的第一个字节处,后面的我们不关心,因为只有第一个字节是起作用的。
HAL_SPI_TransmitReceive执行完之后,从机发来的数据存放在rx_data中,由于从机返回的数据是从第二个字节开始有效的,所以从机发来的数据是从rx_data[1]开始的。
我们“交换”了两个字节数据,从机返回的一个字节数据在rx_data[1]中。
程序运行结果如下,可以看到成功读取到了BMP280的id值0x58:
能够通过SPI成功读取BMP280芯片内的数据,我们就已经成功了一大半。之后的操作只需要启动转换、读取数值计算结果,就可以获取气压值了。
启动转换的过程如下,即是往0x74寄存器地址写入0xff,操作过程如下:
(注意这一步是必须的,否则回读的气压数据会一直不变化。)
然后就是读取数值、计算气压结果了;这里也需要几步,先要从芯片内读取已经存好的校准参数,然后读取芯片内的AD转换值,最后依据手册中给出的公式计算出温度、气压值结果。
读取校准参数和AD转换值的过程也是用HAL_SPI_TransmitReceive这个函数,限于篇幅就不贴代码了,可以到文末获取完整工程代码。
实测气压的分辨率很高,上下移动电路板10cm就能出现比较稳定的气压变化,实际中很多情况下用来测量相对高度的变化。另外说一下BMP280同系列的BME280,还具有测量湿度的功能。
3)SPI和I2C的比较
SPI相比与I2C,需要的信号线要多一些,而且从设备越多则需要占用更多的CS线;
但是SPI的速率可以快很多,一般达到几M的速率是没问题的,而I2C一般到几百k就比较吃力了,这主要是因为I2C的高电平是靠电阻上拉实现的,而SPI总线的状态都是靠IO口推挽结构实现。
几乎所有的芯片,如果有I2C功能都会同时支持SPI功能,大家可以依据具体场景选择合适的来使用。
本文中完整工程代码可以在下面下载:
土豪通道:test12_SPI.zip-嵌入式文档类资源-CSDN下载
非土豪通道:关注公众号,留言 “资料” 可直接获取相关资料和软件:
【STM32+cubemx】0013 HAL库开发:SPI总线访问气压计BMP280/BME280相关推荐
- STM32系列之HAL库开发
STM32系列文章目录 文章目录 STM32系列文章目录 前言 一.HAL库之串口收发 1.配置STM32CUBEID 2.使用串口中断收发 2.1 配置串口中断 2.2 HAL库中断处理逻辑 3 测 ...
- STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)
参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...
- STM32F4 HAL库开发 -- SPI Flash
一.驱动 bsp_spi_flash.c #include "THC_Board_include_h.h"/* Private define ------------------- ...
- 【STM32+cubemx】0030 HAL库开发:DDS芯片AD9833实现简单的波形发生器
大家好,我是学电子的小白白,今天带大家了解一款波形发生器芯片--AD9833. AD9833是AD公司出品的一款DDS波形发生器,能够产生正弦波.三角波和方波输出. 1)什么是DDS 通俗来讲,DDS ...
- stm32 IOT_基于STM32平台的cubeMX和HAL库详解
课程简介: <朱有鹏老师单片机完全学习系列课程>总共5季,其中第1.2季是51单片机学习,第3.4.5季是STM32单片机与RTOS学习.整个课程时长约250小时,是一套零基础.全面系统. ...
- 配置CLion进行嵌入式STM32的HAL库开发
前言 时不可以苟遇,道不可以虚行. 一.准备 1.软件 CLion-2020:百度网盘提取链接放在文章最后. STM32CubeMX:使用 6.5.0 版本的,不要使用最新版本的 CubeMX,不然没 ...
- STM32+RS485+Modbus-RTU(主机模式+从机模式)-标准库/HAL库开发
modbus协议 完成modbus协议的编程之后,设备可以分别作为modbus协议的主机或者从机进行测试,使用模拟软件测试完毕后,完整代码以三个版本的形式进行介绍 1.版本一:使用串口接收数据超时完成 ...
- 清泉HAL库开发STM32之基础概念
文章目录 前言 一.STM32标准库和HAL库分别是什么? 二.HAL库开发 cubemx新建工程 1.选择 CPU 型号 2.确认时钟源 3. 配置 IO 口 4. 配置系统时钟 5. 进一步配置 ...
- STM32F103以SPI 驱动128*128的TFT彩屏,LCD驱动为ST7735s,程序使用CubeMX的HAL库开发方式,另外也做了标准库的程序移植
0. 关于本文: 其实我一直都比较懒,不喜欢写博客.但网上关于详细讲解SPI驱动LCD的文章比较少,虽然也能下载到一些案例程序,但对于初学者来说,如果不懂LCD驱动的原理,不懂如何对文字和图片取模, ...
- STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片
STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...
最新文章
- 5大步骤+10个案例,堪称SQL优化万能公式
- dows 性能监控软件 Spotlight On Windows
- python为什么中文要encoding-python2.x 默认编码问题
- string 类的实现
- 【leetcode】clone-graph
- jQuery操作DOM元素案例
- vue 列表渲染 v-for
- SSM简单参数传递与获取方法
- typedef有什么用_我是怎么用C++恰饭吃的
- 机器学习(2)---简单线性回归模型
- Abp框架多租户源码解读
- 推荐一下干货-------为什么你的app不耐看
- 树莓派 40pin IO引脚测试
- 12款常用的数据挖掘工具推荐
- 三星s8php,三星S8 Type C接口连接电视体验
- Difference-Guided Representation LearningNetwork for Multivariate Time-SeriesClassification(TCYB)
- mysql Events及存储过程查看
- RabbitMQ高可用集群搭建
- pandas 基础操作
- 本周大新闻|传PS VR2首发备货200万台,Cambria彩色透视效果曝光