资源简介
端口实现的IIC方式,驱动BME280,测量温度.
支持多个BME280接在不同端口.
增加前后温度变化过大的异常数据处理

代码片段和文件信息
#include
#include “stm32f10x.h“
#include “myconfig.h“
#include “bme280.h“
#include “myconfig.h“
#include
#include “globalsys.h“
#include “globalval.h“
#ifdef USE_BME280_TASK
struct BME280_Sensor_Struct BME280_Sensor1;
struct BME280_Sensor_Struct BME280_Sensor2;
#define MAX_BME280_ERROR 30
volatile int is_reseting=0;
char reset_flag=0;
/*
* 函数名 : IIC_ReadOneByte
* 描述 : I2C读出一个字节数据
* 输入 :寄存器地址
* 返回值 :读出来的数据
*/
u8 IIC_ReadOneByte(I2C_Bit_Ops *I2C u8 dev_addr u8 reg_addr)
{
u8 temp=0;
IIC_Start(I2C);
IIC_Send_Byte(I2C (dev_addr << 1)); //发送器件地址加写操作
IIC_Wait_Ack(I2C);
IIC_Send_Byte(I2C reg_addr); //发送寄存器地址
IIC_Wait_Ack(I2C);
IIC_Start(I2C);
IIC_Send_Byte(I2C (dev_addr << 1) | 0x01); //进入接收模式
IIC_Wait_Ack(I2C);
temp=IIC_Read_Byte(I2C 0);
IIC_Stop(I2C);//产生一个停止条件
return temp;
}
/*
* 函数名 : IIC_Write_OneBytes
* 描述 : I2C写1个字节的内容
* 输入 :1.I2C设备的地址 ; 2.寄存器地址 ; 4.被写的内容
* 返回值 :无
*/
void IIC_Write_OneBytes(I2C_Bit_Ops *I2C u8 dev_addr u8 reg_addr u8 reg_data)
{
u8 ucAddr;
ucAddr = reg_addr;
IIC_Start(I2C);
IIC_Send_Byte(I2C dev_addr << 1);
IIC_Wait_Ack(I2C);
IIC_Send_Byte(I2C ucAddr % 256); //发送低地址
IIC_Wait_Ack(I2C);
IIC_Send_Byte(I2C reg_data); //发送字节
IIC_Wait_Ack(I2C);
IIC_Stop(I2C);
}
/*
* 函数名 : IIC_Read_NBytes
* 描述 : I2C读出N个字节的内容
* 输入 :1.I2C设备的地址 ; 2.寄存器地址 ; 3.读出数据的数量 ;4.存储读出数据的首地址
* 返回值 :无
*/
void IIC_Read_NBytes(I2C_Bit_Ops *I2C u8 dev_addr u8 reg_addr u8 cnt u8 *reg_data)
{
u8 t;
for(t = 0; t < cnt ; t++)
{
*reg_data = IIC_ReadOneByte(I2C dev_addr reg_addr + t);
reg_data++;
}
}
/*
* 函数名 : IIC_Bme280_Init
* 描述 : BME280 I2C初始化 并且读出补偿值
* 输入 :无
* 返回值 :无
*/
void Bme280_InitParam(struct BME280_Sensor_Struct *BME280)
{
uint8_t t_cmd;
uint8_t buf_Bme280[25]={0};
uint8_t bme280[7]={0};
uint8_t buf_H1 = 0;
/* 读取温度压力补偿值 */
IIC_Read_NBytes(BME280->I2C BME280_DEVICE_ADDR 0x88 24 buf_Bme280);
/* 读取湿度补偿值 */
IIC_Read_NBytes(BME280->I2C BME280_DEVICE_ADDR 0xE1 7 bme280);
/* 读取湿度补偿值 */
IIC_Read_NBytes(BME280->I2C BME280_DEVICE_ADDR 0xA1 1 &buf_H1);
/* 计算温度补偿值 */
BME280->Register.dig_T1 = buf_Bme280[1] << 8 | buf_Bme280[0];
BME280->Register.dig_T2 = buf_Bme280[3] << 8 | buf_Bme280[2];
BME280->Register.dig_T3 = buf_Bme280[5] << 8 | buf_Bme280[4];
/*计算压力补偿值*/
BME280->Register.dig_P1 = buf_Bme280[7] << 8 | buf_Bme280[6];
BME280->Register.dig_P2 = buf_Bme280[9] << 8 | buf_Bme280[8];
BME280->Register.dig_P3 = buf_Bme280[11] << 8 | buf_Bme280[10];
BME280->Register.dig_P4 = buf_Bme280[13] << 8 | buf_Bme280[12];
BME280->Register.dig_P5 = buf_Bme280[15] << 8 | buf_Bme280[14];
BME280->Register.dig_P6 = buf_Bme280[17] << 8 | buf_Bme280[16];
BME280->Register.dig_P7 = buf_Bme280[19] << 8 | buf_Bme280[18];
BME280->Regist
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
I.A.... 1617 2019-03-28 15:34 bme280.h
I.A.... 6042 2019-01-03 15:16 bme_iic.c
I.A.... 1515 2019-01-02 14:19 bme_iic.h
I.A.... 14248 2019-03-29 11:41 bme280.c
----------- --------- ---------- ----- ----
23422 4
- 上一篇:keil步进电机程序代码
- 下一篇:Labview 屏幕截图程序,全新,稳定,快速
相关资源
- I2C读写AT24C02 基于STM32F103 cube116540
- 基于stm32f103ve的程序——跑马灯实验
- 基于STM32RCT6的步进电机驱动程序
- stm32f407上的两个can发送和接收例程
- STM32 led 时钟
- STM32 2.4G通信例程
- 直流无刷电机方波驱动 stm32 例程代码
- STM32中文资料
- STM32蓝牙和串口程序
- STM32f103超声波模块例程
- stm32f103c8t6 4 oled.rar
- LCD显示温度+串口接收温度.rar
- stm32f030 IAP Demo(原创)
- STM32基于rt_thread操作系统的SDHC卡文件
- 单片机与温度传感器DS18B20的程序设计
- 毕业论文之温度传感器DS18B20(源码
- NRF24L01实现51与STM32双向通讯
- STM32F103 串口程序(完整版)
- stm32 ds18b20 温度传感器 测试通过
- stm32官方例程
- STM32F103定时器中断程序
- [免费]基于stm32f103ze 的OLED驱动代码
- 51单片机读取温度数据存储到SD卡中并
- STM32F103RBT6驱动UC1698控制芯片的160160黑
- STM32F103 DS18B20 V3.5.0固件库驱动程序工
- STM32定时器使用入门。看了这个程序会
- SIM908 SDIO FSMC STM32 FIFO
- STM32F103 CC2500完整驱动(模拟SPI)
- 铂电阻温度测量系统的设计
- AD7606采集程序
评论
共有 条评论