MS5611气压计IIC源程序
前段工程项目需要测量大气压力,网上搜集了MS5611气压计这方面的资料,并完全参考了相关网友的程序。
1、MYIIC.h
#ifndef __MYIIC_H
#define __MYIIC_H
#include "sys.h"
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//IIC 驱动函数
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/6/10
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
// //IO方向设置
#define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}//IO操作函数
#define IIC_SCL PCout(12) //SCL
#define IIC_SDA PCout(11) //SDA
#define READ_SDA PCin(11) //输入SDA //IIC所有操作函数
void IIC_Init(void); //初始化IIC的IO口
void IIC_Start(void); //发送IIC开始信号
void IIC_Stop(void); //发送IIC停止信号
void IIC_Send_Byte(u8 txd); //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void); //IIC等待ACK信号
void IIC_Ack(void); //IIC发送ACK信号
void IIC_NAck(void); //IIC不发送ACK信号void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr); #endif
2、MYIIC.C
#include "myiic.h"
#include "delay.h"//初始化IIC
void IIC_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure;//RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);IIC_SCL=1;IIC_SDA=1;
}
//产生IIC起始信号
void IIC_Start(void)
{SDA_OUT(); //sda线输出IIC_SDA=1; IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1; IIC_SDA=1;//发送I2C总线结束信号delay_us(4);
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;SDA_IN(); //SDA设置为输入 IIC_SDA=1;delay_us(1); IIC_SCL=1;delay_us(1); while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0;//时钟输出0 return 0;
}
//产生ACK应答
void IIC_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
//不产生ACK应答
void IIC_NAck(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{ u8 t; SDA_OUT(); IIC_SCL=0;//拉低时钟开始数据传输for(t=0;t<8;t++){ IIC_SDA=(txd&0x80)>>7;txd<<=1; delay_us(2); //对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(2); IIC_SCL=0; delay_us(2);}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL=0; delay_us(2);IIC_SCL=1;receive<<=1;if(READ_SDA)receive++; delay_us(1); } if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACK return receive;
}
3、MY5611.h
#ifndef __MS5611_H_
#define __MS5611_H_#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "myiic.h"/* 函数申明 -----------------------------------------------*/#define MS561101BA_ADC_RD 0x00
#define MS561101BA_PROM_RD 0xA0
#define MS561101BA_PROM_CRC 0xAE#define MS561101BA_SlaveAddress 0xEE //MS5611的地址
#define MS561101BA_RST 0x1E //cmd 复位#define MS561101BA_D2_OSR_4096 0x58 // 9.04 mSec conversion time ( 110.62 Hz)
#define MS561101BA_D1_OSR_4096 0x48#define MS5611_OSR256 0x40
#define MS5611_OSR512 0x42
#define MS5611_OSR1024 0x44
#define MS5611_OSR2048 0x46
#define MS5611_OSR4096 0x48
#define FILTER_num 20u8 MS5611_init(void);
float Get_High(void);
void Filter_Hight(unsigned int set_hight);
void Hight_PwmOut(void);
void MS561101BA_getPressure(void);
void MS561101BA_getTemperature(void);
void MS561101BA_RESET(void);unsigned long MS561101BA_getConversion(uint8_t command);
void MS561101BA_GetTemperature(void);extern uint64_t dT,TEMP;
extern uint32_t Pressure;
extern uint32_t Cal_C[7];#endif
4、MS5611.c
#include "MS5611.h"
#include "math.h"//气压计状态机
#define SCTemperature 0x01 //开始温度转换
#define CTemperatureing 0x02 //正在转换温度
#define SCPressure 0x03 //开始气压转换
#define SCPressureing 0x04 //正在转换气压/*
C1 压力灵敏度 SENS|T1
C2 压力补偿 OFF|T1
C3 温度压力灵敏度系数 TCS
C4 温度系数的压力补偿 TCO
C5 参考温度 T|REF
C6 温度系数的温度 TEMPSENS
*/
uint32_t Cal_C[7]; //用于存放PROM中的6组数据1-6double OFF_;
float Aux;
/*
dT 实际和参考温度之间的差异
TEMP 实际温度
*/
uint64_t dT,TEMP;
/*
OFF 实际温度补偿
SENS 实际温度灵敏度
*/
uint64_t OFf,SENS;
uint32_t D1_Pres,D2_Temp; // 数字压力值,数字温度值uint32_t Pressure,Pressure_old,qqp; //大气压
uint32_t TEMP2,T2,OFF2,SENS2; //温度校验值
uint32_t Pres_BUFFER[20]; //数据组
uint32_t Temp_BUFFER[10]; //数据组/******************************************************************************** @函数名称 MS561101BA_RESET* @函数说明 复位MS5611* @输入参数 无* @输出参数 无* @返回参数 无
*******************************************************************************/
void MS561101BA_RESET(void)
{IIC_Start();IIC_Send_Byte(0xEE);//CSB接地,主机地址:0XEE,否则 0X77IIC_Wait_Ack();IIC_Send_Byte(0x1E);//发送复位命令IIC_Wait_Ack();IIC_Stop();}
/******************************************************************************** @函数名称 MS5611_init* @函数说明 初始化5611* @输入参数 无* @输出参数 无* @返回参数 无
*******************************************************************************/
u8 MS5611_init(void){ u8 inth,intl;int i;for (i=1;i<=6;i++) {IIC_Start();IIC_Send_Byte(0xEE);IIC_Wait_Ack();IIC_Send_Byte(0xA0 + (i*2));IIC_Wait_Ack();IIC_Stop();delay_us(5);IIC_Start();IIC_Send_Byte(0xEE+0x01); //进入接收模式delay_us(1);IIC_Wait_Ack();inth = IIC_Read_Byte(1); //带ACK的读数据delay_us(1);intl = IIC_Read_Byte(0); //最后一个字节NACKIIC_Stop();Cal_C[i] = (((uint16_t)inth << 8) | intl);}return !Cal_C[0];}/**************************实现函数********************************************
*函数原型:unsigned long MS561101BA_getConversion(void)
*功 能: 读取 MS561101B 的转换结果
*******************************************************************************/
unsigned long MS561101BA_getConversion(uint8_t command)
{unsigned long conversion = 0;u8 temp[3];IIC_Start();IIC_Send_Byte(0xEE); //写地址IIC_Wait_Ack();IIC_Send_Byte(command); //写转换命令IIC_Wait_Ack();IIC_Stop();delay_ms(10);IIC_Start();IIC_Send_Byte(0xEE); //写地址IIC_Wait_Ack();IIC_Send_Byte(0); // start read sequenceIIC_Wait_Ack();IIC_Stop();IIC_Start();IIC_Send_Byte(0xEE+0x01); //进入接收模式IIC_Wait_Ack();temp[0] = IIC_Read_Byte(1); //带ACK的读数据 bit 23-16temp[1] = IIC_Read_Byte(1); //带ACK的读数据 bit 8-15temp[2] = IIC_Read_Byte(0); //带NACK的读数据 bit 0-7IIC_Stop();conversion = (unsigned long)temp[0] * 65536 + (unsigned long)temp[1] * 256 + (unsigned long)temp[2];return conversion;}/**************************实现函数********************************************
*函数原型:void MS561101BA_GetTemperature(void)
*功 能: 读取 温度转换结果
*******************************************************************************/void MS561101BA_GetTemperature(void)
{D2_Temp = MS561101BA_getConversion(0x58);delay_ms(10);dT=D2_Temp - (((uint32_t)Cal_C[5])<<8);TEMP=2000+dT*((uint32_t)Cal_C[6])/8388608;
}///***********************************************
// * @brief 读取气压
// * @param None
// * @retval None
//************************************************/
void MS561101BA_getPressure(void)
{D1_Pres= MS561101BA_getConversion(0x48);delay_ms(10);OFF_=(uint32_t)Cal_C[2]*65536+((uint32_t)Cal_C[4]*dT)/128;SENS=(uint32_t)Cal_C[1]*32768+((uint32_t)Cal_C[3]*dT)/256;if(TEMP<2000){Aux = (2000-TEMP)*(2000-TEMP);T2 = (dT*dT) / 0x80000000; OFF2 = 2.5f*Aux;SENS2 = 1.25f*Aux;TEMP = TEMP - T2;OFF_ = OFF_ - OFF2;SENS = SENS - SENS2; }Pressure= (D1_Pres*SENS/2097152-OFF_)/32768;}
5、main.c
int main(void){ IIC_Init(); //初始化IIC delay_ms(100);MS561101BA_RESET(); // Reset Device 复位MS5611delay_ms(100); //复位后延时(注意这个延时是一定必要的,可以缩短但似乎不能少于20ms)MS5611_init(); //初始化MS5611while(1){delay_ms(50);MS561101BA_GetTemperature();//获取温度MS561101BA_getPressure(); //获取大气压}
}
MS5611气压计IIC源程序相关推荐
- STM32F407单片机移植MS5611气压计(基于IIC)---同时解决温度低于20度时计算得到的大气压错误的问题
最近一个工程项目需要使用MS5611气压计,就花时间研究了一下,发现网上很多都是基于STM32F103单片机的MS5611气压计源程序,当移植到STM32F407时发现采集的大气压力和温度值不对,同时 ...
- STM32+MS5611气压计测量海拔,IIC方式
要源码的自己加群,群号自己在博客里找.如果你连群号都找不到,那源码就不用要了,谢谢. 气压转海拔的经验公式,自行搜索<气压温度求海拔高度><关于大气压力与海拔高度经验计算公式的讨论& ...
- 基于正点原子STM32F103精英板IIC实验的MS5611气压计的使用
MS5611是一款气压计,能够提供高精度的气压值与温度值,这次做项目正好需要用到这款传感器,包括之前也没好好学习用过IIC,所以写下博客记录一下. 如果有需要使用的朋友可以去https://downl ...
- MS5611气压计 I2C驱动代码 STM32
文章目录 前言 通信接口:IIC 一,MS5611的5种命令 RESET : 重启芯片 READ PROM: D1,D2 CONVERSION READ ADC RESULT: 二,实现代码 1 初始 ...
- MS5611气压计数据测试报告
气压计测得气压和温度值为模拟量,ms5611气压计会自动将模拟量转换成数字量,对于不同的精度,转换时间也不相同.本测试选用的精度为最高的OSR=4096,如下表所示,转换时间选择最大值9.04ms.以 ...
- MS5611气压计原理图设计
MS5611气压计原理图设计
- 气压计 MS5611-01BA03 数据读取
1.简介及注意事项 气压计MS5611-01BA03 采用24位的气压和温度AD转换值,SPI.IIC接口协议读取,采用256.512.1024.2048和4096的过采样率提高采样精度.256的 ...
- pixhawk硬件构架
1.Phxhawk连接线路 2.Phxhawk硬件芯片列表 处理器 STM32F427 VIT6 (168 Mhz/256 KB RAM/2 MB 闪存 100Pin) 32位 STM32F100C ...
- 飞控pixhawk硬件框架
本文转载于:https://blog.csdn.net/csshuke/article/details/78952026 1.Phxhawk连接线路 2.Phxhawk硬件芯片列表 处理器 ST ...
最新文章
- Java知多少(完结篇)
- Mat转CImage
- Lunar New Year and Number Division
- 【软件】我安装Tomcat5.5(Java Web开发服务器)的几点经验
- 在StackBlitz上setup SAP Spartacus
- Maven硒测试自动化教程
- 格力宣布11月11日一天让利7亿元 全场空调最高降3900元
- vivo硬件测试员干什么的_vivo的新年礼物:用APEX 2019告诉你5G旗舰机该长啥样
- 没用TestNG之前,没想过自动化用例管理可以这么强大
- Linux下的iftop命令介绍
- SQLite介绍及使用
- LINUX中文件的移动,Linux中文件移动文件的操作命令为 ()
- 4_unittest测试框架_管理测试用例生成测试报告
- 计算机科学与技术培养计划,计算机科学与技术专业培养方案(2017版).PDF
- LAPARDIN WEDLUTS Romantic Wedding LUTs 浪漫唯美婚礼电影调色预设
- js 实现在线考试切屏代码
- 自建局域网 OTA 服务器
- sap采购申请自动转采购订单
- es6中symbol详解
- Linux禁止普通用户使用某些命令