本帖最后由 DebugLab 于 2024-8-19 00:21 编辑
AHT25 温湿度传感器 采用I2C通信
时序如下图所示:
如何使用IO模拟I2C
关键是起始,停止和应答
代码如下:
复制代码 然后直接读数据,看数据手册写
- void AHT10_Read(unsigned int t,unsigned int h)
- {
- char timeout = 0;
- unsigned char buff[7] = {0};
- volatile unsigned long int dat = 0;
-
- unsigned char cmd[2];
- cmd[0] = 0x33;
- cmd[1] = 0x00;
-
- i2c_mem_write(ATH20_SLAVE_ADDRESS,AHT20_TrigMeasure_REG,cmd,2);
- i2c_mem_read(ATH20_SLAVE_ADDRESS,AHT20_STATUS_REG,buff,7);
-
- //高位在前
- dat = buff[1];dat = dat<<8;dat+=buff[2];dat=dat<<8;dat+=buff[3];dat=dat>>4;
- hum = dat * 100 / rate;
-
- dat = buff[3]&0x0F;dat = dat<<8;dat+=buff[4];dat=dat<<8;dat+=buff[5];
- tem = dat * 200 / rate - 50;
- }
复制代码
坑
正常写数据处理这样写
- //高位在前
- dat = (((buff[1]<<12) | (buff[2]<<4)) | (buff[3]>>4));
- Humidity = dat / 1048576.0 * 100.0;
-
- dat = 0;
- dat = ((buff[3] &0x0F) << 16 ) | ( buff[4] << 8) | buff[5];
- Temperature = (dat/1048576.0) * 200 - 50;
复制代码
感觉没错,就是结果不对
立马想到 是不是位移超出范围了
改成如下代码
- dat = ((unsigned long int)buff[1] << 8) | ((unsigned long int)buff[2]) | ((unsigned long int)(buff[3] >> 4));
复制代码
不行,没变化
这都不能转换?
我直接打开AHT25的官网,下载官网的例子
官网这样写:
- dat = buff[1];dat = dat<<8;dat+=buff[2];dat=dat<<8;dat+=buff[3];dat=dat>>4;
复制代码
我修改代码,试了一下,温度湿度立马正确了
但是,我再32里直接用位移可以使用,为啥这里不行了?
|