BME_280传感器的使用方法一:驱动移植(学习传感器篇二)

一、BME_280传感器的基本介绍

BME280是一款集成了温度、湿度和气压的环境传感器。该传感器具有精度高、功能多、体积小等特点,适合用于手机,GPS,手机等电池驱动的设备中使用,同时提供SPI和l2C接口,方便快速制作原型。可广泛应用于环境监测、层高测量、物联网控制等领域。

 二、使用方法

因为BME280传感器支持SPI和I2C协议来采集数据,在此处基于写好的驱动来实现温度,湿度,大气压数值的获取(此处是以驱动文件下的一般模式驱动)。当然需要对SPI和I2C协议需要一定了解尤其是时序..........(不懂去看一下大佬怎么说的)

STM32CubeMX配置I2C:

基本的那些配置如RCC和时钟树就不展示了(传感器篇一有)。

②生成代码后编译一下,在文件处将写好的BEM280传感器的驱动文件加入到inc(头文件)和src(源文件)里。

③再将驱动文件放入工程中去

bem280的驱动文件已经是写好的了,里面大多数的函数和寄存器配置已经给我封装好了,接下只是去花时间了解一下驱动文件里的内容,同时需结合数据手册了解要配置的寄存器和使用步骤就可以实现数据的采集了。

④温湿度,大气压强数据采集

Ⅰ、配置bme280设备的结构体基于I2C

Ⅱ、初始化bme280传感器

Ⅲ、设置传感器去采集温湿度和大气压

Ⅳ、在while(1)里实现数据采集并发送到串口观察数据

Ⅴ、除此之外,还需要自己去写 读和写函数(user_i2c_write和user_i2c_read)以及延时函数,因为需要从设备(bme280)里读取数据所以要用到 HAL_I2C_Mem_Write和HAL_I2C_Mem_Read函数(不懂去查查都是为了学习)代码如下

如果是SPI模式下的话也需要自己改,只不过就是要根据SPI时序来写

int8_t bme280_spi_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len)
{
    // 准备寄存器地址,最高位设置为1以表示读操作
    uint8_t txData[1];
    txData[0] = reg_addr | 0x80;

    // 拉低 CS 引脚,选择设备
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

    // 发送寄存器地址,检查是否成功
    HAL_StatusTypeDef status = HAL_SPI_Transmit(&hspi1, txData, 1, HAL_MAX_DELAY);
    if (status != HAL_OK) {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 拉高 CS 引脚
        return BME280_E_COMM_FAIL; // 返回通信失败
    }

    // 接收数据
    status = HAL_SPI_Receive(&hspi1, data, len, HAL_MAX_DELAY);
    if (status != HAL_OK) {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 拉高 CS 引脚
        return BME280_E_COMM_FAIL; // 返回通信失败
    }

    // 拉高 CS 引脚,解除设备选择
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

    // 返回操作成功
    return BME280_OK;
}

int8_t bme280_spi_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len)
{
    // 创建一个数据包,包含寄存器地址和数据
    uint8_t txData[len + 1];
    txData[0] = reg_addr & 0x7F; // 写操作,最高位为0
    for (uint16_t i = 0; i < len; i++) {
        txData[i + 1] = data[i];
    }

    // 拉低CS引脚
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

    // 发送数据包
    HAL_StatusTypeDef status = HAL_SPI_Transmit(&hspi1, txData, len + 1, HAL_MAX_DELAY);

    // 拉高CS引脚
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

    // 检查传输状态并返回相应的结果
    if (status == HAL_OK) {
        return BME280_OK;
    } else {
        return BME280_E_COMM_FAIL;
    }
}

⑤串口数据的显示如下:

三、总结

当然,这是自己借助别人的驱动来写的,在手册的帮助下,也成功照猫画虎下将数据读取出来了,在这过程中,自己也学到了很多,但是不太过瘾,接下来会以数据手册配寄存器的方式实现数据的采集。

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值