GD32E507读取SHT20温湿度传感器

(1)main.c

#include "gd32e50x.h"


int main(void )
{
    
    for( ;; )
    {
	
		Temp_Humi();	

		vTaskDelay(1000);
	}
}

bsp_iic.c

#include "bsp_iic.h"


void i2c0_init(void)
{
	i2c0_gpio_config();
	i2c0_config();
	sht20_init();
}

void  i2c0_gpio_config(void)
{
    /* enable GPIOB clock */
    rcu_periph_clock_enable(RCU_GPIOB);
	rcu_periph_clock_enable(RCU_AF);
//    /* enable I2C0 clock */
    rcu_periph_clock_enable(RCU_I2C0);

    /* connect PB6 to I2C0_SCL */
    /* connect PB7 to I2C0_SDA */
    gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);
}


void i2c0_config(void)
{
    /* enable I2C clock */
    rcu_periph_clock_enable(RCU_I2C0);
    /* configure I2C clock */
    i2c_clock_config(I2C0,I2C0_SPEED,I2C_DTCY_2);
    /* configure I2C address */
    i2c_mode_addr_config(I2C0,I2C_I2CMODE_ENABLE,I2C_ADDFORMAT_7BITS,SHT20_ADDRESS);
    /* enable I2C0 */
    i2c_enable(I2C0);
    /* enable acknowledge */
    i2c_ack_config(I2C0,I2C_ACK_ENABLE);
}



void sht20_init(void)                                                                         //SHT复位
{
    /* wait until I2C bus is idle */
    while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));
    
    i2c_start_on_bus(I2C0);
    /* wait until SBSEND bit is set */
    
    while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)){};
    /* send slave a ddress to I2C bus */
        
    i2c_master_addressing(I2C0, SHT20_ADDRESS, I2C_TRANSMITTER);
    /* wait until ADDSEND bit is set */
        
    while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)){};
    /* clear the ADDSEND bit */
        
    i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);

    /* wait until the transmit data buffer is empty */
    while( SET != i2c_flag_get(I2C0, I2C_FLAG_TBE)){};
    i2c_data_transmit(I2C0, SHT20_ADDRESS_RESET);
        
    /* wait until BTC bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_BTC)){};
    i2c_stop_on_bus(I2C0);
        
    /* wait until the stop condition is finished */
    while(I2C_CTL0(I2C0)&0x0200){};
    vTaskDelay(5);	
}

void  sht20_write(uint8_t _ucOrder)
{
    i2c_ackpos_config(I2C0, I2C_ACKPOS_CURRENT);
    /* wait until I2C bus is idle */
    while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)){};
    i2c_start_on_bus(I2C0);
        
    /* wait until SBSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)){};
    i2c_master_addressing(I2C0, SHT20_ADDRESS, I2C_TRANSMITTER);
        
    /* wait until ADDSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)){};
        
    /* clear the ADDSEND bit */
    i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);
        
    /* wait until the transmit data buffer is empty */
    while( SET != i2c_flag_get(I2C0, I2C_FLAG_TBE)){};
    i2c_data_transmit(I2C0, _ucOrder);
        
    /* wait until BTC bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_BTC)){};
}


float sht20_read(uint8_t _ucOrder)
{      
    uint8_t ucMsb,ucLsb;
//    uint8_t checksum;                         //checksum校验和没有用上 
    i2c_start_on_bus(I2C0);
    
    /* wait until SBSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)){};
        
    /* send slave address to I2C bus */
    i2c_master_addressing(I2C0, SHT20_ADDRESS, I2C_RECEIVER);
        
    /* wait until ADDSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)){};
        
    /* clear the ADDSEND bit */
    i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);
        
    /* send a stop condition to I2C bus */
    vTaskDelay(1);
        
    if(i2c_flag_get(I2C0, I2C_FLAG_RBNE))
    {
        ucMsb = i2c_data_receive(I2C0);
    }
    if(i2c_flag_get(I2C0, I2C_FLAG_RBNE))
    {
        ucLsb = i2c_data_receive(I2C0);
    }
    i2c_ack_config(I2C0, I2C_ACK_DISABLE);
//    if(i2c_flag_get(I2C1, I2C_FLAG_RBNE))
//    {
//        checksum = i2c_data_receive(I2C1);
//    }
    i2c_stop_on_bus(I2C0);
    
    /* wait until the stop condition is finished */
    while(I2C_CTL0(I2C0)&0x0200);

    /* enable acknowledge */
    i2c_ack_config(I2C0, I2C_ACK_ENABLE);
    i2c_ackpos_config(I2C0, I2C_ACKPOS_CURRENT);

    ucLsb &= 0xfc;                                                          //设置分辨率,最低两位为0,温度:14位;湿度:12位 
    f_RetVal = ucMsb * 256 + ucLsb;                                         //MSB=(MSB<<=8)+LSB;即将MSB移位到高8位

    if(_ucOrder == SHT20_ADDRESS_T)
    {
         f_Temp = (175.72f)*f_RetVal/65536-46.85f;                          //温度:T= -46.85 + 175.72 * ST/2^16
         return f_Temp;
    }
    else if(_ucOrder == SHT20_ADDRESS_H)
    {
         f_Humi = (f_RetVal*125)/65536-6;                                  //湿度: RH%= -6 + 125 * SRH/2^16
         return f_Humi;
    }
    else
        return 0;
}	


void Temp_Humi(void)
{
    int8_t Temp_Humi_reg[4];
    float Temp_value,Humi_value;


        sht20_write(SHT20_ADDRESS_T);
		vTaskDelay(80);                                   //温湿度测量转换需要85s
        Temp_value = sht20_read(SHT20_ADDRESS_T);
        if(f_Temp>0)
        {
			Send_Temp = f_Temp + 0.05f;
        }
        else
        {
			Send_Temp = f_Temp - 0.05f;
        }
        int16_t Temp = (Send_Temp * 100);
        int8_t  L_Temp = Temp & 0xff;
        int8_t  H_Temp = (Temp >> 8) & 0xff;
        
        printf("The measure temp is :%4.2fC \r\n",Send_Temp);
		
		sht20_write(SHT20_ADDRESS_H);
		vTaskDelay(80);
        Humi_value = sht20_read(SHT20_ADDRESS_H);
        Send_Humi = f_Humi + 0.05f;
        uint16_t Humi = (Send_Humi * 100);
        uint8_t  L_Humi = Humi & 0xff;
        uint8_t  H_Humi = (Humi >> 8) & 0xff;

        printf("The measure humi is :%4.2fRH \r\n",Send_Humi);
	
}

(3)bsp_iic.h

#ifndef __BSP_IIC_H_
#define __BSP_IIC_H_

#define I2C_OK                 0
#define I2C_FAIL   

#define I2C0_SPEED              400000
#define I2C0_SLAVE_ADDRESS7     0xA0

#define SHT20_ADDRESS              0x80 
#define SHT20_ADDRESS_T            0xF3
#define SHT20_ADDRESS_H            0xF5
#define SHT20_ADDRESS_RESET        0xFE             1


void Temp_Humi(void)


void i2c0_init(void);
void i2c0_gpio_config(void);
void i2c0_config(void);


float sht20_read(uint8_t _ucOrder);
void  sht20_write(uint8_t _ucOrder);
void  sht20_init(void) ;








#endif

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值