IM1253E.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. /*********************************************************************************************************
  23. * 宏定义
  24. *********************************************************************************************************/
  25. /*********************************************************************************************************
  26. * 枚举结构体
  27. *********************************************************************************************************/
  28. /*********************************************************************************************************
  29. * 内部变量定义
  30. *********************************************************************************************************/
  31. bool read_IM1253E_ok_flag;
  32. bool write_IM1253E_ok_flag;
  33. uint8_t Tx_Data_frame_IM1253E[UART1_BUF_SIZE];
  34. uint8_t W_R_reg_N;
  35. extern bool Rx_Finish_flag;
  36. extern uint8_t RX_Length;
  37. extern uint8_t Rx_Data_len;
  38. extern uint8_t RX_Index;
  39. extern uint8_t Rx_Data_buff_IM1253E[UART1_BUF_SIZE];
  40. /*********************************************************************************************************
  41. * 内部函数声明
  42. *********************************************************************************************************/
  43. /*********************************************************************************************************
  44. * 内部函数实现
  45. *********************************************************************************************************/
  46. /*********************************************************************************************************
  47. * 函数名称:CRC_calculate_function
  48. * 函数功能:CRC码计算
  49. * 输入参数:除了CRC码外的数据长度
  50. * 输出参数:计算出的CRC码
  51. * 返 回 值:计算出的CRC码
  52. * 创建日期:2024年04月09日
  53. * 注 意:
  54. *********************************************************************************************************/
  55. uint16_t CRC_calculate_function(uint8_t len)
  56. {
  57. uint8_t i = 0;
  58. uint8_t j = 0;
  59. uint16_t temp0 = 0xffff;
  60. uint16_t temp1 = 0xffff;
  61. for(i = 0;i < len;i++)
  62. {
  63. temp0 = Tx_Data_frame_IM1253E[i] ^ temp0;
  64. temp1 = temp0 >> 1;
  65. for(j = 0;j < 8;j++)
  66. {
  67. if((temp0 & 0x0001) > 0)
  68. {
  69. temp0 = temp1 ^ 0xa001;
  70. }
  71. else
  72. {
  73. temp0 = temp1;
  74. }
  75. temp1 = temp0 >> 1;
  76. }
  77. }
  78. return temp0;
  79. }
  80. /*********************************************************************************************************
  81. * 函数名称:Read_IM1253E_REG
  82. * 函数功能:读IM1253E寄存器功能函数
  83. * 输入参数:dev_addr:IM1253E设备地址;reg_addr:IM1253E寄存器首地址;len:要读取的数据长度即寄存器数
  84. * 输出参数:void
  85. * 返 回 值:void
  86. * 创建日期:2024年04月09日
  87. * 注 意:
  88. *********************************************************************************************************/
  89. void Read_IM1253E_REG(uint8_t dev_addr,uint16_t reg_addr,uint8_t len)
  90. {
  91. uint16_t temp0;
  92. RX_Index = 0;
  93. Rx_Finish_flag = false;
  94. Rx_Data_len = len << 2;
  95. RX_Length = Rx_Data_len + 5;
  96. Tx_Data_frame_IM1253E[0] = dev_addr;
  97. Tx_Data_frame_IM1253E[1] = cmd_read_IM1253E;
  98. Tx_Data_frame_IM1253E[2] = reg_addr >> 8;
  99. Tx_Data_frame_IM1253E[3] = reg_addr;
  100. Tx_Data_frame_IM1253E[4] = 0x00;
  101. Tx_Data_frame_IM1253E[5] = len;
  102. temp0 = CRC_calculate_function(6);
  103. Tx_Data_frame_IM1253E[6] = temp0;
  104. Tx_Data_frame_IM1253E[7] = temp0 >> 8;
  105. Start_Send_UartData(Tx_Data_frame_IM1253E,8);
  106. }
  107. /*********************************************************************************************************
  108. * 函数名称:Write_IM1253E_REG
  109. * 函数功能:写IM1253E寄存器功能函数
  110. * 输入参数:dev_addr:IM1253E设备地址;reg_addr:IM1253E寄存器首地址;*pt:要写入的存储区缓冲数据;len:要
  111. 写的寄存器数
  112. * 输出参数:void
  113. * 返 回 值:void
  114. * 创建日期:2024年04月09日
  115. * 注 意:
  116. *********************************************************************************************************/
  117. void Write_IM1253E_REG(uint8_t dev_addr,uint16_t reg_addr,uint8_t *pt,uint8_t len)
  118. {
  119. uint8_t i;
  120. Rx_Data_len = len;
  121. RX_Length = len + 6;
  122. Tx_Data_frame_IM1253E[0] = dev_addr;
  123. Tx_Data_frame_IM1253E[1] = cmd_read_IM1253E;
  124. Tx_Data_frame_IM1253E[2] = reg_addr >> 8;
  125. Tx_Data_frame_IM1253E[3] = reg_addr;
  126. Tx_Data_frame_IM1253E[4] = 0x00;
  127. Tx_Data_frame_IM1253E[5] = len;
  128. Tx_Data_frame_IM1253E[6] = len << 1;
  129. for(i = 0;i < len;i++)
  130. {
  131. Tx_Data_frame_IM1253E[7 + i] = *(pt + i);
  132. }
  133. Tx_Data_frame_IM1253E[7 + len] = CRC_calculate_function(7 + len);
  134. Tx_Data_frame_IM1253E[8 + len] = CRC_calculate_function(7 + len) >> 8;
  135. Start_Send_UartData(Tx_Data_frame_IM1253E,(9 + len));
  136. }