htu21.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "stm8s.h"
  2. #include "htu21.h"
  3. #include "i2c.h"
  4. #include "delay.h"
  5. #define HTU_T_MEASURE 0xF3
  6. #define HTU_H_MEASURE 0xF5
  7. static uint8_t buf[3];
  8. static const uint8_t addr = 0x40;
  9. static t_i2c_status i2cs;
  10. static uint32_t val;
  11. static uint8_t CalcSht21Crc(uint8_t *data, uint8_t nbrOfBytes);
  12. htu_err_t htu_GetTemperature(int16_t * temperature) {
  13. i2cs = i2c_wr_reg(addr, HTU_T_MEASURE);
  14. if (i2cs == 0) {
  15. Delay(90);
  16. i2c_rd_reg(addr, buf);
  17. if(buf[2] == CalcSht21Crc(buf,2)) {
  18. val = buf[0];
  19. val <<= 8;
  20. val |= (buf[1] & 0xfc);
  21. // Temp = val * 175.72 / 2^16 - 46.85
  22. val *= 4393; // 175.72/4*100
  23. val *= 100; // for .xx degree
  24. val += 819200; // for round
  25. val /= 1638400; // 2^16/4*100
  26. *temperature = val - 4685;
  27. return HTU_OK;
  28. } else {
  29. return HTU_CRC_Temp;
  30. }
  31. } else {
  32. return HTU_I2C;
  33. }
  34. }
  35. htu_err_t htu_GetHumidity(uint16_t * humidity) {
  36. i2cs = i2c_wr_reg(addr, HTU_H_MEASURE);
  37. if (i2cs == 0) {
  38. Delay(60);
  39. i2c_rd_reg(addr, buf);
  40. if(buf[2] == CalcSht21Crc(buf,2)) {
  41. val = buf[0];
  42. val <<= 8;
  43. val |= (buf[1] & 0xfc);
  44. // Humidity = val * 125 / 2^16 - 6
  45. val *= 125;
  46. val *= 10; // for .x %H
  47. val += 32768; // for round
  48. val /= 65536;
  49. *humidity = val - 60;
  50. return HTU_OK;
  51. } else {
  52. return HTU_CRC_Humidity;
  53. }
  54. } else {
  55. return HTU_I2C;
  56. }
  57. }
  58. static uint8_t CalcSht21Crc(uint8_t *data, const uint8_t nbrOfBytes) {
  59. // CRC
  60. //const u16t POLYNOMIAL = 0x131; //P(x)=x^8+x^5+x^4+1 = 100110001
  61. uint8_t byteCtr,bit,crc;
  62. crc = 0;
  63. //calculates 8-Bit checksum with given polynomial
  64. for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
  65. {
  66. crc ^= (data[byteCtr]);
  67. for (bit = 8; bit > 0; --bit)
  68. {
  69. if (crc & 0x80) crc = (crc << 1) ^ 0x131;
  70. else crc = (crc << 1);
  71. }
  72. }
  73. return(crc);
  74. }