F103调试 SHT30 时,一直收不到应答

2019-07-21 05:08发布

/***********************
while(IIC_Wait_Ack());                                                //****************一直在这等待从机应答,用的是模块调试的,焊接应该不存在问题

****************/
#include "SHT30.h"
#include "sys.h"
#include "led.h"
#include "delay.h"
#include "myiic.h"
u8 BUFt[6]={0};



/*unsigned char crc8(char *buf)
{
unsigned char i,j,crc;

  crc=0;
for(j=1;j<7;j++)
{
        crc=crc^(*buf);
        for(i = 8; i > 0; i--)
        {
            if(crc & 0x80)
            {
             crc = (crc<< 1)^0x31;
            }
    else
            {
             crc = crc<< 1;
    }
        }
    buf++;
}
return crc;
}*/

u8 Get_Crc8(u8 *ptr,u16 len)
{
        u8 crc;
        u8 i;
        crc=0;
        while(len--)
        {
                crc^=*ptr++;
                for(i=0;i<8;i++)
                {
                        if(crc&0x01)crc=(crc>>1)^0x8C;
                        else crc >>= 1;
                }
        }
        return crc;
}
void Cmd_Write_sht30(uint8_t msb,uint8_t lsb)
{
  IIC_Start();                          //起始信号
  IIC_Send_Byte(0x88+0);   //发送设备地址+写信号
       
       
        while(IIC_Wait_Ack());                                                //****************一直在这等待从机应答,用的是模块调试的,焊接应该不存在问题

  IIC_Send_Byte(msb);                                            //发送命令
       
        while(IIC_Wait_Ack());                                 // 0接收应答成功
        IIC_Send_Byte(lsb);                                            //发送命令
        while(IIC_Wait_Ack());
  IIC_Stop();                   //发送停止信号
        delay_ms(5);
}

u8 crc1=0;
u8 crc2=0;
extern float tem ;
extern float hum ;
void Read_sht30(void)
{          
                Cmd_Write_sht30(0x21,0x26); //数据采集频率1 m/s
                //IIC_SCL=1;
                IIC_Start();           //起始信号
    IIC_Send_Byte(0x88+1);         //发送设备地址+读信号
       
                while(IIC_Wait_Ack());
                BUFt[0]=IIC_Read_Byte(1);  //读取温度高八位并且发送一个ack
                BUFt[1]=IIC_Read_Byte(1);  //。。。低八位。。。
          BUFt[2]=IIC_Read_Byte(1);  //校验位发送ACK8wei
    BUFt[3]=IIC_Read_Byte(1);  //湿度发送ACK高把位
          BUFt[4]=IIC_Read_Byte(1);  //湿度第八位
          BUFt[5]=IIC_Read_Byte(0);  //校验位之后发送nack具体见数据手册
    IIC_Stop();                //发送停止信号
    delay_ms(5);
}

//数据转换
void Convert_sht30(void)
{

                tem=175*((BUFt[0]<<8)+BUFt[1])/65535-45;
                hum=100*((BUFt[3]<<8)+BUFt[4])/65535;
       
                BUFt[0]=0;
                BUFt[1]=0;
                BUFt[2]=0;
                BUFt[3]=0;
                BUFt[4]=0;
                BUFt[5]=0;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
peng1554
1楼-- · 2019-07-21 06:21
一位老哥刚分享的,看可以参考不:
http://www.openedv.com/forum.php ... amp;highlight=SHT30
Sanjay
2楼-- · 2019-07-21 08:49
 精彩回答 2  元偷偷看……
swfywl
3楼-- · 2019-07-21 14:36
Sanjay 发表于 2019-2-21 20:18
看你代码应该是模拟I2C的代码。
1、可能是在规定时间内STM32的SDA读到的不是0而是1,那么可能是模拟I2C的 ...

1、是模拟的IIC ,SDA读到的一直为1,
2、时间加大试过了,, 10us ,,
3 带有上拉电阻。 看你的回答很专业,问下你有没有调试过的代码借鉴一下。。
感谢你的耐心回答,谢谢
swfywl
4楼-- · 2019-07-21 15:17
peng1554 发表于 2019-2-21 20:15
一位老哥刚分享的,看可以参考不:
http://www.openedv.com/forum.php?mod=viewthread&tid=288130&highlig ...

感谢,,这个我刚刚看到了
swfywl
5楼-- · 2019-07-21 18:40
Sanjay 发表于 2019-2-21 20:18
看你代码应该是模拟I2C的代码。
1、可能是在规定时间内STM32的SDA读到的不是0而是1,那么可能是模拟I2C的 ...

这是代码
Sanjay
6楼-- · 2019-07-21 19:38
swfywl 发表于 2019-2-21 20:30
1、是模拟的IIC ,SDA读到的一直为1,
2、时间加大试过了,, 10us ,,
3 带有上拉电阻。 看你的回答 ...

我调试过SHT20和AHT10:

1、SHT20基于STM32F103标准库的,标准库我用的是开漏输出。用开漏输出时,SHT20需要外接上拉电阻,如果不外接上拉电阻就要用推挽输出。

2、AHT10是基于STM32L475 HAL库的,HAL里面我用的是推挽输出。用推挽输出时AHT10可外接也可不外接上拉电阻。

然后我看了你的帖子没贴等待应答的代码啊!你贴的是读取数据和crc校验的代码吧!

一周热门 更多>