用STM32F030F4的SPI总线获取BMP280的气压和温度

2023-10-30

1.用STM32Cube MX生成SPI总线的初始化函数


static void BMP280_SPI_Init(void)
{
  LL_SPI_InitTypeDef SPI_InitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_SPI1);
  
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
  /**SPI1 GPIO Configuration  
  PA5   ------> SPI1_SCK
  PA6   ------> SPI1_MISO
  PA7   ------> SPI1_MOSI 
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_4;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  
  GPIO_InitStruct.Pin = LL_GPIO_PIN_5;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = LL_GPIO_PIN_6;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = LL_GPIO_PIN_7;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* SPI1 parameter configuration*/
  SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;
  SPI_InitStruct.Mode = LL_SPI_MODE_MASTER;
  SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;
  SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_HIGH;
  SPI_InitStruct.ClockPhase = LL_SPI_PHASE_2EDGE;//:第二个边沿开始
  
  
  SPI_InitStruct.NSS = LL_SPI_NSS_SOFT;
  SPI_InitStruct.BaudRate =  LL_SPI_BAUDRATEPRESCALER_DIV32; 
  SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;
  SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;
  SPI_InitStruct.CRCPoly = 7;
  LL_SPI_Init(SPI1, &SPI_InitStruct);
  LL_SPI_SetRxFIFOThreshold(SPI1,LL_SPI_RX_FIFO_TH_QUARTER); //设置触发RXNE事件的RXFIFO阈值,这里设置为一个字节
  LL_SPI_Enable(SPI1);
}

2.根据BMP280的时序图,编写读写函数
时序图:
在这里插入图片描述
有图片可知spi的模式为11:即是时钟极性CPOL: 即SPI空闲时,时钟信号SCLK的电平(1:空闲时高电平; 0:空闲时低电平),时钟相位CPHA: 即SPI在SCLK第几个边沿开始采样(0:第一个边沿开始; 1:第二个边沿开始)。
由图可以,第一个字节字节为控制字节,因为SPI是全双工的,有发必有会,由图可知,控制字节所回的数据是无效的。
所以读写代码如下

static void WriteBmp280(uint8_t addr, uint8_t data)
{
	BMP280_CS_ENABLE;

	LL_SPI_TransmitData8(SPI1, addr & ~0x80);
	while (!LL_SPI_IsActiveFlag_TXE(SPI1))
	{
	}
	while (!LL_SPI_IsActiveFlag_RXNE(SPI1))
	{
	}
	(void)LL_SPI_ReceiveData8(SPI1);

	LL_SPI_TransmitData8(SPI1, data);
	while (!LL_SPI_IsActiveFlag_TXE(SPI1))
	{
	}
	while (!LL_SPI_IsActiveFlag_RXNE(SPI1))
	{
	}
	(void)LL_SPI_ReceiveData8(SPI1);

	BMP280_CS_DISENABLE;
}
static uint8_t ReadBmp280(uint8_t addr)
{
	uint8_t data;
	BMP280_CS_ENABLE;

	LL_SPI_TransmitData8(SPI1, (0x80 | addr));
	while (!LL_SPI_IsActiveFlag_TXE(SPI1))
	{
	}
	while (!LL_SPI_IsActiveFlag_RXNE(SPI1))
	{
	}
	(void)LL_SPI_ReceiveData8(SPI1);

	LL_SPI_TransmitData8(SPI1, 0x00);
	while (!LL_SPI_IsActiveFlag_TXE(SPI1))
	{
	}
	while (!LL_SPI_IsActiveFlag_RXNE(SPI1))
	{
	}
	data = LL_SPI_ReceiveData8(SPI1);

	BMP280_CS_DISENABLE;
	return data;
}
static int16_t ReadBmp280Dig_P(uint8_t addr)
{
	uint8_t MSB, LSB;
	LSB = ReadBmp280(addr);
	MSB = ReadBmp280(addr + 1);
	return ((int16_t)((MSB << 8) | LSB));
}

3.根据手册里的公式获取气压以及温度的数据

手册里的公式:
在这里插入图片描述
寄存器表:
在这里插入图片描述

static int32_t GetBmp280(void)
{
	int32_t adc_T;
	int32_t adc_P;
	int32_t var1;
	int32_t var2;
	int32_t t_fine;
	int32_t T;
	int32_t p;
	adc_T = (ReadBmp280(BMP280_TEMP_MSB) << 12 | ReadBmp280(BMP280_TEMP_LSB) << 4 | ReadBmp280(BMP280_TEMP_XLSB) >> 4);
	adc_P = (ReadBmp280(BMP280_PRESS_MSB) << 12 | ReadBmp280(BMP280_PRESS_LSB) << 4 | ReadBmp280(BMP280_PRESS_XLSB) >> 4);
	var1 = (((double)adc_T) / 16384.0 - ((double)DIG_T1) / 1024.0) * ((double)DIG_T2);
	var2 = ((((double)adc_T) / 131072.0 - ((double)DIG_T1) / 8192.0) * (((double)adc_T) / 131072.0 - ((double)DIG_T1) / 8192.0)) * ((double)DIG_T3);
	t_fine = (uint32_t)(var1 + var2);
	T = t_fine / 5120;
	(void)T;//本系统中不需要温度,故舍去

	var1 = ((double)t_fine / 2.0) - 64000.0;
	var2 = var1 * var1 * ((double)DIG_P6) / 32768.0;
	var2 = var2 + var1 * ((double)DIG_P5) * 2.0;
	var2 = (var2 / 4.0) + (((double)DIG_P4) * 65536.0);
	var1 = (((double)DIG_P3) * var1 * var1 / 524288.0 + ((double)DIG_P2) * var1) / 524288.0;
	var1 = (1.0 + var1 / 32768.0) * ((double)DIG_P1);
	p = 1048576.0 - (double)adc_P;
	p = (p - (var2 / 4096.0)) * 6250.0 / var1;
	var1 = ((double)DIG_P9) * p * p / 2147483648.0;
	var2 = p * ((double)DIG_P8) / 32768.0;
	p = p + (var1 + var2 + (DIG_P7)) / 16.0;
	return p;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用STM32F030F4的SPI总线获取BMP280的气压和温度 的相关文章

  • (java)leetcode-445 Add Two Numbers II(两数相加 II)

    题目描述 给你两个 非空 链表来代表两个非负整数 数字最高位位于链表开始位置 它们的每个节点只存储一位数字 将这两数相加会返回一个新的链表 你可以假设除了数字 0 之外 这两个数字都不会以零开头 进阶 如果输入链表不能修改该如何处理 换句话
  • jupyter的安装与使用

    目录 一 jupyter的介绍 二 安装与运行 1 使用Anaconda安装 2 使用pip命令安装 1 首先通过win R打开命令符输入pip version 查看电脑python环境 编辑 2 输入jupyter notebook的命令
  • 有时OPEN***提示报错,如下错误及解决方法

    Dec 14 11 40 47 nfs12 open 31685 TLS ERROR BIO read tls read plaintext error error 14090086 SSL routines SSL3 GET SERVER
  • VScode绑定码云并向仓库上传代码

    文章目录 一 下载git 二 使用步骤 1 Git的全局配置 2 配置Git 3 VScode的配置 总结 一 下载git 下载链接 点击download即可 下载完成后 按照默认安装即可 二 使用步骤 1 Git的全局配置 代码如下 示例
  • 卸载Ubuntu自带的Qt4和Qt5

    执行如下操作 首先移除库 sudo apt get remove qtcreator sudo apt get remove qt5 上面是移除qt5 移除qt4的时候把qt5改成qt4就可以了 下面也是一样的 移除依赖文件 sudo ap
  • 《Python进阶系列》一:使用Python包组织代码

    使用Python包 package 组织代码 最近在看 Python入门技能树 时 看到了Python包组织代码觉得很有意思 特地写个笔记总结一下 quad Python 通过包 package 的方式来组织代码 包是一种特殊的模块 mod

随机推荐

  • vue3-ElmentPlus封装通用表格-含单元格操作-多选-分页器

    Sam9029的CSDN博客主页 Sam9029的博客 CSDN博客 JS学习 CSS学习 Vue 2领域博主 恭喜你 若此文你认为写的不错 不要吝啬你的赞扬 求收藏 求评论 求一个大大的赞 已经有很久没有写文章了 贪玩 摆烂 不想动 低情
  • GAN初识

    1 生成对抗网络GAN简介 1 1 生成器 G Z 接受随机噪声Z作为输入生成仿品 并训练自己去欺骗判别器D 让D以为G Z 产生的任何数据都是真实的 1 2 判别器 D Y 可以基于真品和仿品来判断仿造品的仿真程度 通常值越靠近0表示越真
  • 数字信号处理理解

    心得体会 给自己看的 傅里叶变换 FT FS DTFT DFS 傅里叶变换虚部理解 每个函数都可以写成奇分量 偶分量 偶分量用很多cos合成 奇分量用很多sin合成 频谱上 实轴上冲激函数就是由这些cos合成 那如果是sin合成的呢 那就是
  • mkdocs 编辑及启动

    mkdocs 编辑及启动 新建项目以及 md 文件之后 如图 具体代码为 mkdocs 核心配置代码 编写完成之后 编译 cd mkdocs docs make html 成功之后 会自动生成 build文件 启动 firefox buil
  • elementUI中的el-form常用校验规则

    elementUI中的el form常用校验规则 校验使用方式 rules name required true message 请输入活动名称 trigger blur min 3 max 5 message 长度在 3 到 5 个字符
  • 【PTA】跟奥巴马一起画方块

    美国总统奥巴马不仅呼吁所有人都学习编程 甚至以身作则编写代码 成为美国历史上首位编写计算机代码的总统 2014年底 为庆祝 计算机科学教育周 正式启动 奥巴马编写了很简单的计算机代码 在屏幕上画一个正方形 现在你也跟他一起画吧 输入格式 输
  • 【计算机视觉

    文章目录 一 检测相关 5篇 1 1 Detecting Manufacturing Defects in PCBs via Data Centric Machine Learning on Solder Paste Inspection
  • docker部署nginx时,proxy_pass填localhost报错502

    文章目录 docker部署nginx时 proxy pass填localhost报错502 原因 参考链接 https blog csdn net qq 38623939 article details 129582950 docker部署
  • iar如何生成hex文件

    生成方法如下 1 工具需求 1 iar平台 2 第一种方法 首先在工程选项options里面 选中output converter选项 接着勾中Generate additional output选项 1 然后在Output format
  • nagios发送邮件命令配置

    define command command name notify by email command line usr bin printf b Nagios n nNotification Type NOTIFICATIONTYPE n
  • Bootstrap-table动态新增行,删除行,可编辑

    Bootstrap table动态新增行 删除行 可编辑 效果图 html div class table box style margin 20px div a 添加行 a a 删除行 a div table table div js
  • 区块链技术在网络安全中的应用

    区块链是一个现代的数字分类账本 不仅记录货币交易 还可以记录任何有价值的东西 输入的数字数据在Blockchain上作为相互共享的和永久记录的数据库 利用系统本身去中心化的特性具有明显的优势 区块链数据库不存储在集中位置 这意味着记录确实是
  • 深度学习结合非局部均值滤波的图像去噪算法

    其实这是半年之前完成的内容 一直懒着没有总结 今天看了看代码 发觉再不总结自己以后都看不懂了 故整理如下 非局部均值是一种基于块匹配来确定滤波权值的 即先确定一个块的大小 例如7x7 然后在确定一个搜索区域 例如15x15 在15x15这个
  • hexo提交报错 unable to access ‘https://github.com/*/*.github.io.git/‘: Couldn‘t resolve host ‘github.com

    title gt hexo提交报错 unable to access https github com github io git Couldn t resolve host github com date 2016 10 08 19 08
  • 算法题 十 之 无向连接图的深度拷贝

    题目 无向连接图的深度拷贝 图的表示方式 用数组表示与当前节点连接的节点 如下面的代码 class Node public int val public List
  • mac下安装brew遇到的问题总结

    网上的例子大多数给的下载地址已经过期了 github上的地址也已经变了 执行的ruby命令需要去http brew sh 官网上看 usr bin ruby e curl fsSL https raw githubusercontent c
  • Openssl 签名证书学习笔记

    环境 win10 64位 安装版的OpenSSL Win64 openssl 1 1 0f x509证书 环境变量配置openssl 的path 操作在命令窗口完成 第一类 自签名证书 自签名证书 比一般过程 1 生成密钥 2 生成请求 3
  • Unity RawImage加载Image到底在什么时候用哪一种方法

    先看看 RawImage加载Image的区别 RawImage核心代码比Image少很多 Raw Image不支持交互 可用于显示任何图片而不仅仅是Sprite 一般用在背景 图标上 支持UV Rect 用来设置只显示图片的某一部分 而Im
  • 亚马逊云科技:你要的并不是ChatGPT,而是强大和经济的算力

    2022年12月 AI创业公司OpenAI推出了聊天机器人ChatGPT 作为生成式AI在文本领域的实际应用之一 ChatGPT的问世距今不过百天而已 却已经火爆了全球 一时间 大量的企业投入到生成式AI领域 大有 任彼桑田变沧海 一丸丹药
  • 用STM32F030F4的SPI总线获取BMP280的气压和温度

    1 用STM32Cube MX生成SPI总线的初始化函数 static void BMP280 SPI Init void LL SPI InitTypeDef SPI InitStruct 0 LL GPIO InitTypeDef GP