SDP810-500PA气压传感器驱动程序

平台

平台: stm32f103c8t6
在这里插入图片描述

协议

协议:IIC
在这里插入图片描述

原理

在这里插入图片描述

驱动源码

IIC_dif_pressure.c

#include <stm32f10x_lib.h>
#include "IIC_dif_pressure.h"
#include "stdio.h"
#include "delay.h"
unsigned char  crc = 0xff;
float dif_pressure;//压差值
float tempre_value;  //温度因子
float Scale_Factors; //比例因子


void delay_xus(u16 time)
{    
	u16 i=0;     
	while(time--)
	{      			
		i=10;  
		while(i--) ;    
	}
}
void delay_xms(u16 time)
{     
	u16 i=0; 
	while(time--) 
	{     
		i=12000; 
		while(i--) ;     
	}
}



void IIC2_Init(void)
{					     
	GPIO_InitTypeDef GPIO_InitStructure;  
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, 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(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA,GPIO_Pin_12|GPIO_Pin_11); 	
}

void IIC2_Start(void)
{
	SDA2_OUT();    
	IIC2_SDA=1;	  	  
	IIC2_SCL=1;
	delay_xus(4);
 	IIC2_SDA=0;
	delay_xus(4);
	IIC2_SCL=0;
}	  

void IIC2_Stop(void)
{
	SDA2_OUT();
	IIC2_SCL=0;
	IIC2_SDA=0;
 	delay_xus(4);
	IIC2_SCL=1; 
	IIC2_SDA=1;
	delay_xus(4);							   	
}

uint8_t IIC2_Wait_Ack(void)
{
	uint8_t ucErrTime=0;
	SDA2_IN();     
	IIC2_SDA=1;
	delay_xus(1);	   
	IIC2_SCL=1;
	delay_xus(1);	 
	while(READER_SDA)
	{
		ucErrTime++;
		if(ucErrTime>250)
		{
			IIC2_Stop();
			return 1;
		}
	}
	IIC2_SCL=0;//ʱÖÓÊä³ö0 	   
	return 0;  
} 

void IIC2_Ack(void)
{
	IIC2_SCL=0;
	SDA2_OUT();
	IIC2_SDA=0;
	delay_xus(2);
	IIC2_SCL=1;
	delay_xus(2);
	IIC2_SCL=0;
}
	    
void IIC2_NAck(void)
{
	IIC2_SCL=0;
	SDA2_OUT();
	IIC2_SDA=1;
	delay_xus(2);
	IIC2_SCL=1;
	delay_xus(2);
	IIC2_SCL=0;
}					 				     
		  
void IIC2_Send_Byte(u8 txd)
{                        
    uint8_t t;   
	SDA2_OUT(); 	    
    IIC2_SCL=0;
	for(t=0;t<8;t++)
    {              
  
		if((txd&0x80)>>7)
			IIC2_SDA=1;
		else
			IIC2_SDA=0;	  
		txd<<=1;   
		delay_xus(2);
		IIC2_SCL=1;
		delay_xus(2); 
		IIC2_SCL=0;	
		delay_xus(2);
		
    }	 
} 	    
//读1个字节
uint8_t IIC2_Read_Byte(unsigned char ack)
{
	uint8_t i,receive=0;
	SDA2_IN();//SDAÉèÖÃΪÊäÈë
    for(i=0;i<8;i++ )
	{
        IIC2_SCL=0; 
        delay_xus(2);
		IIC2_SCL=1;
        if(READER_SDA)receive++;   
        receive<<=1;
		delay_xus(1); 
    }					 
    if (ack==0)
        IIC2_NAck();//·¢ËÍnACK
    else
        IIC2_Ack(); //·¢ËÍACK   
    return receive;
}

//³õʼ»¯IIC2½Ó¿Ú
void SDP810_Init(void)
{
	IIC2_Init();
}
//¶ÁÈ¡sdp810Êý¾Ý

void  SDP810_ReadData(u16 cmd,int8_t *p)
{    
	    uint8_t i=0;
	    uint8_t ack=0;
	    IIC2_Start();  	 	   
		IIC2_Send_Byte(0X4a);           //发送写地址		   
		IIC2_Wait_Ack();
	    IIC2_Send_Byte(cmd>>8);//发送高地址
	    IIC2_Wait_Ack();
		IIC2_Send_Byte(cmd);   //发送低地址
		IIC2_Wait_Ack(); 
	    IIC2_Stop();//产生一个停止条件
	    
	    delay_xms(10);
	    IIC2_Start();
	    IIC2_Send_Byte(0X4b);           //发送读地址	
        IIC2_Wait_Ack();	
	   
	    for(i=0;i<9;i++)
	
	      {
			 if(i<8)
			 {
			    ack=1;
			 }
			 else
			 {
			    ack=0;//最后一个发送nack
			 }
             p[i]=IIC2_Read_Byte(ack);	
			
			 
		  }
           IIC2_Stop();//产生一个停止条件
		   delay_xms(10);

}	
//sdp810连续测量写命令
void SDP810_Write_Cmd(uint16_t cmd)
{				   	  	    																 
     	
	    IIC2_Start();  
		IIC2_Send_Byte(0X4a);	    //发送写命令
	    IIC2_Wait_Ack();
	    IIC2_Send_Byte(cmd>>8);//发送高地址
	    IIC2_Wait_Ack();
		IIC2_Send_Byte(cmd);   //发送低地址
		IIC2_Wait_Ack(); 	 										  		   			   
		IIC2_Stop();//产生一个停止条件
	    delay_xms(10);
}

//sdp810获取值
void Sdp810_GetValue(void)
{
    int8_t p[9];
	SDP810_ReadData(0x3615,p);
//	SDP810_ReadData(0x361E,p);
	dif_pressure=(float)(((p[0]*256)+p[1])/240.0);
	tempre_value=(float)(((p[3]*256)+p[4])/200.0);
	Scale_Factors=(float)((p[6]*256)+p[7]);
	
	
}
 
	


IIC_dif_pressure.h

#ifndef __IICPRESSURE_H
#define __IICPRESSURE_H
#include "sys.h"

//IO方向设置
#define SDA2_IN()  {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=(u32)8<<12;} //输入上拉、下拉模式
#define SDA2_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=(u32)3<<12;} //推挽输出模式
//IO操作函数	 
#define IIC2_SCL    PAout(12) //SCL
#define IIC2_SDA    PAout(11) //SDA	 
#define READER_SDA   PAin(11)  //输入SDA 
#define SLAVE_ADDRESS	0x25
#define SDP_TYPE SLAVE_ADDRESS//SDP810地址

//IIC2所有操作函数
void IIC2_Init(void);                //初始化IIC2的IO口				 
void IIC2_Start(void);				//发送IIC2开始信号
void IIC2_Stop(void);	  			//发送IIC2停止信号
void IIC2_Send_Byte(uint8_t txd);	//IIC2发送一个字节
uint8_t IIC2_Read_Byte(uint8_t ack);//IIC2读取一个字节
uint8_t IIC2_Wait_Ack(void); 		//IIC2等待ACK信号
void IIC2_Ack(void);				//IIC2发送ACK信号
void IIC2_NAck(void);				//IIC2不发送ACK信号

void IIC2_Write_One_Byte(uint8_t daddr,uint8_t addr,uint8_t data);
uint8_t IIC2_Read_One_Byte(uint8_t daddr,uint8_t addr);	


void  SDP810_ReadData(u16 cmd,int8_t *p);//读多个字节
void SDP810_Write_Cmd(uint16_t cmd);		
extern void Sdp810_GetValue(void);




void SDP810_Init(void); //初始化IIC

//extern void delay_ms(u16 time);
//extern void delay_us(u16 time);    
#endif







  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
sdp810是一种常用的气压传感器,它可以用于测量大气压力和温度。为了使用sdp810传感器,我们需要编写一个适当的驱动程序sdp810传感器驱动程序主要包括以下功能: 1. 连接传感器:我们需要通过适当的接口(例如I2C或SPI)将sdp810传感器连接到我们的单片机或计算机系统上。通过传感器的数据接口,我们可以与传感器进行通信,并读取其测量值。 2. 初始化:在驱动程序中,我们需要对sdp810传感器进行初始化。这可以包括设置传感器的通信参数和工作模式,以确保传感器准确地获取环境中的气压和温度数据。 3. 测量数据获取:一旦传感器初始化完成,我们可以使用驱动程序来定期获取sdp810传感器的测量数据。这可以通过向传感器发送指令并读取其返回的数据来完成。 4. 数据解析:sdp810传感器返回的数据通常是原始的数字数据。为了实际应用,我们可能需要将这些数据转换为易于理解或使用的单位。例如,我们可以将气压数据转换为帕斯卡单位,将温度数据转换为摄氏度或华氏度。 5. 错误处理:在驱动程序中,我们还应该包含错误处理机制,以处理传感器通信错误或异常情况。当传感器无法正常工作或返回错误数据时,我们可以通过驱动程序提供适当的反馈或采取必要的措施。 总之,sdp810气压传感器驱动程序需要包括连接传感器、初始化、测量数据获取、数据解析以及错误处理等功能。通过编写一个有效的驱动程序,我们可以确保准确地获取和处理sdp810传感器气压和温度数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值