TMP75AIDGKR.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /*
  2. * BMA253.c
  3. *
  4. * Created on: 2019. 5. 27.
  5. * Author: parkyj
  6. */
  7. #include "TMP75AIDGKR.h"
  8. static HAL_StatusTypeDef Tmp75_Write_Register(I2C_HandleTypeDef *hi2c, uint8_t adr,
  9. uint8_t register_pointer, uint16_t register_value);
  10. static HAL_StatusTypeDef Tmp75_Read_Register(I2C_HandleTypeDef *hi2c, uint8_t adr,
  11. uint8_t register_pointer, uint8_t* receive_buffer);
  12. /*!
  13. * \brief Convert address line state to slave address
  14. *
  15. * \retval slave address or 0xff if address line state combination is invalid
  16. */
  17. uint8_t Tmp75_SlaveAddress(Tmp75_AddressLine_t a2, Tmp75_AddressLine_t a1,
  18. Tmp75_AddressLine_t a0)
  19. {
  20. typedef struct
  21. {
  22. Tmp75_AddressLine_t a2;
  23. Tmp75_AddressLine_t a1;
  24. Tmp75_AddressLine_t a0;
  25. uint8_t SlaveAddress;
  26. } Lm75_addrconv_t;
  27. const Lm75_addrconv_t Lm75_addrconv[] =
  28. {
  29. {Tmp75Addr_Zero, Tmp75Addr_Zero, Tmp75Addr_Zero, 0x48},
  30. {Tmp75Addr_Zero, Tmp75Addr_Zero, Tmp75Addr_One, 0x49},
  31. {Tmp75Addr_Zero, Tmp75Addr_One, Tmp75Addr_Zero, 0x4A},
  32. {Tmp75Addr_Zero, Tmp75Addr_One, Tmp75Addr_One, 0x4B},
  33. {Tmp75Addr_One, Tmp75Addr_Zero, Tmp75Addr_Zero, 0x4C},
  34. {Tmp75Addr_One, Tmp75Addr_Zero, Tmp75Addr_One, 0x4D},
  35. {Tmp75Addr_One, Tmp75Addr_One, Tmp75Addr_Zero, 0x4E},
  36. {Tmp75Addr_One, Tmp75Addr_One, Tmp75Addr_One, 0x4F},
  37. {Tmp75Addr_Float, Tmp75Addr_Zero, Tmp75Addr_Zero, 0x70},
  38. {Tmp75Addr_Float, Tmp75Addr_Zero, Tmp75Addr_Float, 0x71},
  39. {Tmp75Addr_Float, Tmp75Addr_Zero, Tmp75Addr_One, 0x72},
  40. {Tmp75Addr_Float, Tmp75Addr_One, Tmp75Addr_Zero, 0x73},
  41. {Tmp75Addr_Float, Tmp75Addr_One, Tmp75Addr_Float, 0x74},
  42. {Tmp75Addr_Float, Tmp75Addr_One, Tmp75Addr_One, 0x75},
  43. {Tmp75Addr_Float, Tmp75Addr_Float, Tmp75Addr_Zero, 0x76},
  44. {Tmp75Addr_Float, Tmp75Addr_Float, Tmp75Addr_One, 0x77},
  45. {Tmp75Addr_Zero, Tmp75Addr_Float, Tmp75Addr_Zero, 0x28},
  46. {Tmp75Addr_Zero, Tmp75Addr_Float, Tmp75Addr_One, 0x29},
  47. {Tmp75Addr_One, Tmp75Addr_Float, Tmp75Addr_Zero, 0x2A},
  48. {Tmp75Addr_One, Tmp75Addr_Float, Tmp75Addr_One, 0x2B},
  49. {Tmp75Addr_Zero, Tmp75Addr_Zero, Tmp75Addr_Float, 0x2C},
  50. {Tmp75Addr_Zero, Tmp75Addr_One, Tmp75Addr_Float, 0x2D},
  51. {Tmp75Addr_One, Tmp75Addr_Zero, Tmp75Addr_Float, 0x2E},
  52. {Tmp75Addr_One, Tmp75Addr_One, Tmp75Addr_Float, 0x2F},
  53. {Tmp75Addr_Zero, Tmp75Addr_Float, Tmp75Addr_Float, 0x35},
  54. {Tmp75Addr_One, Tmp75Addr_Float, Tmp75Addr_Float, 0x36},
  55. {Tmp75Addr_Float, Tmp75Addr_Float, Tmp75Addr_Float, 0x37},
  56. {Tmp75Addr_Zero, Tmp75Addr_Zero, Tmp75Addr_Zero, 0x48},
  57. {Tmp75Addr_Zero, Tmp75Addr_Zero, Tmp75Addr_One, 0x49},
  58. {Tmp75Addr_Zero, Tmp75Addr_One, Tmp75Addr_Zero, 0x4A},
  59. {Tmp75Addr_Zero, Tmp75Addr_One, Tmp75Addr_One, 0x4B},
  60. {Tmp75Addr_One, Tmp75Addr_Zero, Tmp75Addr_Zero, 0x4C},
  61. {Tmp75Addr_One, Tmp75Addr_Zero, Tmp75Addr_One, 0x4D},
  62. {Tmp75Addr_One, Tmp75Addr_One, Tmp75Addr_Zero, 0x4E},
  63. {Tmp75Addr_One, Tmp75Addr_One, Tmp75Addr_One, 0x4F}
  64. };
  65. int i;
  66. for (i = 0; i<(sizeof(Lm75_addrconv) / sizeof(Lm75_addrconv[0])); i++)
  67. {
  68. if ( (Lm75_addrconv[i].a0 == a0) &
  69. (Lm75_addrconv[i].a1 == a1) &
  70. (Lm75_addrconv[i].a2 == a2) ) return Lm75_addrconv[i].SlaveAddress;
  71. }
  72. printf("Address Not Found \r\n");
  73. return 0xff;
  74. }
  75. /**
  76. * @brief Init TMP75
  77. * @param hi2c: pointer to I2C handle
  78. * @param adr: Slave address
  79. * @param cfg: configuration register
  80. * @retval None
  81. */
  82. HAL_StatusTypeDef Tmp75_Init(I2C_HandleTypeDef *hi2c, uint8_t adr,
  83. Tmp75_regconf_t cfg) {
  84. uint16_t regval = cfg.r << 8;
  85. return Tmp75_Write_Register(hi2c, adr, TMP75_RCONF, regval);
  86. }
  87. static HAL_StatusTypeDef Tmp75_Write_Register(I2C_HandleTypeDef *hi2c, uint8_t adr,
  88. uint8_t register_pointer, uint16_t register_value) {
  89. uint8_t data[3];
  90. data[0] = register_pointer; // Register address
  91. data[1] = register_value >> 8; // MSB byte of 16bit data
  92. data[2] = register_value; // LSB byte of 16bit data
  93. return HAL_I2C_Master_Transmit(hi2c, adr<<1, data, 3, 100);
  94. }
  95. static HAL_StatusTypeDef Tmp75_Read_Register(I2C_HandleTypeDef *hi2c, uint8_t adr,
  96. uint8_t register_pointer, uint8_t* receive_buffer) {
  97. HAL_StatusTypeDef status;
  98. // first set the register pointer to the register wanted to be read
  99. status = HAL_I2C_Master_Transmit(hi2c, adr<<1, &register_pointer, 1, 100);
  100. // receive the 2 x 8bit data into the receive buffer
  101. status |= HAL_I2C_Master_Receive(hi2c, adr<<1 | 0x01, receive_buffer, 2, 100);
  102. return status;
  103. }
  104. HAL_StatusTypeDef Tmp75_Read_Teperature(I2C_HandleTypeDef *hi2c, uint8_t adr,
  105. float* temperature) {
  106. HAL_StatusTypeDef status;
  107. uint8_t T_buffer[2];
  108. uint16_t temp;
  109. status = Tmp75_Read_Register(hi2c, adr, TMP75_RTEMP, T_buffer);
  110. if (status == HAL_OK)
  111. {
  112. temp = ((T_buffer[0]<<8) | T_buffer[1]) >> 4;
  113. *temperature = (float)temp * 0.0625f;
  114. }
  115. return status;
  116. }
  117. HAL_StatusTypeDef Tmp75_Read_Int_Teperature(I2C_HandleTypeDef *hi2c, uint8_t tmp75addr,
  118. int32_t* temperature)
  119. {
  120. float T;
  121. Tmp75_regconf_t TMP75_cfg;
  122. HAL_StatusTypeDef status;
  123. TMP75_cfg.b.R = TMP75_RESOLUTION_12BITS;
  124. TMP75_cfg.b.OS = 1;
  125. TMP75_cfg.b.F = 0;
  126. TMP75_cfg.b.POL = 0;
  127. TMP75_cfg.b.TM = 0;
  128. TMP75_cfg.b.SD = 0;
  129. status = Tmp75_Init(hi2c, tmp75addr, TMP75_cfg);
  130. if (status == HAL_OK) {
  131. status = Tmp75_Read_Teperature(hi2c, tmp75addr, &T);
  132. }
  133. /////////// TEST
  134. /// T = -11.5;
  135. /////////// TEST
  136. *temperature = (int32_t)(T*1000);
  137. printf("Current tmp : %f \r\n",(float)(*temperature/1000.0));
  138. return status;
  139. }