SGP30 深绿sensirion传感器,检测CO2,TVOC,输出值一直是0xFFFFFFFF(65535),解决办法

初学STM32,恰好想测量一下卧室的CO2浓度,就在淘宝上买了一块SGP30 传感器检测室内二氧化碳浓度,手头用的野火stm32f407板子。

 

把淘宝卖家的示例程序修改后移植发现返回的值一直是0xFFFFFFF(65535   65535)

 SGP30 传感器使用I2c传输,

网上查了一下,0xFFFF应该是没有传输数据,GPIO一直读到高电平。

测试了一下淘宝的代码,主设备发出写的地址后,从设备没有返回ack,由于程序没有检查ack并终止,而是继续走下去,所以会呈现0xFFFF的读数。

 

解决方法:

最后放弃使用模拟I2C,转而使用硬件I2C以及标准库函数。

 

中途也出现了一些意外,直接使用I2C_ReceiveData()函数读取SGP30的回复,但读到的测量数据有重复的。

应该是SGP30回复太慢,导致主设备用I2C_ReceiveData()读到的还是DR寄存器中的上一个数据。DR并不会因为被读了而改变存储的数值。

解决办法:读取之前加一句

while(!I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE));

如果没有新数据传来,而之前的数据在已经读DR后会把RXNE置0,循环等待,直到新数据传来把RXNE置1

SGP30的数据手册说,一开始测量的时候,CO2是默认的400,TVOC是默认的0,要过一段时间才能测出真实值。传输使用CRC8校验码,每传2字节,发送一个1字节的校验码。

所以一开始,传输的数据一直是CO2  0x1 90 4C(校验码),TVOC 0x 0 0 81(校验码)。大概要15s以后才有真正的数据出来。

之后会上传我测试用的代码。

 一段时间后就正常了,可以去网上测验一下,crc是否正确。可以看到 0x 01 97 的校验码确实是 0x db,0x 00 05 的校验码确实是 0x 74。

 

 

 

posted @ 2024-02-04 23:34  Tyson~Xiao  阅读(1410)  评论(1)    收藏  举报