(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