折腾了一晚上,连续读取六个寄存器,只有第一位数据正确,后面全是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();
}