当前位置:   article > 正文

HT66F2390与SGP30学习笔记

sgp30

SGP30传感器

基本电器特性

在这里插入图片描述

SGP30value
工作电压1.62v-1.92v
TVOC测量范围0ppb-60000ppb
CO2测量范围400ppm-60000ppm
采样率1HZ
通信协议IIC

引脚图

在这里插入图片描述

SGP30读取数据

在这里插入图片描述
SGP30的命令都是双字节的,先发高位,有如下命令:
在这里插入图片描述
SGP30初始化命令:0x2003
获取空气质量值命令:0x2008

SGP30获取的数据格式为:2位CO2数据+1位CO2的CRC校验+2位TVOC数据+1位TVOC的CRC校验。
模块上电需要15s左右初始化,在初始化阶段读取的CO2浓度为400ppm,TVOC为0ppd且恒定不变。因此上电后一直读,直到TVOC不为0并且CO2不为400,SGP30模块才初始化完成。

IIC协议

IIC通信时序
在这里插入图片描述

START条件:当SCL=1时,SDA由1变成0
STOP条件:当SCL=1时,SDA由0变成1
数据传输只能在SCL=1时进行。

#include<HT66F2390.h>
#define SCL _pf5
#define SDA _pf4
#define SCLC _pfc5
#define SDAC _pfc4

void I2C_START(void)
{	SCL=0; SDA=1;								//設定 SCL=0, SDA=1
	SCLC=0; SDAC=0; 					   		//SCL/SDA為輸出模式
	SCL=1; pause();								//SCL=1, SDA=1
	SDA=0;										//SDA=0 			     						
	SCL=0;								      	//SCL=0	
}

void I2C_STOP(void)
{	SCL=0; SDA=0;								//設定 SCL=0, SDA=0
	SDAC=0;								   		//SDA 為輸出模式
	SCL=1;								      	//SCL=1
	SDA=1;								    	//SDA=1
	SCL=0; 										//SCL=0	
}

void CheckACK(void)
{	SDAC=1;							     		//SDA 為輸入模式
	SCL=1; 							     		//設定 SCL=1
	while(SDA);									//等待 ACK(Low)
	SCL=0;					   					//設定 SCL=0
}

void WriteByte(u8 I2CData)
{	u8 temp=0b10000000;
	SDAC=0;										//SDA為輸出模式
	while(temp!=0)								//傳送8個位元				
	{	SDA=(I2CData & temp)?1:0; pause();		//設定 SDA 準位
		SCL=1; pause(); SCL=0;    				//產生 SCL Clock
		temp>>=1;								//下一位元
	}					
}

u8 ReadByte(void)
{	u8 I2CData=0, temp=0b10000000;
	SDAC=1;							 			//設定 SDA 為輸入模式
	while(temp!=0)								//接收8個位元
	{	SCL=1; pause();							//設定 SCL=1
		if(SDA) I2CData|=temp;					//接收位元值
		SCL=0;									//設定 SCL=0
		temp>>=1;								//下一位元
	} 
	return I2CData;
}

void I2C_ACK(void)                              //应答函数
{
    SDAC=1;                                     //设定SDA为输入模式
    SCL=0;                                      //设定SCL=0
    delayus(2);
    SDA=0;
    delayus(2)
    SCL=1;                                      //设定SCL=1
    delayus(5);
    SCL=0;                                      //设定SCL=0
 }
void I2C_NACK(void)                             //非应答函数
{
    SDAC=1;
    SCL=0;
    delayus(2);
    SDA=1;
    delayus(2);
    SCL=1;
    delayus(5);
    SCL=0;
}

void Delayms(u16 del)
{	u16 i;										//@fSYS=8MH,延遲del*1ms
	for(i=0;i<del;i++) GCC_DELAY(2000);			//Delay 1ms @ 8MHz
}

//时钟频率:8Mhz
//机器周期:2个时钟周期
//指令周期:6个机器周期 = 12个时钟周期

void delay(int count)
{
	int i;
	for(i=1;i<=count;i++)
	;
}
//延时 = (1/8M)*12*50*2(计数)  =  0.000075 s= 75us

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91

SGP30实现

代码部分

#SGP30_SlaveAddress 0xB0
void SGP30_Write_Data(uchar address,uchar dat)//向SGP30的地址address中写入一个字节的数据
{

   I2C_START();

   WriteByte(SGP30_SlaveAddress);

   WriteByte(address);

   WriteByte(dat);

   I2C_STOP();

}

ulong SGP30_Read_Data()//从SGP30的地址address中读取一个字节的数据

{

   ulong dat;
   
   SGP30_IIC_Start();

   WriteByte(SGP30_SlaveAddress + 1);

   dat =ReadByte();               //CO2高位数据

   dat <<= 8;

   dat += ReadByte();              //CO2低位数据

   dat <<= 8;

   dat +=ReadByte();              //TVOC高位数据

   dat <<= 8;

   dat +=ReadByte();              //TVOC低位数据

  I2C_STOP();

   return(dat);

}

void SGP30_Init(void)//SGP30初始化函数

{

   SGP30_Write_Data(0x20,0x03);

}

void SGP30_Get_Co2_Tvoc_Value(uint *co2_value, uint *tvoc_value)//SGP30获取CO2和TVOC值函数

{

   ulong sgp30_value;

   SGP30_Write_Data(0x20,0x08);

   sgp30_value = SGP30_Read_Data();

   *co2_value = (sgp30_value & 0xffff0000) >> 16;

   *tvoc_value = sgp30_value & 0x0000ffff;

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

流程图

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/604056
推荐阅读
相关标签
  

闽ICP备14008679号