#include "SHT2x.h" #include #include "FreeRTOS.h" #include "task.h" //初始化IIC void I2C_init(void) { /* enable the User key clock */ rcu_periph_clock_enable(RCU_GPIOB); gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_11); //gpio_bit_set(GPIOB, GPIO_PIN_10|GPIO_PIN_11); gpio_bit_set(GPIOB,GPIO_PIN_11); gpio_bit_set(GPIOB,GPIO_PIN_10); /*GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_PIN = GPIO_PIN_10 | GPIO_PIN_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);*/ //gpio_bit_set(GPIOB,GPIO_PIN_10); //gpio_bit_set(GPIOB,GPIO_PIN_11); } extern void IIC_delay(void); //产生IIC起始信号 void iic_Start(void) { sda_OUT(); //sda线输出 gpio_bit_set(GPIOB,GPIO_PIN_10); gpio_bit_set(GPIOB,GPIO_PIN_11); IIC_delay(); gpio_bit_reset(GPIOB,GPIO_PIN_11);//START:when CLK is high,DATA change form high to low IIC_delay(); gpio_bit_reset(GPIOB,GPIO_PIN_10);//钳住I2C总线,准备发送或接收数据 IIC_delay(); } //产生IIC停止信号 void iic_Stop(void) { sda_OUT();//sda线输出 gpio_bit_reset(GPIOB,GPIO_PIN_10); gpio_bit_reset(GPIOB,GPIO_PIN_11);//STOP:when CLK is high DATA change form low to high IIC_delay(); gpio_bit_set(GPIOB,GPIO_PIN_10); IIC_delay(); gpio_bit_set(GPIOB,GPIO_PIN_11);//发送I2C总线结束信号 IIC_delay(); } //等待应答信号到来 //返回值:1,接收应答失败 // 0,接收应答成功 u8 IIC_Wait_Ack(void) { u8 ucErrTime=0; sda_IN(); //SDA设置为输入 gpio_bit_set(GPIOB,GPIO_PIN_11); IIC_delay(); gpio_bit_set(GPIOB,GPIO_PIN_10); IIC_delay(); while(gpio_input_bit_get(GPIOB, GPIO_PIN_11)) { ucErrTime++; // Delay_Us(1); if(ucErrTime>250) { iic_Stop(); return 1; } } gpio_bit_reset(GPIOB,GPIO_PIN_10);//时钟输出0 return 0; } //产生ACK应答 void iic_Ack(void) { gpio_bit_reset(GPIOB,GPIO_PIN_10); sda_OUT(); gpio_bit_reset(GPIOB,GPIO_PIN_11); IIC_delay(); gpio_bit_set(GPIOB,GPIO_PIN_10); IIC_delay(); gpio_bit_reset(GPIOB,GPIO_PIN_10); } //不产生ACK应答 void IIC_NAck(void) { gpio_bit_reset(GPIOB,GPIO_PIN_10); sda_OUT(); gpio_bit_set(GPIOB,GPIO_PIN_11); IIC_delay(); gpio_bit_set(GPIOB,GPIO_PIN_10); IIC_delay(); gpio_bit_reset(GPIOB,GPIO_PIN_10); } //IIC发送一个字节 //返回从机有无应答 //1,有应答 //0,无应答 void IIC_Send_Byte(u8 txd) { u8 t; sda_OUT(); gpio_bit_reset(GPIOB,GPIO_PIN_10);//拉低时钟开始数据传输 for(t=0;t<8;t++) { // iiC_SDA=(txd&0x80)>>7; if((txd&0x80)>>7==1) gpio_bit_set(GPIOB,GPIO_PIN_11); else gpio_bit_reset(GPIOB,GPIO_PIN_11); txd<<=1; IIC_delay(); //对TEA5767这三个延时都是必须的 gpio_bit_set(GPIOB,GPIO_PIN_10); IIC_delay(); gpio_bit_reset(GPIOB,GPIO_PIN_10); IIC_delay(); } } //读1个字节,ack=1时,发送ACK,ack=0,发送nACK u8 IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; sda_IN();//SDA设置为输入 for(i=0;i<8;i++ ) { gpio_bit_reset(GPIOB,GPIO_PIN_10); IIC_delay(); gpio_bit_set(GPIOB,GPIO_PIN_10); receive<<=1; if(READ_SDA)receive++; IIC_delay(); } if (!ack) IIC_NAck();//发送nACK else iic_Ack(); //发送ACK return receive; } extern float Temp; SHT2x_data SHT20; /** * @brief sht20初始化 * @param 无 * @retval 无 */ u8 SHT2x_Init(void) { u8 err; I2C_init(); err = SHT2x_SoftReset(); return err; } u8 SHT2x_SoftReset(void) //SHT20软件复位 { u8 err=0; iic_Start(); IIC_Send_Byte(I2C_ADR_W); err = IIC_Wait_Ack(); IIC_Send_Byte(0xFE); err = IIC_Wait_Ack(); iic_Stop(); return err; } /** * @brief 获取温度 * @param 无 * @retval float 温度值 */ float SHT2x_GetTemp(void) { float TEMP; u8 ack, tmp1, tmp2; u16 ST; u16 i=0; iic_Start(); //发送IIC开始信号 IIC_Send_Byte(I2C_ADR_W); //IIC发送一个字节 ack = IIC_Wait_Ack(); IIC_Send_Byte(TRIG_TEMP_MEASUREMENT_POLL); ack = IIC_Wait_Ack(); do { vTaskDelay(1); iic_Start(); //发送IIC开始信号 IIC_Send_Byte(I2C_ADR_R); i++; ack = IIC_Wait_Ack(); if(i==100) break; } while(ack!=0); tmp1 = IIC_Read_Byte(1); tmp2 = IIC_Read_Byte(1); IIC_Read_Byte(0); iic_Stop(); ST = (tmp1 << 8) | (tmp2 << 0); ST &= ~0x0003; TEMP = ((float)ST * 0.00268127) - 46.85; return (TEMP); } /** * @brief 温度排序 * @param arr 温度数组,len 次数 * @retval 无 */ void bubble_sort(float arr[], int len) { int i, j; float temp; for (i = 0; i < len - 1; i++) for (j = 0; j < len - 1 - i; j++) if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } /** * @brief 温度获取(初始化) * @param 无 * @retval 无 */ float SHT2x_GetTempInit(void) { return SHT2x_GetTemp(); } /** * @brief 温度获取 * @param 无 * @retval 无 */ float SHT2x_GetTempPoll(void) { return SHT2x_GetTemp(); } /** * @brief 湿度获取 * @param 无 * @retval 无 */ float SHT2x_GetHumiPoll(void) { float HUMI; u8 ack, tmp1, tmp2; u16 SRH; u16 i=0; iic_Start(); //发送IIC开始信号 IIC_Send_Byte(I2C_ADR_W); //IIC发送一个字节 ack = IIC_Wait_Ack(); IIC_Send_Byte(TRIG_HUMI_MEASUREMENT_POLL); ack = IIC_Wait_Ack(); do { vTaskDelay(1); iic_Start(); //发送IIC开始信号 IIC_Send_Byte(I2C_ADR_R); i++; ack = IIC_Wait_Ack(); if(i==100)break; } while(ack!=0); tmp1 = IIC_Read_Byte(1); tmp2 = IIC_Read_Byte(1); IIC_Read_Byte(0); iic_Stop(); SRH = (tmp1 << 8) | (tmp2 << 0); SRH &= ~0x0003; HUMI = ((float)SRH * 0.00190735) - 6; return (HUMI); }