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\],GD32E507的时钟树中使用了HCLK作为主时钟信号。在读取数据时,为了保证数据的准确性,会延迟一定的HCLK周期后再进行采样。此外,还可以使用内部可调时钟来微调HCLK,以提高数据的准确性。读取的数据在进入AHB总线之前会先存储在异步FIFO中,读命令过程中会添加2-3个HCLK的延迟。 根据引用\[2\],在初始化SDRAM的时序寄存器时,需要设置不同的时序参数。这些参数包括模式寄存器加载延迟、自刷新模式退出延迟、行地址选通延迟、自刷新延迟、写恢复延迟、行预充电延迟和行到列延迟。具体的设置需要参考对应SDRAM芯片数据手册的说明,不同厂商对同一种时序的命名可能不同。如果找不到相应的说明,可以参考兆易创新官方的例程或者将数值设得稍大一些。 根据引用\[3\],在初始化SDRAM时,需要设置一些参数。其中包括写保护使能、时钟频率选择、突发读切换使能、管道读延迟和时序初始化结构体的填写。时钟频率选择时,一般选择HCLK的二分频,并且不能超过SDRAM的最高工作频率。管道读延迟一般设置为2个HCLK周期。时序初始化结构体的填写需要根据具体的时序要求进行设置。 综上所述,GD32E507的时钟树需要根据具体的需求和SDRAM芯片的要求进行设置和初始化。 #### 引用[.reference_title] - *1* *2* *3* [【GD32】从零开始学GD32单片机高级篇——外部存储器控制器EXMC详解+SDRAM读写例程](https://blog.csdn.net/JackieCoo/article/details/129135616)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值