你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 3517|回复: 5

转发:ARM®mbed OS入门开发(五A)通过SPI与BMP280通信(mbed应用)

[复制链接]

61

主题

1071

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2016-10-10 09:02:20 | 显示全部楼层 |阅读模式
通过SPI与BMP280通信(mbed应用)2016-10-05 Summerain







根据管脚配置,将STM32和BMP280相连:

微信截图_20161010085926.png

微信截图_20161010085955.png

为了更好的理解,我直接使用了官方的C语言写的驱动文件,当然也可以参照官方驱动,用C++编写专门适用于mbed的驱动。同时,为了支持C语言编译或者说混合编译,需要在驱动头文件bmp280.h中添加几句话:
#ifdef _cplusplus
extern "C"{
#endif
... ...
#ifdef _cplusplus
}
#endif

下面是我的主函数main.cpp的代码:
#include "mbed.h"
#include "bmp280.h"
/************** SPI control mask******/
#define SPI_READ    0x80
#define SPI_WRITE   0x7F
/********************SPI function declarations***********************/
//SPI master连接到SPI通信引脚
SPI spi_bmp(SPI_MOSI, SPI_MISO, SPI_SCK);
DigitalOut CS(SPI_CS);

s8 BMP280_SPI_bus_write(u8 dev_addr, u8 reg_addr, u8 *reg_data, u8 cnt);
s8 BMP280_SPI_bus_read(u8 dev_addr, u8 reg_addr, u8 *reg_data, u8 cnt);
/********************End of SPI function declarations***********************/
void  Bus_routine(void);
void  BMP280_delay_msek(u32 msek);
struct bmp280_t bmp280;
Serial pc_my(SERIAL_TX, SERIAL_RX);
void Bus_routine(void) {
    bmp280.bus_write = BMP280_SPI_bus_write;
    bmp280.bus_read = BMP280_SPI_bus_read;
    bmp280.delay_msec = BMP280_delay_msek;
}
/*  Brief : The delay routine
*  \param : delay in ms */
void  BMP280_delay_msek(u32 msek)
{
    /*Here you can write your own delay routine*/
}
s8  BMP280_SPI_bus_read(u8 dev_addr, u8 reg_addr, u8 *reg_data, u8 cnt)
{
    int iError = BMP280_INIT_VALUE;
    CS=0;
   
iError =spi_bmp.write(reg_addr | SPI_READ);
    for (u8 i = 0; i < cnt; i++)
        {
            reg_data = spi_bmp.write(0x00);
        }
    CS=1;
    return (s8)iError;
}
s8  BMP280_SPI_bus_write(u8 dev_addr, u8 reg_addr, u8 *reg_data, u8 cnt)
{
    int iError = BMP280_INIT_VALUE;
    CS=0;
    u8 *array = ®_addr;
    for(u8 i = 0; i < cnt; i++) {
      
iError +=spi_bmp.write(array & SPI_WRITE);
        spi_bmp.write(reg_data);
    }
    CS=1;
    return (s8)iError;
}
int main()
{
    //首先初始化数据
    /* Assign the standby time*/
    u8 v_standby_time_u8 = BMP280_INIT_VALUE;
    /* For Individual data read APIs*/
    /* read uncompensated temperature*/
     s32 v_data_uncomp_tem_s32 = BMP280_INIT_VALUE;
    /* read uncompensated pressure*/
     s32 v_data_uncomp_pres_s32 = BMP280_INIT_VALUE;
    /* read real temperature*/
        double actual_temp = BMP280_INIT_VALUE;
    /* read real pressure*/
      double actual_press = BMP280_INIT_VALUE;
    /* Return status*/
    s32 com_rslt = ERROR;
    /* Set Baud */
    pc_my.baud(115200);
    //设置routine,将BMP280_SPI_bus_write/read传递给传感器读写
    Bus_routine();
    com_rslt=bmp280_init(&bmp280);
    if(com_rslt==0)
          pc_my.printf("initialization succeed!\r\n");
    else
          pc_my.printf("initialization failure!\r\n");
    /*设置工作模式为Normal mode*/
    com_rslt+= bmp280_set_power_mode(BMP280_NORMAL_MODE);
        if(com_rslt==0)
            pc_my.printf("set_power_mode succeed!\r\n");
        else
            pc_my.printf("set_power_mode failure!\r\n");
    /* 标准分辨率,Standby时间1ms*/
    bmp280_set_work_mode(BMP280_STANDARD_RESOLUTION_MODE);
    bmp280_set_standby_durn(BMP280_STANDBY_TIME_1_MS);
    bmp280_get_standby_durn(&v_standby_time_u8);
    while(1){
      //读取数据:
        /* APIs are used to read the uncompensated temperature/pressure*/
        bmp280_read_uncomp_temperature(&v_data_uncomp_tem_s32);
        bmp280_read_uncomp_pressure(&v_data_uncomp_pres_s32);
        /* APIs are used to read the true temperature/pressure*/
        /* Input value as uncompensated temperature/pressure*/
        actual_temp = bmp280_compensate_temperature_double(v_data_uncomp_tem_s32);
        actual_press = bmp280_compensate_pressure_double(v_data_uncomp_pres_s32);
        pc_my.printf("The uncompensated temperature is= %d, The uncompensated pressure is= %d\r\n", v_data_uncomp_tem_s32, v_data_uncomp_pres_s32 );
        pc_my.printf("The actual temperature is= %f DegC, The actual pressure is= %f Pa\r\n ", actual_temp, actual_press);
        wait(2);   
    }
}

打开putty,打开串口Serial的端口,设置好串口波特率,我自己设定的是115200。然后就可以获取数据了,数值大概如下:

dcd56fd.jpg
BMP280对温度和气压的测量是通过补偿数据compensated data然后根据自己的算法得到的。根据数据,气压和温度可见是相当灵敏和准确的。

作者微信:
微信截图_20161010090612.png


Bosch已经将BMP280的官方驱动文件分享到Github上:
http://github.com/BoschSensortec/BMP280_driver



回复

使用道具 举报

31

主题

1951

回帖

0

蝴蝶豆

论坛元老

最后登录
2020-12-4
发表于 2016-10-10 09:30:41 | 显示全部楼层
           谢谢分享
回复 支持 反对

使用道具 举报

100

主题

3617

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-10-10 10:46:54 | 显示全部楼层
支持一下,,,,,,,
回复 支持 反对

使用道具 举报

6

主题

446

回帖

0

蝴蝶豆

金牌会员

最后登录
2017-5-24
发表于 2016-10-10 10:53:57 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

159

回帖

0

蝴蝶豆

高级会员

最后登录
2017-3-9
发表于 2016-10-10 10:56:07 | 显示全部楼层
不错的教程
回复 支持 反对

使用道具 举报

41

主题

2476

回帖

282

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-10-10 18:08:37 | 显示全部楼层
顶                    
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版