平台
平台: 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