SHT30读取温湿度失败

发布时间 2023-06-30 01:18:35作者: Gzz_lin

折腾了一晚上,连续读取六个寄存器,只有第一位数据正确,后面全是0x00,后面看有位老哥说连续读取的时候发送ACK要记得把SDA拉高(在STC的标准IO模式下拉高就是释放IO,其他类型单片机直接释放就好了),拉高后问题变成了后面5个寄存器都是0xFF,得亏在X宝买了个25的逻辑分析仪模块,其实是我拉高的代码没放对位置,应在IIC读数据函数中,拉低SCL时拉高SDA。

其实就是发送ACK时拉低了SDA,导致SHT30无法将SDA拉高。

其他注意事项:

1、SHT30上电最好等待1秒后再读取

2、修改代码重新烧录时记得断电重启一下,不然有可能调试会一直失败,SHT30压根不回消息。

完整的IIC代码如下:

 

 

#include <STC8H.h>
#include <intrins.h>
#include "IIC.h"


void IIC_Delay()
{
unsigned char i, j;

_nop_();
i = 32;
j = 40;
do
{
while (--j);
} while (--i);
}

void IIC_Start()
{
SCL=1;
SDA=1;
IIC_Delay();
SDA=0;
IIC_Delay();
}
void IIC_Write_Byte(char dat)
{
char i;
for(i=0;i<8;i++)
{
SCL=0;
IIC_Delay();
if((dat&0x80)==0x00)
{
SDA=0;

}
else
{
SDA=1;

}
dat<<=1;
IIC_Delay();
SCL=1;
IIC_Delay();

}

}
char IIC_Read_ACK()
{
unsigned int t=50;
SCL=0;
SDA=1;
IIC_Delay();
SCL=1;
IIC_Delay();
while(SDA)
{
--t;
if(t==0)
{
return NAK;
}
}
return ACK;
}
void IIC_Stop()
{
SCL=0;
SDA=0;
IIC_Delay();
SCL=1;
IIC_Delay();
SDA=1;
IIC_Delay();
}

 

 

 


char IIC_Read_Byte()
{
unsigned char dat=0x00,i=0;

for(i=0;i<8;i++)
{
SCL=0;
SDA=1;
IIC_Delay();
SCL=1;
dat<<=1;
if(SDA==1)
{
dat=dat|0x01;
}
IIC_Delay();
}
return dat;
}

 

 

 

 

 

 

 


void IIC_Write_ACK()
{
SCL=0;
IIC_Delay();

SDA=ACK;
IIC_Delay();
SCL=1;
IIC_Delay();

}
void IIC_Write_NAK()
{

SCL=0;
IIC_Delay();
SDA=NAK;
IIC_Delay();
SCL=1;
IIC_Delay();
}