资源简介
端口实现的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 屏幕截图程序,全新,稳定,快速
相关资源
- 软壁AdS / QCD模型中有限温度手性相变
- 基于STM32F4x9的LCD显示
- VS1053B编解码器的VDR分布式声音采集卡
- stm32的DAC播放音乐文件
- STM32+TMC5160代码电路图.rar
- 有限密度和零温度下的手性密度波与
- 物联网家居系统中基于单片机的多路
- 基于STM32的深海钻机甲板控制系统
- 基于IAP15F2K61S2单片机的多路温度巡检
- 串行通信在多路温度智能仪表中的应
- stm32f103.SchDoc
- STM32F103 USART+DMA
- DMA+stm32 407.zip
- 4_USART串口通信(空闲中断+DMA.zip
- stm32f105-usart-DMA收发demo
- STM32F042F6P6 Uart12DMA;发送中断接收
- 基于STM32的嵌入式双目图像采集系统设
- 基于STM32F103C8单片机的晶联讯电子JL
- 基于STM32的温湿度检测系统实现
- stm32F4+w5300
- 14284969_《STM32单片机应用与全案例实践
-
ST-li
nk-V2的SWD仿真使用方法.docx - 安富莱STM32开发板资料
- STM32F103实现OV7670摄像头显示
- STM32F207学习板例程
- STM32F103VCT6TR - High-density performance lin
- STM32 SRAM启动的 KeiL 配置
- STM32的IAP-Bootloader程序
- STM32例程之Bootloader
- stm32f103 虚拟U盘,调试成功的
评论
共有 条评论