打印

sht10传感器读不出数据

[复制链接]
1356|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小董lg121|  楼主 | 2015-1-4 17:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MCU是stm32f103系列的,控制sht10传感器工作,可是读不出数据,我用串口打印了出错信息,每个函数的返回值都不对,说明传感器没有响应,但是我对着数据手册的时序图看了很多遍,都不知道问题出在哪,请教各位大神指点迷津,小女子在此感激不尽!
void        init_sht(void)                    //初始化I2C的引脚
{

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin   = (GPIO_Pin_12 | GPIO_Pin_10);
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_OD;          //开漏输出
    GPIO_Init(GPIOC, &GPIO_InitStructure);


        GPIO_PinLockConfig(GPIOC, GPIO_Pin_12 | GPIO_Pin_10);          //锁定时钟输出的属性

        s_softreset();          //通讯复位

}
char s_softreset(void)
{
  unsigned char error=0;  
  s_connectionreset();              //reset communication
  error+=s_write_byte(RESET);       //send RESET-command to sensor
  printf("softreset is ready.\r\n");
  printf("%d\n",error);
  return error;                     //error=1 in case of no response from the sensor
}
void s_transstart(void)
{
   _nop_();
   GPIO_SetBits(DATA_WR);
   _nop_();
   GPIO_ResetBits(SCK); //SCK=0;                   //Initial state
   _nop_();
   GPIO_SetBits(SCK); //SCK=1;
   _nop_();
   GPIO_ResetBits(DATA_WR); //DATA_TRIS=0;   // DATA_WR=0; DATA_TRIS=0;
   _nop_();
   GPIO_ResetBits(SCK);//SCK=0;  
   _nop_();_nop_();_nop_();
   GPIO_SetBits(SCK);//SCK=1;
   _nop_();
   GPIO_SetBits(DATA_WR);
   _nop_();
   GPIO_ResetBits(SCK);//SCK=0;       
   _nop_();
   printf("start is ready.\r\n");
}
void s_connectionreset(void)
{  
  unsigned char i;
        _nop_();
        GPIO_SetBits(DATA_WR); //DATA_WR     = 1;                        //set data pin high
        _nop_(); //SCK_TRIS        = 0;                        //set CLK pin an output low
        GPIO_ResetBits(SCK);// SCK                        = 0;
       
  for(i=0;i<9;i++)                     //9 SCK cycles for connection reset sequence
  { GPIO_SetBits(SCK);//SCK=1;
        _nop_();
    GPIO_ResetBits(SCK);//SCK=0;
        _nop_();
  }
  _nop_();
  s_transstart();                    //transmission start
  printf("reset is ready.\r\n");
}
char s_read_byte(unsigned char ack)
{
  unsigned char i,val=0;
  _nop_();
  GPIO_SetBits(DATA_WR);
  _nop_();
  for (i=0x80;i>0;i/=2)             //shift bit for masking
  { GPIO_SetBits(SCK);//SCK=1;                          //clk for SENSI-BUS
    _nop_();
        if (DATA_RD) val=(val | i);        //read bit  
    _nop_();
        GPIO_ResetBits(SCK);//SCK=0;                                           
  _nop_();
  }
        if(ack==ACK)
            GPIO_ResetBits(DATA_WR);//DATA_WR = 0;
        else
        GPIO_SetBits(DATA_WR);
        _nop_();
          GPIO_SetBits(SCK);//SCK=1;                          //clk #9 for ack
        _nop_();_nop_();_nop_();                                                //pulse-width approx. 5 us                
          GPIO_ResetBits(SCK);//SCK=0;
    _nop_();
        GPIO_SetBits(DATA_WR);
    _nop_();   
        printf("read is ready.\r\n");
        printf("%d\n",val);
  return val;
}
char s_write_byte(unsigned char value)
{
  unsigned char i,error=0;  
  _nop_();
  for (i=0x80;i>0;i/=2)                                     //shift bit for masking
  { if (i & value) GPIO_SetBits(DATA_WR);// DATA_WR=1;                                  //masking value with i , write to SENSI-BUS
    else GPIO_ResetBits(DATA_WR); //DATA_WR=0;                        
    _nop_();
        GPIO_SetBits(SCK);//SCK=1;                                                  //clk for SENSI-BUS
        _nop_();_nop_();_nop_();                                                                           //pulse-width approx. 5 us
    GPIO_ResetBits(SCK);//SCK=0;
       
  }
  GPIO_SetBits(DATA_WR);
  _nop_();
  GPIO_SetBits(SCK);//SCK=1;                                                    //clk #9 for ack
  _nop_();
  error=DATA_RD;                                               //check ack (DATA will be pulled down by SHT11)
  _nop_();
  GPIO_ResetBits(SCK);//SCK=0;  
  _nop_();
  printf("write is ready.\r\n");
  printf("%d\n",error);
  return error;                                             //error=1 in case of no acknowledge
}
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
{
  unsigned error=0;
  unsigned int i;

  s_transstart();                   //transmission start
  switch(mode){                     //send command to sensor
    case TEMP        : error+=s_write_byte(MEASURE_TEMP); break;
    case HUMI        : error+=s_write_byte(MEASURE_HUMI); break;
    default     : break;         
  }
  GPIO_SetBits(DATA_WR);
  _nop_();
  for (i=0;i<65535;i++) if(DATA_RD==0) break;        //wait until sensor has finished the measurement
  _nop_();
  if(DATA_RD) error+=1;                                                 //or timeout (~2 sec.) is reached

  *(p_value+1)  = s_read_byte(ACK);                    //read the first byte (MSB)
  *(p_value)        = s_read_byte(ACK);                     //read the second byte (LSB)
  *p_checksum         = s_read_byte(noACK);                  //read checksum
  printf("measure is ready.\r\n");
  printf("%d\n",error);
  return error;
}

相关帖子

沙发
ningling_21| | 2015-1-4 18:40 | 只看该作者
用示波器看看I2C的波形,可能就知道原因。。。

使用特权

评论回复
板凳
airwill| | 2015-1-5 08:05 | 只看该作者
如果是传感器没有响应, 那应该先检查连线, 电源, 还有包括振荡器和复位信号, 焊接等最基本的硬件问题. 确认后再检查验证时序

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
小董lg121 + 1 很给力!
地板
icekoor| | 2015-1-5 09:12 | 只看该作者
可以用示波器监测STM32输出信号的协议是否正确;
查找网上sht10传感器的应用代码,不一样是STM32程序,参考别人的程序查找问题。

使用特权

评论回复
5
小董lg121|  楼主 | 2015-1-5 17:13 | 只看该作者
airwill 发表于 2015-1-5 08:05
如果是传感器没有响应, 那应该先检查连线, 电源, 还有包括振荡器和复位信号, 焊接等最基本的硬件问题. 确认 ...

确实是连线错了。。。囧。。。不过,谢谢大神啦!

使用特权

评论回复
6
小董lg121|  楼主 | 2015-1-5 17:16 | 只看该作者
ningling_21 发表于 2015-1-4 18:40
用示波器看看I2C的波形,可能就知道原因。。。

问题已解决,谢谢大神抽时间答疑解难!!!

使用特权

评论回复
7
小董lg121|  楼主 | 2015-1-5 17:17 | 只看该作者
icekoor 发表于 2015-1-5 09:12
可以用示波器监测STM32输出信号的协议是否正确;
查找网上sht10传感器的应用代码,不一样是STM32程序,参考 ...

连线出错了,糗大了。。。还是谢谢你的不吝赐教!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

2

粉丝