van_BSP_Temp_mts01.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. /******************************************************************************
  2. *Copyright(C),2024-2024,万众一芯生
  3. *van_BSP_Temp_mts01.c
  4. *mts01 温度相关驱动接口
  5. *修改历史
  6. author 范义东 新建 2024/01/27
  7. ******************************************************************************/
  8. #include "onechip_include_header.h"
  9. #define MTS_IIC_ERR_TEMP (float)-60
  10. #define MTS_MAX_ERR_NUMBER 5
  11. #define MTS_REINIT_TIME 5*MTS_MAX_ERR_NUMBER
  12. #define MTS_RETRY_TIME 20000*MTS_MAX_ERR_NUMBER
  13. VAN_TEMP_MTS01_CON_ST_Def gTemp_mts01_demo_V1[] = {
  14. {TEMP_MTS01NAMEANDID(TEMP_BLOCK), &hi2c1, MTS01_ADDR0, TEMP_MTS01_MAX_AVG_TIME, 0},
  15. };
  16. const unsigned int gTemp_mts01_demo_V1_Num = ARR_LEN(gTemp_mts01_demo_V1);
  17. P_VAN_TEMP_MTS01_CON_ST_Def gTemp_mts01;
  18. unsigned int gTemp_mts01Num;
  19. VAN_TEMP_CHANNEl_CON_ST_Def gTemp_channel_demo_V1[] = {
  20. {EnmFuntionIdType_Idhost, 1 << TEMP_BLOCK},
  21. };
  22. const unsigned int gTemp_channel_demo_V1_Num = ARR_LEN(gTemp_channel_demo_V1);
  23. static float mst01_samp[ARR_LEN(gTemp_mts01_demo_V1)] = {0}; //传感器采集数据
  24. static unsigned short last_valve[ARR_LEN(gTemp_mts01_demo_V1)] = {0};
  25. static uint32_t count[ARR_LEN(gTemp_mts01_demo_V1)] = {0};
  26. static uint32_t errorConter[ARR_LEN(gTemp_mts01_demo_V1)] = {0};
  27. uint32_t printMts_temp = 0;
  28. extern void DelayMS(uint32_t ms);
  29. unsigned int MTS01_Init(P_VAN_TEMP_MTS01_CON_ST_Def pmts01);
  30. /****************************************************************
  31. 函数名: loadPidCfg
  32. 创建时间: 2024/01/08
  33. 创建人: 范义东
  34. 函数说明:加载配置文件
  35. 参数:
  36. 返回值 : 加载成功
  37. ****************************************************************/
  38. unsigned int loadTemp_mts01Cfg(void) {
  39. unsigned int res;
  40. gTemp_mts01 = gTemp_mts01_demo_V1;
  41. gTemp_mts01Num = gTemp_mts01_demo_V1_Num;
  42. P_VAN_TEMP_MTS01_CON_ST_Def pmts01 = gTemp_mts01;
  43. for (int i = 0; i < gTemp_mts01Num; i++) {
  44. pmts01->header = 0;
  45. memset(pmts01->temp, 0, sizeof(pmts01->temp));
  46. res = MTS01_Init(pmts01);
  47. pmts01++;
  48. }
  49. return res;
  50. }
  51. unsigned int MY_CRC8(unsigned char data[], unsigned char nbrOfBytes) {
  52. unsigned char bit; // Bit mask
  53. unsigned char crc = 0xFF; // Calculated checksum
  54. unsigned char byteCtr; // Byte counter
  55. // Calculates 8-Bit checksum with given polynomial
  56. for (byteCtr = 0; byteCtr < nbrOfBytes; byteCtr++) {
  57. crc ^= (data[byteCtr]);
  58. for (bit = 8; bit > 0; --bit) {
  59. if (crc & 0x80)
  60. crc = (crc << 1) ^ POLYNOMIAL;
  61. else
  62. crc = (crc << 1);
  63. }
  64. }
  65. return crc;
  66. }
  67. /****************************************************************
  68. 函数名: MTS01_Init
  69. 创建时间: 2024/01/08
  70. 创建人: 范义东
  71. 函数说明:模块初始化
  72. 参数:
  73. 返回值 : 加载成功
  74. ****************************************************************/
  75. unsigned int MTS01_Reg_Write(P_VAN_TEMP_MTS01_CON_ST_Def pmts01, unsigned int cmd, unsigned char *pData, unsigned int Size) {
  76. uint32_t ret;
  77. unsigned char wrbuf[16];
  78. wrbuf[0] = cmd >> 8;
  79. wrbuf[1] = cmd;
  80. for (unsigned int i = 0; i < Size; i++) {
  81. wrbuf[2 + i] = pData[i];
  82. }
  83. ret = HAL_I2C_Master_Transmit(pmts01->I2C, pmts01->addr, wrbuf, (Size + 2), 1000);
  84. return ret;
  85. }
  86. /**-----------------------------------------------------------------------
  87. * @brief Receive register data from I2C
  88. * @param DeviceAddr:I2C address cmd:I2C command *pdata:data received Size:total length
  89. * @retval success status
  90. -------------------------------------------------------------------------*/
  91. unsigned int MTS01_Reg_Read(P_VAN_TEMP_MTS01_CON_ST_Def pmts01, unsigned int cmd, unsigned char *pData, unsigned int Size) {
  92. uint32_t ret;
  93. ret = MTS01_Reg_Write(pmts01, cmd, NULL, 0);
  94. if (ret == HAL_OK) {
  95. ret = HAL_I2C_Master_Receive(pmts01->I2C, pmts01->addr, pData, Size, 1000);
  96. }
  97. return ret;
  98. }
  99. /****************************************************************
  100. 函数名: MTS01_Init
  101. 创建时间: 2024/01/08
  102. 创建人: 范义东
  103. 函数说明:模块初始化
  104. 参数:
  105. 返回值 : 加载成功
  106. ****************************************************************/
  107. unsigned int MTS01_Init(P_VAN_TEMP_MTS01_CON_ST_Def pmts01) {
  108. unsigned char scr_rd[3], scr_wr[3] = {0};
  109. pmts01->isload = 0;
  110. if(HAL_OK == MTS01_Reg_Read(pmts01, READ_STATUSCONFIG, scr_rd, sizeof(scr_rd))){
  111. pmts01->isload = 1;
  112. }else{
  113. return 0;
  114. }
  115. scr_wr[0] |= CFG_Repeatbility_Medium;
  116. scr_wr[0] = (scr_wr[0] & ~CFG_MPS_Mask);
  117. scr_wr[0] |= CFG_MPS_10;
  118. scr_wr[1] = 0xFF;
  119. scr_wr[2] = MY_CRC8(scr_wr, 2);
  120. MTS01_Reg_Write(pmts01, WRITE_CONFIG, scr_wr, sizeof(scr_rd));
  121. MTS01_Reg_Write(pmts01, CONVERT_T, NULL, 0);
  122. return 1;
  123. }
  124. /****************************************************************
  125. * 函数名: MTS01_FindChale
  126. * 创建时间: 2024/01/08
  127. * 创建人: 范义东
  128. * 函数说明:通过 ID,查找Mts配置文件
  129. * 输入参数: runMtsId ID
  130. * 输出参数: pMts01 电机参数
  131. * 返回值 : 有配置文件返回true,返回失败
  132. ****************************************************************/
  133. bool MTS01_FindChale(unsigned char runMtsId, P_VAN_TEMP_MTS01_CON_ST_Def *pMts01) {
  134. unsigned char MtsId;
  135. /*寻找配置文件*/
  136. for (MtsId = 0; MtsId < gTemp_mts01Num; MtsId++) {
  137. if (runMtsId == gTemp_mts01[MtsId].tempID) {
  138. *pMts01 = &gTemp_mts01[MtsId];
  139. return true;
  140. }
  141. }
  142. *pMts01 = NULL;
  143. return false;
  144. }
  145. /****************************************************************
  146. * 函数名: MTS01_ReadTemp
  147. * 创建时间: 2024/01/08
  148. * 创建人: 范义东
  149. * 函数说明:通过温度通道 获取当前温度
  150. * 输入参数: runMtsId 通道
  151. * 输出参数: pTemp 当前温度
  152. * 返回值 : 成功rue,失败返回false
  153. ****************************************************************/
  154. bool MTS01_ReadTemp(unsigned char runMtsId, float *pTemp) {
  155. unsigned char data[3] = {0};
  156. P_VAN_TEMP_MTS01_CON_ST_Def pMts01;
  157. if (MTS01_FindChale(runMtsId, &pMts01)) {
  158. if(pMts01->isload == 0){
  159. *pTemp = -104;
  160. return False;
  161. };
  162. I2C_HandleTypeDef *I2C = pMts01->I2C;
  163. HAL_StatusTypeDef ret = HAL_I2C_Master_Receive(pMts01->I2C, pMts01->addr, data, sizeof(data), 1000);
  164. if (ret != HAL_OK) {
  165. errorConter[runMtsId]++;
  166. if ((errorConter[runMtsId] % MTS_MAX_ERR_NUMBER) == 0) {
  167. if ((errorConter[runMtsId] < MTS_REINIT_TIME)) {
  168. *pTemp = MTS_IIC_ERR_TEMP-1;/*比异常低一度,便于异常判断*/
  169. float temp = (*pTemp - 40)*256;
  170. *(short *)&last_valve[runMtsId] = temp;
  171. HAL_I2C_DeInit(I2C);
  172. HAL_Delay(300U);
  173. HAL_I2C_Init(I2C);
  174. HAL_Delay(300U);
  175. MTS01_Init(pMts01);
  176. HAL_Delay(300U);
  177. }
  178. } else if (errorConter[runMtsId] > MTS_RETRY_TIME) {
  179. errorConter[runMtsId] = 0;
  180. }
  181. return False;
  182. }
  183. unsigned char clcCrc = MY_CRC8(data, 2);
  184. if (data[2] == clcCrc) {
  185. unsigned short tmpraw = (uint16_t)data[0] << 8 | data[1];
  186. //值相同的次数++
  187. if (last_valve[runMtsId] == tmpraw) {
  188. count[runMtsId]++;
  189. if (count[runMtsId] > 5) {
  190. //需要重新初始化
  191. count[runMtsId] = 0;
  192. HAL_I2C_DeInit(I2C);
  193. HAL_Delay(300U);
  194. HAL_I2C_Init(I2C);
  195. HAL_Delay(300U);
  196. MTS01_Init(pMts01);
  197. HAL_Delay(300U);
  198. }
  199. } else {
  200. count[runMtsId] = 0;
  201. errorConter[runMtsId] = 0;
  202. }
  203. last_valve[runMtsId] = tmpraw;
  204. float temp = (short)tmpraw;
  205. temp = temp / 256;
  206. *pTemp = (temp + 40);
  207. if (*pTemp > (float)200.0) {
  208. }
  209. return True;
  210. } else {
  211. if (MTS_MAX_ERR_NUMBER > errorConter[runMtsId]) {
  212. float temp = (short)last_valve[runMtsId];
  213. temp = temp / 256;
  214. *pTemp = (temp + 40);
  215. } else if (MTS_MAX_ERR_NUMBER == errorConter[runMtsId]) {
  216. *pTemp = -101;
  217. errorConter[runMtsId] = 0;
  218. }
  219. errorConter[runMtsId]++;
  220. }
  221. } else {
  222. *pTemp = -103;
  223. }
  224. return False;
  225. }
  226. /****************************************************************
  227. * 函数名: MTS01_Temp_get
  228. * 创建时间: 2024/01/08
  229. * 创建人: 范义东
  230. * 函数说明:通过温度通道 获取当前温度
  231. * 输入参数: runMtsId 通道
  232. * 输出参数: pTemp 当前温度
  233. * 返回值 : -1001:IIC 不回; -1002:IIC校验错误; -1003:没有传感器
  234. ****************************************************************/
  235. bool MTS01_Temp_get(uint32_t runMtsId, float *Value) {
  236. P_VAN_TEMP_CHANNEl_CON_ST_Def p = gTemp_channel_demo_V1;
  237. for (int i = 0; i < gTemp_channel_demo_V1_Num; i++) {
  238. if (p->id == runMtsId) {
  239. *Value = p->temp;
  240. return true;
  241. }
  242. p++;
  243. }
  244. return False;
  245. }