sht10传感器读不出数据

[复制链接]
1726|6
 楼主| 小董lg121 发表于 2015-1-4 17:32 | 显示全部楼层 |阅读模式
MCU是stm32f103系列的,控制sht10传感器工作,可是读不出数据,我用串口打印了出错信息,每个函数的返回值都不对,说明传感器没有响应,但是我对着数据手册的时序图看了很多遍,都不知道问题出在哪,请教各位大神指点迷津,小女子在此感激不尽!
  1. void        init_sht(void)                    //初始化I2C的引脚
  2. {

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


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

  9.         s_softreset();          //通讯复位

  10. }
  11. char s_softreset(void)
  12. {
  13.   unsigned char error=0;  
  14.   s_connectionreset();              //reset communication
  15.   error+=s_write_byte(RESET);       //send RESET-command to sensor
  16.   printf("softreset is ready.\r\n");
  17.   printf("%d\n",error);
  18.   return error;                     //error=1 in case of no response from the sensor
  19. }
  20. void s_transstart(void)
  21. {
  22.    _nop_();
  23.    GPIO_SetBits(DATA_WR);
  24.    _nop_();
  25.    GPIO_ResetBits(SCK); //SCK=0;                   //Initial state
  26.    _nop_();
  27.    GPIO_SetBits(SCK); //SCK=1;
  28.    _nop_();
  29.    GPIO_ResetBits(DATA_WR); //DATA_TRIS=0;   // DATA_WR=0; DATA_TRIS=0;
  30.    _nop_();
  31.    GPIO_ResetBits(SCK);//SCK=0;  
  32.    _nop_();_nop_();_nop_();
  33.    GPIO_SetBits(SCK);//SCK=1;
  34.    _nop_();
  35.    GPIO_SetBits(DATA_WR);
  36.    _nop_();
  37.    GPIO_ResetBits(SCK);//SCK=0;       
  38.    _nop_();
  39.    printf("start is ready.\r\n");
  40. }
  41. void s_connectionreset(void)
  42. {  
  43.   unsigned char i;
  44.         _nop_();
  45.         GPIO_SetBits(DATA_WR); //DATA_WR     = 1;                        //set data pin high
  46.         _nop_(); //SCK_TRIS        = 0;                        //set CLK pin an output low
  47.         GPIO_ResetBits(SCK);// SCK                        = 0;
  48.        
  49.   for(i=0;i<9;i++)                     //9 SCK cycles for connection reset sequence
  50.   { GPIO_SetBits(SCK);//SCK=1;
  51.         _nop_();
  52.     GPIO_ResetBits(SCK);//SCK=0;
  53.         _nop_();
  54.   }
  55.   _nop_();
  56.   s_transstart();                    //transmission start
  57.   printf("reset is ready.\r\n");
  58. }
  59. char s_read_byte(unsigned char ack)
  60. {
  61.   unsigned char i,val=0;
  62.   _nop_();
  63.   GPIO_SetBits(DATA_WR);
  64.   _nop_();
  65.   for (i=0x80;i>0;i/=2)             //shift bit for masking
  66.   { GPIO_SetBits(SCK);//SCK=1;                          //clk for SENSI-BUS
  67.     _nop_();
  68.         if (DATA_RD) val=(val | i);        //read bit  
  69.     _nop_();
  70.         GPIO_ResetBits(SCK);//SCK=0;                                           
  71.   _nop_();
  72.   }
  73.         if(ack==ACK)
  74.             GPIO_ResetBits(DATA_WR);//DATA_WR = 0;
  75.         else
  76.         GPIO_SetBits(DATA_WR);
  77.         _nop_();
  78.           GPIO_SetBits(SCK);//SCK=1;                          //clk #9 for ack
  79.         _nop_();_nop_();_nop_();                                                //pulse-width approx. 5 us                
  80.           GPIO_ResetBits(SCK);//SCK=0;
  81.     _nop_();
  82.         GPIO_SetBits(DATA_WR);
  83.     _nop_();   
  84.         printf("read is ready.\r\n");
  85.         printf("%d\n",val);
  86.   return val;
  87. }
  88. char s_write_byte(unsigned char value)
  89. {
  90.   unsigned char i,error=0;  
  91.   _nop_();
  92.   for (i=0x80;i>0;i/=2)                                     //shift bit for masking
  93.   { if (i & value) GPIO_SetBits(DATA_WR);// DATA_WR=1;                                  //masking value with i , write to SENSI-BUS
  94.     else GPIO_ResetBits(DATA_WR); //DATA_WR=0;                        
  95.     _nop_();
  96.         GPIO_SetBits(SCK);//SCK=1;                                                  //clk for SENSI-BUS
  97.         _nop_();_nop_();_nop_();                                                                           //pulse-width approx. 5 us
  98.     GPIO_ResetBits(SCK);//SCK=0;
  99.        
  100.   }
  101.   GPIO_SetBits(DATA_WR);
  102.   _nop_();
  103.   GPIO_SetBits(SCK);//SCK=1;                                                    //clk #9 for ack
  104.   _nop_();
  105.   error=DATA_RD;                                               //check ack (DATA will be pulled down by SHT11)
  106.   _nop_();
  107.   GPIO_ResetBits(SCK);//SCK=0;  
  108.   _nop_();
  109.   printf("write is ready.\r\n");
  110.   printf("%d\n",error);
  111.   return error;                                             //error=1 in case of no acknowledge
  112. }
  113. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
  114. {
  115.   unsigned error=0;
  116.   unsigned int i;

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

  128.   *(p_value+1)  = s_read_byte(ACK);                    //read the first byte (MSB)
  129.   *(p_value)        = s_read_byte(ACK);                     //read the second byte (LSB)
  130.   *p_checksum         = s_read_byte(noACK);                  //read checksum
  131.   printf("measure is ready.\r\n");
  132.   printf("%d\n",error);
  133.   return error;
  134. }
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程序,参考别人的程序查找问题。
 楼主| 小董lg121 发表于 2015-1-5 17:13 | 显示全部楼层
airwill 发表于 2015-1-5 08:05
如果是传感器没有响应, 那应该先检查连线, 电源, 还有包括振荡器和复位信号, 焊接等最基本的硬件问题. 确认 ...

确实是连线错了。。。囧。。。不过,谢谢大神啦!
 楼主| 小董lg121 发表于 2015-1-5 17:16 | 显示全部楼层
ningling_21 发表于 2015-1-4 18:40
用示波器看看I2C的波形,可能就知道原因。。。

问题已解决,谢谢大神抽时间答疑解难!!!
 楼主| 小董lg121 发表于 2015-1-5 17:17 | 显示全部楼层
icekoor 发表于 2015-1-5 09:12
可以用示波器监测STM32输出信号的协议是否正确;
查找网上sht10传感器的应用代码,不一样是STM32程序,参考 ...

连线出错了,糗大了。。。还是谢谢你的不吝赐教!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部