久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3257|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

SHT20驅(qū)動(dòng)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:235066 發(fā)表于 2017-11-19 11:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#define _C_SHT20Drv
#include "stm32l4xx_hal.h"
#include "SHT20Drv.h"
void IIC_Dealy_ms(int32_t nms);
#define DelayMicroSeconds(X) IIC_Dealy_ms(X)

u16 POLYNOMIAL = 0x131;
u8 SHT20Regiter;
u16 test;
u16 CNT_10ms_SHT20;
u16 Fg_Item_SHT20;
u16 Fg_SHT20Reset;
SHT20MeasureDef SHT20Measure;
void IIC_Dealy_ms(int32_t nms)  
{  
int32_t temp;  
SysTick->LOAD = 8000*nms;  
SysTick->VAL=0X00;
SysTick->CTRL=0X01;
do  
{  
  temp=SysTick->CTRL;
}while((temp&0x01)&&(!(temp&(1<<16))));
    SysTick->CTRL=0x00;  
    SysTick->VAL =0X00;   
}  

//==============================================================================
void I2c_StartCondition ()
//==============================================================================
{
  /*
  SDA=HIGH;
  SCL=HIGH;
  SDA=LOW;
  DelayMicroSeconds(10);  // hold time start condition (t_HD;STA)
  SCL=LOW;
  DelayMicroSeconds(10);
  */
  SHT20_SDA(1);
  SHT20_SCL(1);
  SHT20_SDA(0);
  DelayMicroSeconds(10);
  SHT20_SCL(0);
  DelayMicroSeconds(10);
}
//==============================================================================
void I2c_StopCondition ()
//==============================================================================
{
  /*
  SDA=LOW;
  SCL=LOW;
  SCL=HIGH;
  DelayMicroSeconds(10);  // set-up time stop condition (t_SU;STO)
  SDA=HIGH;
  DelayMicroSeconds(10);
  */
  SHT20_SDA(0);
  SHT20_SCL(0);
  SHT20_SCL(1);
  DelayMicroSeconds(10);
  SHT20_SDA(1);
  DelayMicroSeconds(10);
  
}
//==============================================================================
u8 I2c_WriteByte (u8 txByte)
//==============================================================================
{
  u8 mask,error=0;
  for (mask=0x80; mask>0; mask>>=1)   //shift bit for masking (8 times)
  { if ((mask & txByte) == 0) SHT20_SDA(0);//SDA=LOW;//masking txByte, write bit to SDA-Line
    else SHT20_SDA(1);//SDA=HIGH;
    DelayMicroSeconds(1);             //data set-up time (t_SU;DAT)
    SHT20_SCL(1);//SCL=HIGH;                         //generate clock pulse on SCL
    DelayMicroSeconds(5);             //SCL high time (t_HIGH)
    SHT20_SCL(0);//SCL=LOW;
    DelayMicroSeconds(1);             //data hold time(t_HD;DAT)
  }
  SHT20_SDA(1);//SDA=HIGH;                           //release SDA-line
  SHT20_SCL(1);//SCL=HIGH;                           //clk #9 for ack
  DelayMicroSeconds(1);               //data set-up time (t_SU;DAT)
  //if(SDA_CONF==HIGH) error=ACK_ERROR; //check ack from i2c slave
  if(SHT20_SDA_Read) error= ACK_ERROR;
  SHT20_SCL(0);//SCL=LOW;
  DelayMicroSeconds(20);              //wait time to see byte package on scope
  return error;                       //return error code
}
//==============================================================================
u8 I2c_ReadByte (etI2cAck ack)
//==============================================================================
{
  u8 mask,rxByte=0;
  SHT20_SDA(1);//SDA=HIGH;                           //release SDA-line
  for (mask=0x80; mask>0; mask>>=1)   //shift bit for masking (8 times)
  { SHT20_SCL(1);//SCL=HIGH;                         //start clock on SCL-line
    DelayMicroSeconds(1);             //data set-up time (t_SU;DAT)
    DelayMicroSeconds(3);             //SCL high time (t_HIGH)
    //if (SDA_CONF==1) rxByte=(rxByte | mask); //read bit
    if (SHT20_SDA_Read) rxByte=(rxByte | mask);
    SHT20_SCL(0);//SCL=LOW;
    DelayMicroSeconds(1);             //data hold time(t_HD;DAT)
  }
  SHT20_SDA(0);//SDA=ack;                            //send acknowledge if necessary
  DelayMicroSeconds(1);               //data set-up time (t_SU;DAT)
  SHT20_SCL(1);//SCL=HIGH;                           //clk #9 for ack
  DelayMicroSeconds(5);               //SCL high time (t_HIGH)
  SHT20_SCL(0);//SCL=LOW;
  SHT20_SDA(1);//SDA=HIGH;                           //release SDA-line
  DelayMicroSeconds(20);              //wait time to see byte package on scope
  return rxByte;                      //return error code
}

//==============================================================================
u8 SHT2x_CheckCrc(u8 data[], u8 nbrOfBytes, u8 checksum)
//==============================================================================
{
  u8 crc = 0;
  u8 byteCtr;
  //calculates 8-Bit checksum with given polynomial
  for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
  { crc ^= (data[byteCtr]);
    for (u8 bit = 8; bit > 0; --bit)
    { if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;
      else crc = (crc << 1);
    }
  }
  if (crc != checksum) return CHECKSUM_ERROR;
  else return 0;
}

//===========================================================================
u8 SHT2x_ReadUserRegister(u8 *pRegisterValue)
//===========================================================================
{
  u8 checksum;   //variable for checksum byte
  u8 error=0;    //variable for error code
  I2c_StartCondition();
  error |= I2c_WriteByte (I2C_ADR_W);
  error |= I2c_WriteByte (USER_REG_R);
  I2c_StartCondition();
  error |= I2c_WriteByte (I2C_ADR_R);
  *pRegisterValue = I2c_ReadByte(ACK);
  checksum=I2c_ReadByte(NO_ACK);
  error |= SHT2x_CheckCrc (pRegisterValue,1,checksum);
  I2c_StopCondition();
  return error;
}
//===========================================================================
u8 SHT2x_WriteUserRegister(u8 *pRegisterValue)
//===========================================================================
{
  u8 error=0;   //variable for error code
  I2c_StartCondition();
  error |= I2c_WriteByte (I2C_ADR_W);
  error |= I2c_WriteByte (USER_REG_W);
  error |= I2c_WriteByte (*pRegisterValue);
  I2c_StopCondition();
  return error;
}
//===========================================================================
u8 SHT2x_SoftReset()
//===========================================================================
{
  u8  error=0;           //error variable
  I2c_StartCondition();
  error |= I2c_WriteByte (I2C_ADR_W); // I2C Adr
  error |= I2c_WriteByte (SOFT_RESET);                            // Command
  I2c_StopCondition();
  DelayMicroSeconds(15000); // wait till sensor has restarted
  return error;
}
//==============================================================================
float SHT2x_CalcRH(u16 u16sRH)
//==============================================================================
{
  float humidityRH;              // variable for result
  u16sRH &= ~0x0003;          // clear bits [1..0] (status bits)
  //-- calculate relative humidity [%RH] --
  humidityRH = -6.0 + 125.0/65536 * (float)u16sRH; // RH= -6 + 125 * SRH/2^16
  return humidityRH;
}

//==============================================================================
float SHT2x_CalcTemperatureC(u16 u16sT)
//==============================================================================
{
  float temperatureC;            // variable for result
  u16sT &= ~0x0003;           // clear bits [1..0] (status bits)
  //-- calculate temperature  --
  temperatureC= -46.85 + 175.72/65536 *(float)u16sT; //T= -46.85 + 175.72 * ST/2^16
  return temperatureC;
}
//==============================================================================
u8 SHT2x_GetSerialNumber(u8 u8SerialNumber[])
//==============================================================================
{
  u8  error=0;                          //error variable
  //Read from memory location 1
  I2c_StartCondition();
  error |= I2c_WriteByte (I2C_ADR_W);    //I2C address
  error |= I2c_WriteByte (0xFA);         //Command for readout on-chip memory
  error |= I2c_WriteByte (0x0F);         //on-chip memory address
  I2c_StartCondition();
  error |= I2c_WriteByte (I2C_ADR_R);    //I2C address
  u8SerialNumber[5] = I2c_ReadByte(ACK); //Read SNB_3
  I2c_ReadByte(ACK);                     //Read CRC SNB_3 (CRC is not analyzed)
  u8SerialNumber[4] = I2c_ReadByte(ACK); //Read SNB_2
  I2c_ReadByte(ACK);                     //Read CRC SNB_2 (CRC is not analyzed)
  u8SerialNumber[3] = I2c_ReadByte(ACK); //Read SNB_1
  I2c_ReadByte(ACK);                     //Read CRC SNB_1 (CRC is not analyzed)
  u8SerialNumber[2] = I2c_ReadByte(ACK); //Read SNB_0
  I2c_ReadByte(NO_ACK);                  //Read CRC SNB_0 (CRC is not analyzed)
  I2c_StopCondition();
  //Read from memory location 2
  I2c_StartCondition();
  error |= I2c_WriteByte (I2C_ADR_W);    //I2C address
  error |= I2c_WriteByte (0xFC);         //Command for readout on-chip memory
  error |= I2c_WriteByte (0xC9);         //on-chip memory address
  I2c_StartCondition();
  error |= I2c_WriteByte (I2C_ADR_R);    //I2C address
  u8SerialNumber[1] = I2c_ReadByte(ACK); //Read SNC_1
  u8SerialNumber[0] = I2c_ReadByte(ACK); //Read SNC_0
  I2c_ReadByte(ACK);                     //Read CRC SNC0/1 (CRC is not analyzed)
  u8SerialNumber[7] = I2c_ReadByte(ACK); //Read SNA_1
  u8SerialNumber[6] = I2c_ReadByte(ACK); //Read SNA_0
  I2c_ReadByte(NO_ACK);                  //Read CRC SNA0/1 (CRC is not analyzed)
  I2c_StopCondition();
  return error;
}

u8 SetSHT20Itme(etSHT2xMeasureType eSHT2xMeasureType)
{
  u8 error=0;
  I2c_StartCondition();
  error |= I2c_WriteByte (I2C_ADR_W); // I2C Adr
  switch(eSHT2xMeasureType)
  {
    case HUMIDITY: error |= I2c_WriteByte (TRIG_RH_MEASUREMENT_POLL); break;
    case TEMP    : error |= I2c_WriteByte (TRIG_T_MEASUREMENT_POLL);  break;   
  }
  return error;
}

void SHT20Init(void)
{
  //SHT2x_ReadUserRegister(&SHT20Regiter);  
  SetSHT20Itme(HUMIDITY);
  CNT_10ms_SHT20 = 0;
  Fg_Item_SHT20 = 0;
  Fg_SHT20Reset = 0;
}
void SHT20Process(void)
{
  u8 data[2],checksum;
  u16 Measure;
  
  if(CNT_10ms_SHT20 >= SHT20ReadDelay_10ms || 1)
  {
    CNT_10ms_SHT20 = 0;
    if(Fg_SHT20Reset == 1)
    {
      SHT20Init();
    }
    else
    {
      I2c_StartCondition();
      if(I2c_WriteByte (I2C_ADR_R) == ACK_ERROR)
      {
        SHT2x_SoftReset();
        Fg_SHT20Reset = 1;
      }
      else
      {
        data[0] = I2c_ReadByte(ACK);
        data[1] = I2c_ReadByte(ACK);
        Measure = data[0];
        Measure<<=8;
        Measure+=data[1];
        
        checksum=I2c_ReadByte(NO_ACK);
        I2c_StopCondition();
        if(SHT2x_CheckCrc (data,2,checksum)==0)
        {
          if(Measure&0x0002)
          {//濕度
            SHT20Measure.HUMI = SHT2x_CalcRH(Measure);
          }
          else
          {//溫度
            SHT20Measure.TEMP = SHT2x_CalcTemperatureC(Measure);
          }
        }        
        Fg_Item_SHT20++;
        if(Fg_Item_SHT20 ==1 )
        {
          SetSHT20Itme(TEMP);
        }
        else
        {
          Fg_Item_SHT20 = 0;
          SetSHT20Itme(HUMIDITY);
        }
        
      }      
    }
  }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:267330 發(fā)表于 2017-12-27 09:00 | 只看該作者
請(qǐng)問(wèn)程序可以用不?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级全黄 | 久久精品久久久 | 精品国产一区二区在线 | 亚洲人人 | 日韩中文字幕久久 | 国产精品精品视频一区二区三区 | 夜夜爽99久久国产综合精品女不卡 | 亚洲国产精品久久久 | 国产一区三区在线 | 亚洲国产精品网站 | 久久久91精品国产一区二区三区 | 美国av毛片 | 国产精品一区二区三区久久久 | 网色| a级免费黄色片 | 精品国产乱码久久久久久图片 | 日韩av手机在线观看 | 欧美 日韩 国产 一区 | 日本高清不卡视频 | 国产一区二区三区高清 | 男人天堂手机在线视频 | 欧美一区二区在线观看 | 中国xxxx性xxxx产国 | 国产视频一视频二 | 国产福利小视频 | 涩涩片影院 | 欧美区在线观看 | 中文字幕第一页在线 | 免费一二区 | 午夜寂寞福利视频 | 51ⅴ精品国产91久久久久久 | 中文天堂在线观看 | 成av人电影在线 | 2018国产大陆天天弄 | 成人超碰 | 精彩视频一区二区三区 | 国产精品日日做人人爱 | 成人在线不卡 | 中文字幕一级毛片视频 | 精品久久成人 | 亚洲狠狠 |