test_sht30.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. * Copyright (c) 2022 OpenLuat & AirM2M
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy of
  5. * this software and associated documentation files (the "Software"), to deal in
  6. * the Software without restriction, including without limitation the rights to
  7. * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  8. * the Software, and to permit persons to whom the Software is furnished to do so,
  9. * subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in all
  12. * copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  16. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  17. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  18. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  19. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  20. */
  21. #include "user.h"
  22. #define SHT30_ADDR (0x44) //7位地址0x44
  23. #define noACK 0 //用于判断是否结束通讯
  24. #define ACK 1 //结束数据传输
  25. //命令
  26. #define SHT30_SINGLE_H_MEASURE_EN 0x2C06
  27. #define SHT30_SINGLE_M_MEASURE_EN 0x2C0D
  28. #define SHT30_SINGLE_L_MEASURE_EN 0x2C10
  29. #define SHT30_SINGLE_H_MEASURE_DIS 0x2400
  30. #define SHT30_SINGLE_M_MEASURE_DIS 0x240B
  31. #define SHT30_SINGLE_L_MEASURE_DIS 0x2416
  32. #define SHT30_PERIODOC_H_MEASURE_500MS 0x2032
  33. #define SHT30_PERIODOC_M_MEASURE_500MS 0x2024
  34. #define SHT30_PERIODOC_L_MEASURE_500MS 0x202F
  35. #define SHT30_PERIODOC_H_MEASURE_1S 0x2130
  36. #define SHT30_PERIODOC_M_MEASURE_1S 0x2126
  37. #define SHT30_PERIODOC_L_MEASURE_1S 0x212D
  38. #define SHT30_PERIODOC_H_MEASURE_2S 0x2236
  39. #define SHT30_PERIODOC_M_MEASURE_2S 0x2220
  40. #define SHT30_PERIODOC_L_MEASURE_2S 0x222B
  41. #define SHT30_PERIODOC_H_MEASURE_4S 0x2334
  42. #define SHT30_PERIODOC_M_MEASURE_4S 0x2322
  43. #define SHT30_PERIODOC_L_MEASURE_4S 0x2329
  44. #define SHT30_PERIODOC_H_MEASURE_10S 0x2737
  45. #define SHT30_PERIODOC_M_MEASURE_10S 0x2721
  46. #define SHT30_PERIODOC_L_MEASURE_10S 0x272A
  47. #define SHT30_PERIODOC_MEASURE_READ 0xE000 //重复测量读取数据
  48. #define SHT30_SOFT_RESET 0x30A2 //软复位
  49. #define SHT30_HEATER_EN 0x306D //加热使能
  50. #define SHT30_HEATER_DIS 0x3066 //加热关闭
  51. #define SHT30_READ_STATUS 0xF32D //读状态寄存器
  52. #define SHT30_CLEAR_STATUS 0x3041 //清状态寄存器
  53. // CRC
  54. #define POLYNOMIAL 0x31 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001
  55. void SHT30_Init(CBFuncEx_t CB, void *pParam)
  56. {
  57. uint8_t Reg[2];
  58. uint8_t I2CID = I2C_ID0;
  59. GPIO_Iomux(GPIOE_06, 2);
  60. GPIO_Iomux(GPIOE_07, 2);
  61. I2C_MasterSetup(I2CID, 400000);
  62. BytesPutBe16(Reg, SHT30_SINGLE_M_MEASURE_EN);
  63. I2C_BlockWrite(I2CID, SHT30_ADDR, Reg, 2, 100, CB, pParam);
  64. }
  65. void SHT30_GetResult(CBFuncEx_t CB, void *pParam)
  66. {
  67. uint8_t Reg[2];
  68. uint8_t Data[9];
  69. uint8_t I2CID = I2C_ID0;
  70. uint16_t T,H;
  71. uint8_t vTemSymbol, crc8;
  72. int32_t vTem, vHum;
  73. float vTemp = 0.00;
  74. Reg[0] = 0;
  75. if (!I2C_BlockRead(I2CID, SHT30_ADDR, Reg, 1, Data, 6, 100, CB, pParam))
  76. {
  77. T = BytesGetBe16(Data);
  78. H = BytesGetBe16(Data + 3);
  79. crc8 = CRC8Cal(Data, 2, 0xff, POLYNOMIAL, 0);
  80. if (crc8 != Data[2])
  81. {
  82. DBG("t data check error %x %x", crc8, Data[2]);
  83. goto CHECK_NEXT;
  84. }
  85. crc8 = CRC8Cal(Data + 3, 2, 0xff, POLYNOMIAL, 0);
  86. if (crc8 != Data[5])
  87. {
  88. DBG("h data check error %x %x", crc8, Data[5]);
  89. goto CHECK_NEXT;
  90. }
  91. vTemp = 175.0*T/(65536-1);
  92. if (vTemp >= 45)
  93. {
  94. vTem = (vTemp - 45.0)*10.0;
  95. }
  96. else
  97. {
  98. vTem = (45.0 - vTemp)*10.0;
  99. vTem = -vTem;
  100. }
  101. vTemp = 100.0*H/(65536.0-1.0);
  102. vHum = (vTemp*10);
  103. DBG("温度 %d, 湿度 %d",vTem, vHum);
  104. }
  105. else
  106. {
  107. DBG("i2c fail!");
  108. }
  109. CHECK_NEXT:
  110. BytesPutBe16(Reg, SHT30_SINGLE_M_MEASURE_EN);
  111. I2C_BlockWrite(I2CID, SHT30_ADDR, Reg, 2, 100, CB, pParam);
  112. }