IIC驱动.c部分
#include "main.h"
void IIC_SDA(uint8_t status)
{
if(status == 1)
{
gpio_bit_set(SDA_GPIO_Port,SDA_Pin);
}
else
{
gpio_bit_reset(SDA_GPIO_Port,SDA_Pin);
}
}
void IIC_SCL(uint8_t status)
{
if(status == 1)
{
gpio_bit_set(SCL_GPIO_Port,SCL_Pin);
}
else
{
gpio_bit_reset(SCL_GPIO_Port,SCL_Pin);
}
}
uint8_t READ_SDA(void)
{
FlagStatus status;
status = gpio_input_bit_get(SDA_GPIO_Port,SDA_Pin);
if(status == SET)
{
return 1;
}
else
{
return 0;
}
}
void IIC_Init(void)
{
rcu_periph_clock_enable(RCU_GPIOB);
gpio_init(SCL_GPIO_Port,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,SCL_Pin);
gpio_init(SDA_GPIO_Port,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,SDA_Pin);
}
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA(1);
IIC_SCL(1);
delay_us(4);
IIC_SDA(0);
delay_us(4);
IIC_SCL(0);
}
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL(0);
IIC_SDA(0);
delay_us(4);
IIC_SCL(1);
IIC_SDA(1);
delay_us(4);
}
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();
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);
return 0;
}
void IIC_Ack(void)
{
IIC_SCL(0);
SDA_OUT();
IIC_SDA(0);
delay_us(2);
IIC_SCL(1);
delay_us(2);
IIC_SCL(0);
}
void IIC_NAck(void)
{
IIC_SCL(0);
SDA_OUT();
IIC_SDA(1);
delay_us(2);
IIC_SCL(1);
delay_us(2);
IIC_SCL(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);
IIC_SCL(1);
delay_us(2);
IIC_SCL(0);
delay_us(2);
}
}
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();
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();
else
IIC_Ack();
return receive;
}
IIC驱动.h部分
#ifndef __MYIIC_H
#define __MYIIC_H
#include "main.h"
#define SCL_Pin GPIO_PIN_10
#define SCL_GPIO_Port GPIOB
#define SDA_Pin GPIO_PIN_11
#define SDA_GPIO_Port GPIOB
#define SDA_IN() gpio_init(SDA_GPIO_Port,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,SDA_Pin);
#define SDA_OUT() gpio_init(SDA_GPIO_Port,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,SDA_Pin);
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Send_Byte(u8 txd);
u8 IIC_Read_Byte(unsigned char ack);
u8 IIC_Wait_Ack(void);
void IIC_Ack(void);
void IIC_NAck(void);
void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);
#endif
SHT31、85驱动.c部分
#include "main.h"
SHT85_DATA SHT85_Data;
void SHT3X_Wait_Ack(u8 f)
{
u8 flag=1;
flag=IIC_Wait_Ack();
if(f)
{if(flag) SHT3X_Init();}
}
void SHT3X_Init()
{
IIC_Start();
IIC_Send_Byte(SHT3X_ADRESS_A<<1|write);
SHT3X_Wait_Ack(0);
SHT3X_Mode_Set(MPS_4,Repeatability_Medium);
SHT3X_Wait_Ack(0);
}
void SHT3X_Get_Vlaue()
{
SHT3X_Write_Command(Fetch_Data);
IIC_Start();
IIC_Send_Byte(SHT3X_ADRESS_A<<1|read);
SHT3X_Wait_Ack(0);
}
void SHT3X_Write(u16 code)
{
unsigned int MSB,LSB;
u16 date;
date=code;
MSB=code>>8;
date=date<<8;
LSB=date>>8;
IIC_Send_Byte(MSB);
SHT3X_Wait_Ack(0);
IIC_Send_Byte(LSB);
SHT3X_Wait_Ack(0);
}
void SHT3X_Write_Command(u16 code)
{
IIC_Start();
IIC_Send_Byte(SHT3X_ADRESS_A<<1|write);
SHT3X_Wait_Ack(0);
SHT3X_Write(code);
SHT3X_Wait_Ack(0);
}
u16 SHT3X_Read_Date(u8 ack)
{
u8 i;
u16 MSB,LSB;
u16 date;
MSB=IIC_Read_Byte(1);
LSB=IIC_Read_Byte(1);
for(i=0;i<8;i++)
{
MSB=MSB*2;
}
date=MSB+LSB;
return date;
}
u8 SHT3X_CRC_Calculation(u16 date)
{
u8 i,j=0;
u32 crc,p=0x31;
crc=date;
crc<<=8;
p<<=16;
for(i=0;i<8;i++)
{
while(!((crc&0x800000)>>23)) {p>>=1; j++;}
crc=crc&p;
if(j==15) break;
}
return crc;
}
void SHT3X_CRC_Check(u8 t,u8 ack,u16 date)
{
u8 crc_re,crc_ca;
crc_re=IIC_Read_Byte(ack);
if(t)
{
crc_ca=SHT3X_CRC_Calculation(date);
if(crc_ca!=crc_re) SHT3X_Read_Date(ack);
}
if(!ack) IIC_Stop();
}
float SHT3X_Date_Process(u8 Flag,u16 date)
{
float Date;
if(Flag==2) Date=SHT3X_TF(date);
if(Flag==1) Date=SHT3X_TC(date);
if(Flag==0) Date=SHT3X_RH(date);
return Date;
}
void SHT3X_Mode_Set(u8 mps,u8 re)
{
if(mps==0)
{
if(re==0) SHT3X_Write_Command(0x202F);
else if(re==1) SHT3X_Write_Command(0x2024);
else if(re==2) SHT3X_Write_Command(0x2032);
}
else if(mps==1)
{
if(re==0) SHT3X_Write_Command(0x212D);
else if(re==1) SHT3X_Write_Command(0x2126);
else if(re==2) SHT3X_Write_Command(0x2130);
}
else if(mps==2)
{
if(re==0) SHT3X_Write_Command(0x222B);
else if(re==1) SHT3X_Write_Command(0x2220);
else if(re==2) SHT3X_Write_Command(0x2236);
}
else if(mps==3)
{
if(re==0) SHT3X_Write_Command(0x2329);
else if(re==1) SHT3X_Write_Command(0x2322);
else if(re==2) SHT3X_Write_Command(0x2334);
}
else if(mps==4)
{
if(re==0) SHT3X_Write_Command(0x272A);
else if(re==1) SHT3X_Write_Command(0x2721);
else if(re==2) SHT3X_Write_Command(0x2737);
}
}
u16 SHT3X_Get_Status(void)
{
u16 sta;
SHT3X_Write_Command(Read_Status);
IIC_Start();
IIC_Send_Byte(SHT3X_ADRESS_A<<1|read);
SHT3X_Wait_Ack(0);
sta=SHT3X_Read_Date(ACK);
SHT3X_CRC_Check(CRC_OFF,NACK,sta);
return sta;
}
void SHT3X_Statues_Process(u8 f,u16 sta)
{
}
void SHT85_Read(void)
{
SHT3X_Get_Vlaue();
SHT85_Data.Temperature_Raw=SHT3X_Read_Date(ACK);
SHT3X_CRC_Check(CRC_OFF,ACK,SHT85_Data.Temperature_Raw);
SHT85_Data.Humidity_Raw=SHT3X_Read_Date(ACK);
SHT3X_CRC_Check(CRC_OFF,NACK,SHT85_Data.Humidity_Raw);
SHT85_Data.Temperature = SHT3X_Date_Process(T_C,SHT85_Data.Temperature_Raw);
SHT85_Data.Humidity = SHT3X_Date_Process(R_H,SHT85_Data.Humidity_Raw);
}
void sht85_thread_entry (void *parameter)
{
IIC_Init();
SHT3X_Init();
rt_thread_mdelay(100);
while(1)
{
SHT85_Read();
rt_thread_mdelay(1000);
rt_thread_mdelay(100);
}
}
SHT31、85驱动.h部分
#ifndef _SHT3X_H
#define _SHT3X_H
#include "main.h"
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
typedef struct
{
float Humidity;
float Temperature;
float Humidity_Raw;
float Temperature_Raw;
unsigned short Sta;
}SHT85_DATA;
extern SHT85_DATA SHT85_Data;
#define SHT3X_ADRESS_A 0x44
#define SHT3X_ADRESS_B 0x45
#define SHT3X_GENERALL_CALL_ADRESS 0X0006
#define Mode_Set_A 0x2C0D
#define Mode_Set_B 0x2322
#define Fetch_Data 0xE000
#define ART_ON 0x2B32
#define Break_Periodic_Mode 0x3093
#define Soft_Reset 0x30A2
#define Heater_Enable 0x306D
#define Heater_Disable 0x3066
#define Read_Status 0xF32D
#define Clear_Status 0x3041
#define R_H 0
#define T_C 1
#define T_F 2
#define CRC_ON 1
#define CRC_OFF 0
#define ACK 1
#define NACK 0
#define write 0
#define read 1
#define Repeatability_Low 0
#define Repeatability_Medium 1
#define Repeatability_High 2
#define MPS_0_5 0
#define MPS_1 1
#define MPS_2 2
#define MPS_4 3
#define MPS_10 4
#define CRC_Statues 0
#define Command_Statues 1
#define SHT3X_TC(date) (175 * (float)date / 65535 -45)
#define SHT3X_TF(date) (315 * (float)date / 65535 -49)
#define SHT3X_RH(date) (100 * (float)date / 65535)
void SHT3X_Init(void);
void SHT3X_Write(u16 code);
void SHT3X_Write_Command(u16 code);
void SHT3X_Wait_Ack(u8 f);
void SHT3X_Get_Vlaue(void);
void SHT3X_Mode_Set(u8 mps,u8 re);
void SHT3X_Statues_Process(u8 f,u16 sta);
u8 SHT3X_CRC_Calculation(u16 date);
void SHT3X_CRC_Check(u8 t,u8 ack,u16 date);
float SHT3X_Date_Process(u8 Flag,u16 date);
u16 SHT3X_Read_Date(u8 ack);
u16 SHT3X_Get_Status(void);
void SHT85_Read(void);
#endif
测试函数
#include "main.h"
IIC_Init();
SHT3X_Init();
rt_thread_mdelay(100);
while(1)
{
SHT85_Read();
delay(1000);
delay(100);
}