毕业设计准备用 博世的 BME680 传感器来获取温湿度以及气压 空气质量信息。我选用的传感器是这样的
短期内可能不会上传代码,这是毕设的一部分 需要代码的小伙伴留言吧
传感器使用的是IIC协议进行通讯的 接线逻辑如下
VCC ----3.3V
GND---GND
SCL----PA15
SDA---PB3
选择的这么奇怪的引脚是因为我的 BME传感器设计问题,我先前买了 单个的传感器 焊接到我的毕设电路板上,但是电路始终有问题也没有找到具体的电路问题所在,最终无奈只能换成模块, 接线是借用的 编码器的接口 所有就有了这么两个不是很相关的 IO 读者可以根据自己的需求修改自己的 IO 我这里的程序使用的是软件模拟的IIC
我的 代码是移植的博世的官方的代码库
https://github.com/BoschSensortec/BME680_driver 这是代码的地址
我所用到的文件主要有这三个文件 读者可以自行去下载 官方的库文件
第一个文件 bme680.c 声明了很多的函数 主要就是各种的 计算 对寄存器的数据解析的函数
注意这里面的很对函数都事static 类型的 也就是说官方希望这个函数不要在外面去调用 只是给这个文件内的其他函数去调用我的,官方代码给我们留下了几个通用的调用接口
大多数函数的入口参数都是结构体的指针, 有一点设备驱动的味道在里面(或许就是设备驱动,只是我还没学的到)
其他函数我就不多介绍了 这份代码的关键是在 结构体的定义和使用上
打开这个 头文件 前面的几百行大约就是一些宏定义 ,这个和我们的STM32 库文件是几乎一样的,我们可以不用自己去计算寄存器的具体值,直接赋值就可以了。
这一部分大约是这些东西
这两个函数指针是 库文件和 单片机硬件连接的桥梁,所有的调用接口都在这里,针对于不同的硬件平台,我们只要修改这两个函数指针的实现我们就可以任意的迁移。
这两类函数 分别是 BME680 的读取(写入) 和延时函数 (注意 我们一共需要实现三个函数 读 、 写 、 延时,读和写是一样的类型)
注意 这里的读取没有限定是一定要用 IIC 还是 SPI 也就是说 这边留了足够的选择的余地,我当时被惊艳到了..... 我总觉得这边是设备树相关的(我没学过,会学的,,)
继续说 结构体
这个枚举 是让你选择 通讯方式的 因为涉及到了一个 BME680 内部地址的寻址过程。 所有底层逻辑会有一定的不同
针对的就是这两个函数 在IIC模式下这两个函数用不到,但是在 SPI下用得到
接着这个结构体是用来存放计算好的数据的
这个结构体的指针 是函数的入口参数; 也就是说计算的结果会保存在这里面。
这个结构体 我的理解是一个校正数组, 传感器内部有一些其他的数据 会被保存在这个结构体里面,后面调用数据计算的算法的时候回使用到这些数据,主要应该是对测量结果进行修正的 这个数组在进行 数据获取之前应该先填满(也就是在进行参数计算之前要填满)
这个结构体是 过采样率的保存数组 主要的事保存的过采样率 关于过采样率 请自行查找
最后这个是设备的结构体,设备相关的数据都在这里, 有函数指针(先前提到过),有结构体的指针(各种数据的结构体),还有 通讯方式的选择(枚举) 设备ID 设备号等等
这部分待读者自行去理解吧
接下来我分享一下我的部分代码的思路
第一部分 我们肯定是要去实现那三个函数(读 写 延时)
这里 头文件给了我们提示 官方库提出了他的要求 ,要求的返回值是什么样子的, 函数的传入参数是什么样子的 都声明的很明白
我们只需要按照自己的单片机类型去实现指定的功能就好了
这是我的读函数,迁移改编自正点原子的 IIC例程
我的写函数
这些代码都是些基本操作,我在这里就不在多说, 大家去参考正点原子的iic 实验就好 实在不行等我上传代码吧(不一定会整理的很好)
我们只要是去实现那个 对应的函数接口就行了
关于延时函数我们没有办法直接使用Stm23F4的延时函数,会出错误的
出错误的原因是 传入参数的类型不相同 解决的方法很简单就是加了一层壳 强制类型转换一下
反正延时的时间也不可能用到65536ms 所以可以放心大胆的舍弃掉高位
以上我们就实现了三个基本函数; 接下来就是进行一些初始化的操作了, 大致我分两类 一类是单片机那边的 IO初始化, 这部分不提就是IO的配置,另外一部分就是用到的结构体需要去声明,需要去进行赋值 然后还需要调用一些关键的函数去对传感器侧的寄存器进行初始化
这是 IO初始化 不赘述 PA15 PB3
接下来是 结构体和 函数调用
气压101650Pa 相对湿度51% 气温21度
剩下的空气品质那一栏 暂时还没解决改日再战