今天使用STC32G12K128编程读取SHT40的数据,在调试程序的过程中发现,在每次读取温湿度数据时,一定要按照以下方式处理。
1、发送精度指令
2、延时一段时间(我这里设置为10ms,是高精度设置下的响应时间)
3、读取温湿度数据。
代码的样子是下面这样:
// 发送高精度测量命令
IIC_START();
IIC_SENDBYTE(SHT40_ADDR);
IIC_WAITACK();
// 精度指令
IIC_SENDBYTE(SHT40_CMD_HIGH_PRECISION);
IIC_WAITACK();
IIC_STOP();
delay_ms(200);
IIC_START();
// 读数据指令的第一个字节:地址
IIC_SENDBYTE((u8)(SHT40_ADDR+0x01));
IIC_WAITACK();
// 读取6个字节的数据
for (i=0; i<6; i++) {
dat[i] = IIC_READBYTE();
if (i<5) {
IIC_SENDACK();
}
}
IIC_SENDNACK();
IIC_STOP();即使在周期读取数据时,也必须保持这个顺序,绝对不能将设置精度的处理部分单独提出去执行一次,然后周期执行读处理。这样发的处理,将无法读取到正确的数据。体现为6个字节的数据全部为0xFF.
另外,在SHT40的资料中,它所占用的I2C地址为0x44,但在实际处理中,这个地址是0x88。写的时候,地址是0x88,读的时候,地址是0x89。
我要赚赏金
