/targets/STM32L431VCT6_Bossay/Hardware/IoTBox/SHT30.c

https://github.com/LiteOS/LiteOS_Lab · C · 163 lines · 77 code · 31 blank · 55 comment · 8 complexity · 19b041de68b43e30d1177c880580b78b MD5 · raw file

  1. /********************************************************************************
  2. * 文件名称 :SHT30.c
  3. * 作 者:Bossay IoT 开发组
  4. * 版 本:V1.0
  5. * 编写日期 :2019-11-01
  6. * 功 能:IoTBox 温湿度传感器驱动
  7. *********************************************************************************
  8. * 说 明 :本案例配套Bossay IoT Box开发板使用
  9. * 网 站 :edu.ibossay.com
  10. * 电 话 :4006916913
  11. *********************************************************************************/
  12. #include "SHT30.h"
  13. #include "stm32l4xx.h"
  14. #include "i2c.h"
  15. #include "gpio.h"
  16. const int16_t POLYNOMIAL = 0x131;
  17. /***************************************************************
  18. * 函数名称: SHT30_reset
  19. * 说 明: SHT30复位
  20. * 参 数: 无
  21. * 返 回 值: 无
  22. ***************************************************************/
  23. void SHT30_reset(void)
  24. {
  25. uint8_t SHT3X_Resetcommand_Buffer[2]={0x30,0xA2}; //soft reset
  26. HAL_I2C_Master_Transmit(&hi2c2,SHT30_Addr<<1,SHT3X_Resetcommand_Buffer,2,0x10);
  27. HAL_Delay(15);
  28. }
  29. /***************************************************************
  30. * 函数名称: Init_SHT30
  31. * 说 明: 初始化SHT30,设置测量周期
  32. * 参 数: 无
  33. * 返 回 值: 无
  34. ***************************************************************/
  35. void Init_SHT30(void)
  36. {
  37. uint8_t SHT3X_Modecommand_Buffer[2]={0x22,0x36}; //periodic mode commands
  38. HAL_I2C_Master_Transmit(&hi2c2,SHT30_Addr<<1,SHT3X_Modecommand_Buffer,2,0x10); //send periodic mode commands
  39. }
  40. /***************************************************************
  41. * 函数名称: SHT3x_CheckCrc
  42. * 说 明: 检查数据正确性
  43. * 参 数: data:读取到的数据
  44. nbrOfBytes:需要校验的数量
  45. checksum:读取到的校对比验值
  46. * 返 回 值: 校验结果,0-成功 1-失败
  47. ***************************************************************/
  48. uint8_t SHT3x_CheckCrc(char data[], char nbrOfBytes, char checksum)
  49. {
  50. char crc = 0xFF;
  51. char bit = 0;
  52. int byteCtr ;
  53. //calculates 8-Bit checksum with given polynomial
  54. for(byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
  55. {
  56. crc ^= (data[byteCtr]);
  57. for ( bit = 8; bit > 0; --bit)
  58. {
  59. if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;
  60. else crc = (crc << 1);
  61. }
  62. }
  63. if(crc != checksum)
  64. return 1;
  65. else
  66. return 0;
  67. }
  68. /***************************************************************
  69. * 函数名称: SHT3x_CalcTemperatureC
  70. * 说 明: 温度计算
  71. * 参 数: u16sT:读取到的温度原始数据
  72. * 返 回 值: 计算后的温度数据
  73. ***************************************************************/
  74. float SHT3x_CalcTemperatureC(unsigned short u16sT)
  75. {
  76. float temperatureC = 0; // variable for result
  77. u16sT &= ~0x0003; // clear bits [1..0] (status bits)
  78. //-- calculate temperature [℃] --
  79. temperatureC = (175 * (float)u16sT / 65535 - 45); //T = -45 + 175 * rawValue / (2^16-1)
  80. return temperatureC;
  81. }
  82. /***************************************************************
  83. * 函数名称: SHT3x_CalcRH
  84. * 说 明: 湿度计算
  85. * 参 数: u16sRH:读取到的湿度原始数据
  86. * 返 回 值: 计算后的湿度数据
  87. ***************************************************************/
  88. float SHT3x_CalcRH(unsigned short u16sRH)
  89. {
  90. float humidityRH = 0; // variable for result
  91. u16sRH &= ~0x0003; // clear bits [1..0] (status bits)
  92. //-- calculate relative humidity [%RH] --
  93. humidityRH = (100 * (float)u16sRH / 65535); // RH = rawValue / (2^16-1) * 10
  94. return humidityRH;
  95. }
  96. /***************************************************************
  97. * 函数名称: IoTBox_Hum_Temp_Read_Data
  98. * 说 明: 测量温度、湿度
  99. * 参 数: 无
  100. * 返 回 值: 无
  101. ***************************************************************/
  102. void IoTBox_Hum_Temp_Read_Data(void)
  103. {
  104. char data[3]; //data array for checksum verification
  105. //unsigned char addr = 0;
  106. unsigned short tmp = 0;
  107. uint16_t dat;
  108. uint8_t SHT3X_Fetchcommand_Bbuffer[2]={0xE0,0x00}; //read the measurement results
  109. uint8_t SHT3X_Data_Buffer[6]; //byte 0,1 is temperature byte 4,5 is humidity
  110. HAL_I2C_Master_Transmit(&hi2c2,SHT30_Addr<<1,SHT3X_Fetchcommand_Bbuffer,2,0x10); //Read sht30 sensor data
  111. HAL_I2C_Master_Receive(&hi2c2,(SHT30_Addr<<1)+1,SHT3X_Data_Buffer,6,0x10);
  112. // /* check tem */
  113. data[0] = SHT3X_Data_Buffer[0];
  114. data[1] = SHT3X_Data_Buffer[1];
  115. data[2] = SHT3X_Data_Buffer[2];
  116. tmp=SHT3x_CheckCrc(data, 2, data[2]);
  117. if( !tmp ) /* value is ture */
  118. {
  119. dat = ((uint16_t)data[0] << 8) | data[1];
  120. IoTBox_HT_Data.Temperature = SHT3x_CalcTemperatureC( dat );
  121. }
  122. // /* check humidity */
  123. data[0] = SHT3X_Data_Buffer[3];
  124. data[1] = SHT3X_Data_Buffer[4];
  125. data[2] = SHT3X_Data_Buffer[5];
  126. tmp=SHT3x_CheckCrc(data, 2, data[2]);
  127. if( !tmp ) /* value is ture */
  128. {
  129. dat = ((uint16_t)data[0] << 8) | data[1];
  130. IoTBox_HT_Data.Humidity = SHT3x_CalcRH( dat );
  131. }
  132. }