IM1253E.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /*********************************************************************************************************
  2. * 模块名称:IM1253E.c
  3. * 摘 要:电能测量芯片驱动应用
  4. * 当前版本:1.0.0
  5. * 作 者:anycrying
  6. * 完成日期:2024年04月09日
  7. * 内 容:
  8. * 注 意:
  9. **********************************************************************************************************
  10. * 取代版本:
  11. * 作 者:
  12. * 完成日期:
  13. * 修改内容:
  14. * 修改文件:
  15. *********************************************************************************************************/
  16. /*********************************************************************************************************
  17. * 包含头文件
  18. *********************************************************************************************************/
  19. #include "SysTick.h"
  20. #include "IM1253E.h"
  21. #include "Uart1.h"
  22. #include "board_cnf.h"
  23. #include "Main.h"
  24. #if SUPPORT_STM32_ADC
  25. #include "ch442e.h"
  26. #endif
  27. /*********************************************************************************************************
  28. * 宏定义
  29. *********************************************************************************************************/
  30. /*********************************************************************************************************
  31. * 枚举结构体
  32. *********************************************************************************************************/
  33. /*********************************************************************************************************
  34. * 内部变量定义
  35. *********************************************************************************************************/
  36. bool read_IM1253E_ok_flag;
  37. bool write_IM1253E_ok_flag;
  38. uint8_t Tx_Data_frame_IM1253E[UART1_BUF_SIZE];
  39. uint8_t W_R_reg_N;
  40. extern bool Rx_Finish_flag;
  41. extern uint8_t RX_Length;
  42. extern uint8_t Rx_Data_len;
  43. extern uint8_t RX_Index;
  44. extern uint8_t Rx_Data_buff_IM1253E[UART1_BUF_SIZE];
  45. /*********************************************************************************************************
  46. * 内部函数声明
  47. *********************************************************************************************************/
  48. /*********************************************************************************************************
  49. * 内部函数实现
  50. *********************************************************************************************************/
  51. /*********************************************************************************************************
  52. * 函数名称:CRC_calculate_function
  53. * 函数功能:CRC码计算
  54. * 输入参数:除了CRC码外的数据长度
  55. * 输出参数:计算出的CRC码
  56. * 返 回 值:计算出的CRC码
  57. * 创建日期:2024年04月09日
  58. * 注 意:
  59. *********************************************************************************************************/
  60. uint16_t CRC_calculate_function(uint8_t len)
  61. {
  62. uint8_t i = 0;
  63. uint8_t j = 0;
  64. uint16_t temp0 = 0xffff;
  65. uint16_t temp1 = 0xffff;
  66. for(i = 0;i < len;i++)
  67. {
  68. temp0 = Tx_Data_frame_IM1253E[i] ^ temp0;
  69. temp1 = temp0 >> 1;
  70. for(j = 0;j < 8;j++)
  71. {
  72. if((temp0 & 0x0001) > 0)
  73. {
  74. temp0 = temp1 ^ 0xa001;
  75. }
  76. else
  77. {
  78. temp0 = temp1;
  79. }
  80. temp1 = temp0 >> 1;
  81. }
  82. }
  83. return temp0;
  84. }
  85. /*********************************************************************************************************
  86. * 函数名称:Read_IM1253E_REG
  87. * 函数功能:读IM1253E寄存器功能函数
  88. * 输入参数:dev_addr:IM1253E设备地址;reg_addr:IM1253E寄存器首地址;len:要读取的数据长度即寄存器数
  89. * 输出参数:void
  90. * 返 回 值:void
  91. * 创建日期:2024年04月09日
  92. * 注 意:
  93. *********************************************************************************************************/
  94. void Read_IM1253E_REG(uint8_t dev_addr,uint16_t reg_addr,uint8_t len)
  95. {
  96. uint16_t temp0;
  97. RX_Index = 0;
  98. Rx_Finish_flag = false;
  99. Rx_Data_len = len << 2;
  100. RX_Length = Rx_Data_len + 5;
  101. Tx_Data_frame_IM1253E[0] = dev_addr;
  102. Tx_Data_frame_IM1253E[1] = cmd_read_IM1253E;
  103. Tx_Data_frame_IM1253E[2] = reg_addr >> 8;
  104. Tx_Data_frame_IM1253E[3] = reg_addr;
  105. Tx_Data_frame_IM1253E[4] = 0x00;
  106. Tx_Data_frame_IM1253E[5] = len;
  107. temp0 = CRC_calculate_function(6);
  108. Tx_Data_frame_IM1253E[6] = temp0;
  109. Tx_Data_frame_IM1253E[7] = temp0 >> 8;
  110. Start_Send_UartData(Tx_Data_frame_IM1253E,8);
  111. }
  112. /*********************************************************************************************************
  113. * 函数名称:Write_IM1253E_REG
  114. * 函数功能:写IM1253E寄存器功能函数
  115. * 输入参数:dev_addr:IM1253E设备地址;reg_addr:IM1253E寄存器首地址;*pt:要写入的存储区缓冲数据;len:要
  116. 写的寄存器数
  117. * 输出参数:void
  118. * 返 回 值:void
  119. * 创建日期:2024年04月09日
  120. * 注 意:
  121. *********************************************************************************************************/
  122. void Write_IM1253E_REG(uint8_t dev_addr,uint16_t reg_addr,uint8_t *pt,uint8_t len)
  123. {
  124. uint8_t i;
  125. Rx_Data_len = len;
  126. RX_Length = len + 6;
  127. Tx_Data_frame_IM1253E[0] = dev_addr;
  128. Tx_Data_frame_IM1253E[1] = cmd_read_IM1253E;
  129. Tx_Data_frame_IM1253E[2] = reg_addr >> 8;
  130. Tx_Data_frame_IM1253E[3] = reg_addr;
  131. Tx_Data_frame_IM1253E[4] = 0x00;
  132. Tx_Data_frame_IM1253E[5] = len;
  133. Tx_Data_frame_IM1253E[6] = len << 1;
  134. for(i = 0;i < len;i++)
  135. {
  136. Tx_Data_frame_IM1253E[7 + i] = *(pt + i);
  137. }
  138. Tx_Data_frame_IM1253E[7 + len] = CRC_calculate_function(7 + len);
  139. Tx_Data_frame_IM1253E[8 + len] = CRC_calculate_function(7 + len) >> 8;
  140. Start_Send_UartData(Tx_Data_frame_IM1253E,(9 + len));
  141. }
  142. #if SUPPORT_STM32_ADC
  143. Rx_Data data={0};
  144. uint32_t read_voltage(uint8_t channel)
  145. {
  146. uint16_t read_volatge = 0xA5A5;
  147. uint32_t value;
  148. RX_Length = 4;
  149. che442_change_ch(channel);
  150. DelayNms(5);
  151. //memset(&data.value,0,4);
  152. Start_Send_UartData((uint8_t*)&read_volatge,sizeof(read_volatge));
  153. int count = 0;
  154. while(Rx_Finish_flag != true)
  155. {
  156. DelayNms(1);
  157. if(count >= 100)
  158. {
  159. RX_Index = 0;
  160. Rx_Finish_flag =false;
  161. break;
  162. }
  163. count++;
  164. }
  165. if(Rx_Finish_flag == false)
  166. {
  167. count =0;
  168. Start_Send_UartData((uint8_t*)&read_volatge,sizeof(read_volatge));
  169. while(Rx_Finish_flag != true)
  170. {
  171. DelayNms(1);
  172. if(count >= 100)
  173. {
  174. RX_Index = 0;
  175. Rx_Finish_flag =false;
  176. break;
  177. }
  178. count ++;
  179. }
  180. }
  181. if(Rx_Finish_flag)
  182. {
  183. value = data.value;
  184. Rx_Finish_flag = false;
  185. }else
  186. value = 0;
  187. return value;
  188. }
  189. #endif