OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2189|回复: 3

SI7021基于STM32f0

[复制链接]

11

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-11-19
在线时间
31 小时
发表于 2016-6-23 17:22:51 | 显示全部楼层 |阅读模式
#include "SI7020.H"
#include "usart.h"
#define SI7021_W 0x80
#define SI7021_R 0x81

//3õê¼»ˉIIC
void IIC_Init(void)
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_AHBPeriphClockCmd(        RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOD, ENABLE );        //ê1ÄüGPIOBê±Öó
         //SCL  PB3  
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ;   
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        //SDA PD2
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ;   
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
       
        GPIO_SetBits(GPIOD,GPIO_Pin_2);
        GPIO_SetBits(GPIOB,GPIO_Pin_3);
}

void SDA_OUT(void)
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;  
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PA6:SDA  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ;   //íÆíìêä3ö
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void SDA_IN(void)
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;  
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PA6:SDA  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN ;   
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
}
//2úéúIICÆeê¼DÅoÅ
void IIC_Start(void)
{
        SDA_OUT();     //sdaÏßêä3ö
        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×üÏߣ¬×¼±¸·¢Ëí»ò½óêÕêy¾Y
}          
//2úéúIICí£Ö1DÅoÅ
void IIC_Stop(void)
{
        SDA_OUT();//sdaÏßêä3ö
        IIC_SCL_0;
        IIC_SDA_0;//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        IIC_SCL_1;
        IIC_SDA_1;//·¢ËíI2C×üÏß½áêøDÅoÅ
        delay_us(4);                                                                  
}
//μè′yó|′eDÅoÅμ½à′
//·μ»ØÖμ£o1£¬½óêÕó|′eê§°ü
//        0£¬½óêÕó|′e3é1|
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA_IN();      //SDAéèÖÃÎaêäèë  
        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;//ê±Öóêä3ö0           
        return 0;  
}
//2úéúACKó|′e
void IIC_Ack(void)
{
        IIC_SCL_0;
        SDA_OUT();
        IIC_SDA_0;
        delay_us(2);
        IIC_SCL_1;
        delay_us(2);
        IIC_SCL_0;
}
//2»2úéúACKó|′e                    
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·¢Ëíò»¸ö×Ö½ú
//·μ»Ø′ó»úóDÎTó|′e
//1£¬óDó|′e
//0£¬ÎTó|′e                          
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
        SDA_OUT();             
    IIC_SCL_0;//à-μíê±Öó¿aê¼êy¾Y′«êä
    for(t=0;t<8;t++)
    {
                                if(txd&0x80)IIC_SDA_1;
                                else IIC_SDA_0;
    //    IIC_SDA=(txd&0x80)>>7;
        txd<<=1;           
                delay_us(4);   //&#182;&#212;TEA5767&#213;aèy&#184;&#246;&#209;óê±&#182;&#188;ê&#199;±&#216;D&#235;μ&#196;
                IIC_SCL_1;
                delay_us(4);
                IIC_SCL_0;       
                delay_us(4);
    }         
}             
//&#182;á1&#184;&#246;×&#214;&#189;ú£&#172;ack=1ê±£&#172;·¢&#203;íACK£&#172;ack=0£&#172;·¢&#203;ínACK   
u8 IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();//SDAéè&#214;&#195;&#206;aê&#228;è&#235;
    for(i=0;i<8;i++ )
        {
        IIC_SCL_0;
        delay_us(4);
                IIC_SCL_1;
        receive<<=1;
        if(READ_SDA)receive++;   
                delay_us(4);
    }                                         
    if (!ack)
        IIC_NAck();//·¢&#203;ínACK
    else
        IIC_Ack(); //·¢&#203;íACK   
    return receive;
}

/*
1|&#196;ü:&#182;áè&#161;êa&#182;è

*/
float ReadHumidity(void)
{
        uint16_t data ;
        float Humi;
        IIC_Start();
        IIC_Send_Byte(0X80);            //·¢&#203;í′ó&#187;úμ&#216;&#214;·  D′
        if(IIC_Wait_Ack()) return 1;//ó|′eê§°ü
        IIC_Send_Byte(0XE5);            //·¢&#203;í &#182;áêa&#182;è
        if(IIC_Wait_Ack()) return 2;//ó|′eê§°ü
        delay_ms(100);
        IIC_Start();
        IIC_Send_Byte(0X81);            //·¢&#203;í′ó&#187;úμ&#216;&#214;·  &#182;á
        if(IIC_Wait_Ack()) return 3;//ó|′eê§°ü
        data = IIC_Read_Byte(1);//&#184;&#223;°&#203;&#206;&#187; 1&#187;&#216;ó|ACK
        data = data<<8;
        data = data + IIC_Read_Byte(0);//μí°&#203;&#206;&#187;
        IIC_Stop();//2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t          
        Humi = 125.00f * data / 65536 - 6;  
        return Humi;
}
/*
&#182;áè&#161;&#206;&#194;&#182;è
*/
float ReadTemperature(void)
{
        uint16_t data ;
        float Temp;
        IIC_Start();
        IIC_Send_Byte(0X80);            //·¢&#203;í′ó&#187;úμ&#216;&#214;·  D′
        if(IIC_Wait_Ack()) return 1;//ó|′eê§°ü
        IIC_Send_Byte(0XE3);            //·¢&#203;í &#182;á&#206;&#194;&#182;è
        if(IIC_Wait_Ack()) return 2;//ó|′eê§°ü
        delay_ms(100);                //×a&#187;&#187;Dèòaê±&#188;&#228;,ò&#187;&#191;aê&#188;&#195;&#187;óD&#188;ó&#213;a&#184;&#246;&#209;óê±ò&#187;&#214;±μ÷2&#187;3&#246;à′
        IIC_Start();
        IIC_Send_Byte(0X81);            //·¢&#203;í′ó&#187;úμ&#216;&#214;·  &#182;á
        if(IIC_Wait_Ack()) return 3;//ó|′eê§°ü
        data = IIC_Read_Byte(1);//&#184;&#223;°&#203;&#206;&#187; &#187;&#216;ó|ACK
        data = data<<8;
        data = data + IIC_Read_Byte(0);//μí°&#203;&#206;&#187;
        IIC_Stop();//2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t          
        Temp = 175.72 * data / 65536.0 - 46.85;
        return Temp;
}
       



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-11-19
在线时间
31 小时
 楼主| 发表于 2016-6-23 17:26:21 | 显示全部楼层
伸手党们用完,记得看懂
QQ图片20160623172128.png
回复 支持 1 反对 0

使用道具 举报

11

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-11-19
在线时间
31 小时
 楼主| 发表于 2016-6-23 17:23:17 | 显示全部楼层
#ifndef __SI7020_H
#define __SI7020_H

#include "system.h"
#include "delay.h"
#define IIC_SDA_1         PDSet(2)
#define IIC_SDA_0         PDReset(2)

#define IIC_SCL_1         PBSet(3)
#define IIC_SCL_0         PBReset(3)

#define READ_SDA    PDin(2)

void IIC_Init(void);
void SDA_OUT(void);
void SDA_IN(void);
void IIC_Start(void);
void IIC_Stop(void);
uint8_t IIC_Wait_Ack(void);
void IIC_Ack(void);
void IIC_NAck(void);
void IIC_Send_Byte(uint8_t);
uint8_t IIC_Read_Byte(unsigned char );
float ReadHumidity(void);
float ReadTemperature(void);
                                               
#endif
回复 支持 反对

使用道具 举报

11

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-11-19
在线时间
31 小时
 楼主| 发表于 2016-6-23 17:23:56 | 显示全部楼层
        while(1)
        {       


                delay_ms(500);
                delay_ms(500);
                data = ReadHumidity();
                printf("Humi is %2.2f\r\n",data);
                delay_ms(500);
                delay_ms(500);
                data = ReadTemperature();
                printf("Temp is %2.2f \r\n",data);
                printf("\r\n");
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 15:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表