HT7032_SPI.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. /*********************************************************************************************************
  2. * 模块名称:HT7032_SPI.c
  3. * 摘 要:HT7032_SPI驱动文件
  4. * 当前版本:1.0.0
  5. * 作 者:anycrying
  6. * 完成日期:2024年04月20日
  7. * 内 容:
  8. * 注 意:
  9. **********************************************************************************************************
  10. * 取代版本:
  11. * 作 者:
  12. * 完成日期:
  13. * 修改内容:
  14. * 修改文件:
  15. *********************************************************************************************************/
  16. /*********************************************************************************************************
  17. * 包含头文件
  18. *********************************************************************************************************/
  19. #include "HT7032_SPI.h"
  20. #include <stdbool.h>
  21. /*********************************************************************************************************
  22. * 宏定义
  23. *********************************************************************************************************/
  24. /*********************************************************************************************************
  25. * 枚举结构体
  26. *********************************************************************************************************/
  27. //校表参数常数定义--------------------------------------------------------------
  28. static const struct HT7032_CaliPara
  29. {
  30. uint8_t addr; //寄存器地址
  31. uint16_t rst; //复位参数
  32. uint16_t set; //设置参数
  33. uint8_t mod; //参数类型
  34. }HT7032_CaliPara[] =
  35. {
  36. {HT7032_w_ModeCfg, 0x89AA, 0xB87E, 0}, //模式相关控制器 开启Ia,Ua,Ib,Ub,Ic,Uc通道ADC,关闭ADC Chop,开启REF chop,Femu=1.8MHz,ref偏置电流7.5uA,有效值更新慢速,稳定慢速,
  37. {HT7032_w_PGACtrl, 0x0000, 0x0154, 0}, //ADC增益选择 A,B,C电流通道2倍增益,电压通道2倍增益,
  38. {HT7032_w_EMUCfg, 0x0804, 0x78C4, 0}, //EMU模块配置寄存器 视在功率/能量采用PQS方式,3P4W代数和累加,能量读后清零,功率作启动判断,开启有功,无功,视在能量计算
  39. {HT7032_w_PgainA, 0x0000, 0, 1}, //A相有功功率增益
  40. {HT7032_w_PgainB, 0x0000, 1, 1}, //B相有功功率增益
  41. {HT7032_w_PgainC, 0x0000, 2, 1}, //C相有功功率增益
  42. {HT7032_w_QgainA, 0x0000, 0, 1}, //A相无功功率增益
  43. {HT7032_w_QgainB, 0x0000, 1, 1}, //B相无功功率增益
  44. {HT7032_w_QgainC, 0x0000, 2, 1}, //C相无功功率增益
  45. {HT7032_w_SgainA, 0x0000, 0, 1}, //A相视在功率增益
  46. {HT7032_w_SgainB, 0x0000, 1, 1}, //B相视在功率增益
  47. {HT7032_w_SgainC, 0x0000, 2, 1}, //C相视在功率增益
  48. {HT7032_w_PhSregApq0, 0x0000, 3, 1}, //A相相位校正0
  49. {HT7032_w_PhSregBpq0, 0x0000, 4, 1}, //B相相位校正0
  50. {HT7032_w_PhSregCpq0, 0x0000, 5, 1}, //C相相位校正0
  51. {HT7032_w_PhSregApq1, 0x0000, 6, 1}, //A相相位校正1
  52. {HT7032_w_PhSregBpq1, 0x0000, 7, 1}, //B相相位校正1
  53. {HT7032_w_PhSregCpq1, 0x0000, 8, 1}, //C相相位校正1
  54. {HT7032_w_PoffsetA, 0x0000, 9, 1}, //A相有功功率offset校正
  55. {HT7032_w_PoffsetB, 0x0000, 10, 1}, //B相有功功率offset校正
  56. {HT7032_w_PoffsetC, 0x0000, 11, 1}, //C相有功功率offset校正
  57. {HT7032_w_QPhscal, 0x0000, 0xFF66, 0}, //无功相位校正
  58. {HT7032_w_UgainA, 0x0000, 12, 1}, //A相电压增益
  59. {HT7032_w_UgainB, 0x0000, 13, 1}, //B相电压增益
  60. {HT7032_w_UgainC, 0x0000, 14, 1}, //C相电压增益
  61. {HT7032_w_IgainA, 0x0000, 15, 1}, //A相电流增益
  62. {HT7032_w_IgainB, 0x0000, 16, 1}, //B相电流增益
  63. {HT7032_w_IgainC, 0x0000, 17, 1}, //C相电流增益
  64. {HT7032_w_Istartup, 0x0160, 864u, 0}, //启动电流阈值设置 5A*(1000/144)*0.3%*2^13
  65. {HT7032_w_HFConst, 0x0500, 500u*2, 0}, //高频脉冲输出设置
  66. {HT7032_w_FailVolt, 0x0600, 0x0600, 0}, //失压阈值设置 不用
  67. {HT7032_w_GainADC7, 0x0000, 0x0000, 0}, //第七路ADC输入信号增益 reserved
  68. {HT7032_w_QoffsetA, 0x0000, 0x0000, 0}, //A相无功功率offset校正
  69. {HT7032_w_QoffsetB, 0x0000, 0x0000, 0}, //B相无功功率offset校正
  70. {HT7032_w_QoffsetC, 0x0000, 0x0000, 0}, //C相无功功率offset校正
  71. {HT7032_w_URmsoffsetA, 0x0000, 0x0000, 0}, //A相电压有效值offset校正
  72. {HT7032_w_URmsoffsetB, 0x0000, 0x0000, 0}, //B相电压有效值offset校正
  73. {HT7032_w_URmsoffsetC, 0x0000, 0x0000, 0}, //C相电压有效值offset校正
  74. {HT7032_w_IRmsoffsetA, 0x0000, 0x0009, 0}, //A相电流有效值offset校正
  75. {HT7032_w_IRmsoffsetB, 0x0000, 0x0009, 0}, //B相电流有效值offset校正
  76. {HT7032_w_IRmsoffsetC, 0x0000, 0x0009, 0}, //C相电流有效值offset校正
  77. {HT7032_w_UoffsetA, 0x0000, 0x0000, 0}, //A相电压通道ADC offset校正
  78. {HT7032_w_UoffsetB, 0x0000, 0x0000, 0}, //B相电压通道ADC offset校正
  79. {HT7032_w_UoffsetC, 0x0000, 0x0000, 0}, //C相电压通道ADC offset校正
  80. {HT7032_w_IoffsetA, 0x0000, 0x0000, 0}, //A相电流通道ADC offset校正
  81. {HT7032_w_IoffsetB, 0x0000, 0x0000, 0}, //B相电流通道ADC offset校正
  82. {HT7032_w_IoffsetC, 0x0000, 0x0000, 0}, //C相电流通道ADC offset校正
  83. {HT7032_w_EMUIE, 0x0001, 0x0001, 0}, //中断使能
  84. {HT7032_w_ModuleCfg, 0x3527, 0x3437, 0}, //电路模块配置寄存器 开启电压,电流高通,关闭罗氏线圈,开启TPS,BOR,选择PN传感器
  85. {HT7032_w_AllGain, 0x0000, 0x0000, 0}, //全通道增益
  86. {HT7032_w_HFDouble, 0x0000, 0x0000, 0}, //脉冲常数加倍选择
  87. {HT7032_w_LineGain, 0x2C59, 0x2C59, 0}, //基波增益校正
  88. {HT7032_w_PinCtrl, 0x000F, 0x000F, 0}, //数字pin上拉电阻选择控制 内置上拉300K电阻
  89. {HT7032_w_Pstartup, 0x0030, 216u, 0}, //启动功率阈值设置 (Un*Ib*HFConst*imp*0.3%*2^23/(2.592*10^10))
  90. {HT7032_w_Iregion0, 0x7FFF, 3000u, 0}, //相位补偿区域设置寄存器0 5A*(1000/144)*270%*2^5
  91. {HT7032_w_Cyclength, 0x1000, 0x1000, 0}, //SAG数据长度设置寄存器
  92. {HT7032_w_SAGLevel, 0x4500, 0x4500, 0}, //SAG检测阈值设置寄存器
  93. {HT7032_w_Iregion1, 0x0000, 180u, 0}, //相位补偿区域设置寄存器1 5A*(1000/144)*162%*2^5
  94. {HT7032_w_PhSregApq2, 0x0000, 18, 1}, //A相相位校正2
  95. {HT7032_w_PhSregBpq2, 0x0000, 19, 1}, //B相相位校正2
  96. {HT7032_w_PhSregCpq2, 0x0000, 20, 1}, //C相相位校正2
  97. {HT7032_w_PoffsetAL, 0x0000, 21, 1}, //A相有功功率offset校正低字节 //X
  98. {HT7032_w_PoffsetBL, 0x0000, 22, 1}, //B相有功功率offset校正低字节 //X
  99. {HT7032_w_PoffsetCL, 0x0000, 23, 1}, //C相有功功率offset校正低字节 //X
  100. {HT7032_w_QoffsetAL, 0x0000, 0x0000, 0}, //A相无功功率offset校正低字节
  101. {HT7032_w_QoffsetBL, 0x0000, 0x0000, 0}, //B相无功功率offset校正低字节
  102. {HT7032_w_QoffsetCL, 0x0000, 0x0000, 0}, //C相无功功率offset校正低字节
  103. {HT7032_w_IRmsoffsetT, 0x0000, 0x0009, 0}, //电流矢量和offset校正寄存器
  104. {HT7032_w_TPSoffset, 0x0000, 24, 1}, //TPS初值校正寄存器
  105. {HT7032_w_TPSgain, 0x0000, 0x0000, 0}, //TPS斜率校正寄存器
  106. {HT7032_w_TCoffA, 0xFEFF, 0xFF11, 0}, //Vrefgain的二次系数
  107. {HT7032_w_TCoffB, 0xEF7A, 0x2B52, 0}, //Vrefgain的一次系数
  108. {HT7032_w_TCoffC, 0x047C, 0xD483, 0}, //Vrefgain的常数项
  109. {HT7032_w_EMCfg, 0x0000, 0x0022, 0}, //新增算法控制寄存器 3P4W制,使用自动补偿,电流矢量算法1,角度算法1,无功能量全波无功,谐波能量,夹角参考Ua,
  110. {HT7032_w_OILevel, 0x0000, 0x0000, 0}, //过流阈值设置寄存器
  111. };
  112. /*********************************************************************************************************
  113. * 内部变量定义
  114. *********************************************************************************************************/
  115. uint8_t HT7032_DevOK_flag[HT7032_Device_N] = {0};
  116. uint32_t HT7032_SPI_RX_buff[HT7032_SPI_buff_len] = {0};
  117. uint32_t HT7032_SPI_TX_buff[HT7032_SPI_buff_len] = {0};
  118. /*********************************************************************************************************
  119. * 内部函数声明
  120. *********************************************************************************************************/
  121. void HT7032_SPI_config(void);
  122. void SPI_Delay(void);
  123. uint32_t Read_SPI_IO(uint8_t addr);
  124. void Write_SPI_IO(uint8_t addr, uint32_t da);
  125. uint32_t HT7032_Wr_Rd_Reg(uint8_t CHx,uint8_t cmd_wr,uint8_t addr,uint32_t da);
  126. void init_HT7032_DEV(uint8_t CHx);
  127. /*********************************************************************************************************
  128. * 内部函数实现
  129. *********************************************************************************************************/
  130. /*********************************************************************************************************
  131. * 函数名称:init_HT7032_SPI
  132. * 函数功能:初始化与HT7032通信的SPI模块,不采用DMA方式
  133. * 输入参数:void
  134. * 输出参数:void
  135. * 返 回 值:void
  136. * 创建日期:2024年04月20日
  137. * 注 意:
  138. *********************************************************************************************************/
  139. void init_HT7032_SPI(void)
  140. {
  141. HT7032_SPI_config();
  142. }
  143. /*********************************************************************************************************
  144. * 函数名称:HT7032_SPI_config
  145. * 函数功能:配置与HT7032通信的SPI端口
  146. * 输入参数:void
  147. * 输出参数:void
  148. * 返 回 值:void
  149. * 创建日期:2024年04月20日
  150. * 注 意:
  151. *********************************************************************************************************/
  152. void HT7032_SPI_config(void)
  153. {
  154. /* deinitilize SPI and the parameters */
  155. spi_parameter_struct spi_init_struct;
  156. /* peripheral clock enable */
  157. rcu_periph_clock_enable(HT7032_SPI_RCU);
  158. rcu_periph_clock_enable(HT7032_IRQ_RCU);
  159. /*SPI0 GPIO config */
  160. gpio_mode_set(HT7032_SPI_IO, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, HT7032_SPI_SCLK | HT7032_SPI_MOSI);
  161. gpio_output_options_set(HT7032_SPI_IO,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,HT7032_SPI_SCLK | HT7032_SPI_MOSI);//设置GPIO输出模式及速度
  162. gpio_mode_set(HT7032_SPI_IO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, HT7032_SPI_MISO); //
  163. gpio_mode_set(HT7032_SPI_IO, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, HT7032_SPI_CS0 | HT7032_SPI_CS1 | HT7032_SPI_CS2); //配置为输出
  164. gpio_output_options_set(HT7032_SPI_IO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, HT7032_SPI_CS0 | HT7032_SPI_CS1 | HT7032_SPI_CS2); //设置GPIO输出模式及速度
  165. gpio_mode_set(HT7032_IRQ_IO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, HT7032_IRQ0 | HT7032_IRQ1 | HT7032_IRQ2);
  166. SPI_CS0_H;
  167. SPI_CS1_H;
  168. SPI_CS2_H;
  169. init_HT7032_DEV(HT7032_CH0);
  170. init_HT7032_DEV(HT7032_CH1);
  171. init_HT7032_DEV(HT7032_CH2);
  172. }
  173. /*********************************************************************************************************
  174. * 函数名称:HT7032_Wr_Rd_Reg
  175. * 函数功能:主机读写HT7032的SPI端口
  176. * 输入参数:CHx片选:CSx;cmd_wr操作命令:1:写,0:读; addr寄存器地址;da数据:写操作时有效。
  177. * 输出参数:uint32_t,相应寄存器地址里的值
  178. * 返 回 值:uint32_t
  179. * 创建日期:2024年04月20日
  180. * 注 意:
  181. *********************************************************************************************************/
  182. uint32_t HT7032_Wr_Rd_Reg(uint8_t CHx,uint8_t cmd_wr,uint8_t addr,uint32_t da)
  183. {
  184. bool temp_flag = false;
  185. uint16_t i = 0;
  186. uint8_t temp_buff = 0;
  187. uint32_t temp_d0 = 0;
  188. SPI_CS0_H;
  189. SPI_CS1_H;
  190. SPI_CS2_H;
  191. SPI_Delay();
  192. SPI_SCLK_L;
  193. SPI_Delay();
  194. switch(CHx)
  195. {
  196. case HT7032_CH0:
  197. {
  198. SPI_CS0_L;
  199. temp_flag = true;
  200. break;
  201. }
  202. case HT7032_CH1:
  203. {
  204. SPI_CS1_L;
  205. temp_flag = true;
  206. break;
  207. }
  208. case HT7032_CH2:
  209. {
  210. SPI_CS2_L;
  211. temp_flag = true;
  212. break;
  213. }
  214. default:
  215. {
  216. temp_flag = false;
  217. break;
  218. }
  219. }
  220. SPI_Delay();
  221. SPI_Delay();
  222. if(temp_flag)
  223. {
  224. temp_buff = addr;
  225. if(cmd_wr == CMD_write)
  226. {
  227. temp_buff |= 0x80;
  228. Write_SPI_IO(temp_buff,da);
  229. }
  230. else
  231. {
  232. temp_d0 = Read_SPI_IO(temp_buff);
  233. }
  234. }
  235. SPI_CS0_H;
  236. SPI_CS1_H;
  237. SPI_CS2_H;
  238. for(i = 0;i< 100;i++)
  239. {
  240. SPI_Delay();
  241. }
  242. return temp_d0;
  243. }
  244. /*********************************************************************************************************
  245. * 函数名称:init_HT7032_DEV
  246. * 函数功能:初始化HT7032设备x
  247. * 输入参数:CHx:第x个设备
  248. * 输出参数:void
  249. * 返 回 值:void
  250. * 创建日期:2024年04月20日
  251. * 注 意:
  252. *********************************************************************************************************/
  253. void init_HT7032_DEV(uint8_t CHx)
  254. {
  255. uint32_t temp0 = 0;
  256. uint32_t temp1 = 0;
  257. uint32_t temp2 = 0;
  258. temp2 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_EnRdCali, ~0x0000005A);
  259. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_read,HT7032_r_DeviceID,0);
  260. temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_read,HT7032_r_DeviceID,0);//0x7122A0
  261. //temp0 = HT7032_Wr_Rd_Reg(CHx,CMD_read,HT7032_r_ChipID,0);
  262. temp0 = HT7032_Wr_Rd_Reg(CHx,CMD_read,HT7032_r_ChipID,0);//0x7022E0
  263. if((temp1 == HT7032_DeviceID) && (temp0 == HT7032_ChipID))
  264. {
  265. HT7032_DevOK_flag[CHx] = 1;
  266. //开启写校表参数//
  267. temp2 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_EnWrCali, 0x0000005A);
  268. //校表参数配置,配置都是一样的,HT7032设备//
  269. temp2 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_ModeCfg,0x0000b87e);
  270. //ADC增益选择,默认值//
  271. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_PGACtrl,0x00000000);
  272. //EMU 单元配置,默认值,ADC滤波选择//
  273. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_EMUCfg,0x00000000);
  274. //功率增益补偿选择,默认值//
  275. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_PgainA,0x00000000);
  276. //相位校正,默认值//
  277. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_PhSregApq0,0x00000000);
  278. //功率 offset校正,默认值//
  279. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_PoffsetA,0x00000000);
  280. //基波无功相位校正,默认值//
  281. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_QPhscal,0x00000000);
  282. //电压增益校正校正,默认值//
  283. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_UgainA,0x00000000);
  284. //电流增益校正校正,默认值//
  285. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_IgainA,0x00000000);
  286. //起动电流设置,默认值//
  287. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_Istartup,0x00000000);
  288. //高频脉冲常数设置,默认值//
  289. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_HFConst,0x00000000);
  290. //失压阈值设置,默认值//
  291. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_FailVolt,0x00000000);
  292. //有效值 offset 校正,默认值//
  293. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_URmsoffsetA,0x00000000);
  294. //ADC offset 校正,默认值//
  295. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_UoffsetA,0x00000000);
  296. //中断使能寄存器,默认值//
  297. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_EMUIE,0x00000001);
  298. //模拟模块使能寄存器,默认值//
  299. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_ModuleCfg,0x00000000);
  300. //全通道增益寄存器,默认值//
  301. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_AllGain,0x00000000);
  302. //脉冲加倍寄存器,默认值//
  303. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_HFDouble,0x00000000);
  304. //基波增益寄存器,默认值//
  305. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_LineGain,0x00000000);
  306. //IO 状态配置寄存器,默认值,均为上拉//
  307. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_PinCtrl,0x00000000);
  308. //起动功率寄存器,默认值//
  309. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_Pstartup,0x00000000);
  310. //相位补偿区域设置寄存器,默认值//
  311. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_Iregion1,0x00000000);
  312. //SAG 过流检测数据长度设置寄存器,默认值//
  313. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_Cyclength,0x00000000);
  314. //SAG 检测阈值设置寄存器,默认值//
  315. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_SAGLevel,0x00000000);
  316. //过流检测阈值设置寄存器,默认值//
  317. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_OILevel,0x00000000);
  318. //自动温度补偿相关寄存器,默认值//
  319. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_TPSoffset,0x00000000);
  320. //Tgain校正寄存器,默认值//
  321. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_TPSgain,0x00000000);
  322. //Vrefgain的补偿曲线系数,默认值//
  323. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_TCoffA,0x00000000);
  324. //算法控制寄存器,默认值//
  325. //temp1 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_EMCfg,0x00000000);
  326. //关闭写校表参数//
  327. temp2 = HT7032_Wr_Rd_Reg(CHx,CMD_write,HT7032_w_EnWrCali, ~0x0000005A);
  328. }
  329. else
  330. {
  331. HT7032_DevOK_flag[CHx] = 0;
  332. }
  333. }
  334. /*********************************************************************************************************
  335. 功能描述:读取计量参数
  336. 输入参数:CHx:第x个设备;addr:寄存器地址;*pBuff:缓存
  337. 返回参数:
  338. 函数说明:
  339. *********************************************************************************************************/
  340. uint32_t Get_MeterPara_value(uint8_t CHx,uint8_t addr)
  341. {
  342. uint32_t pBuff;
  343. pBuff = HT7032_Wr_Rd_Reg(CHx,CMD_read,addr, 0x00000000);
  344. return pBuff;
  345. }
  346. /*********************************************************************************************************
  347. * 函数名称:Read_SPI_IO
  348. * 函数功能:对SPI接口进行读操作
  349. * 输入参数:addr:外设寄存器地址
  350. * 输出参数:uint32_t,实际是24位有效值
  351. * 返 回 值:uint32_t
  352. * 创建日期:2024年04月20日
  353. * 注 意:
  354. *********************************************************************************************************/
  355. uint32_t Read_SPI_IO(uint8_t addr)
  356. {
  357. uint8_t i;
  358. uint32_t temp = 0;
  359. addr &= 0x7F;
  360. SPI_Delay();
  361. for(i = 0;i < 8;i++)
  362. {
  363. SPI_SCLK_H;
  364. if (addr & 0x80)
  365. {
  366. SPI_MOSI_H;
  367. }
  368. else
  369. {
  370. SPI_MOSI_L;
  371. }
  372. addr <<= 1;
  373. SPI_Delay();
  374. SPI_SCLK_L;
  375. SPI_Delay();
  376. }
  377. SPI_Delay();
  378. SPI_Delay();
  379. SPI_Delay();
  380. SPI_Delay();
  381. SPI_Delay();
  382. SPI_Delay();
  383. for(i = 0;i < 24;i++)
  384. {
  385. temp = temp << 1;
  386. SPI_SCLK_H;
  387. SPI_Delay();
  388. SPI_SCLK_L;
  389. SPI_Delay();
  390. if (SPI_MISO() > 0)
  391. {
  392. temp |= 0x01;
  393. }
  394. SPI_Delay();
  395. }
  396. SPI_Delay();
  397. return temp;
  398. }
  399. /*********************************************************************************************************
  400. * 函数名称:Write_SPI_IO
  401. * 函数功能:对SPI接口进行写操作
  402. * 输入参数:addr:外设寄存器地址;da:写入的数据,实际是24位有效值
  403. * 输出参数:
  404. * 返 回 值:
  405. * 创建日期:2024年04月20日
  406. * 注 意:
  407. *********************************************************************************************************/
  408. void Write_SPI_IO(uint8_t addr, uint32_t da)
  409. {
  410. uint8_t i;
  411. addr |= 0x80;
  412. //SPI_Delay();
  413. //SPI_SCLK_L;
  414. //SPI_Delay();
  415. for(i = 0;i < 8;i++)
  416. {
  417. SPI_Delay();
  418. SPI_SCLK_H;
  419. if (addr & 0x80)
  420. {
  421. SPI_MOSI_H;
  422. }
  423. else
  424. {
  425. SPI_MOSI_L;
  426. }
  427. SPI_Delay();
  428. addr <<= 1;
  429. SPI_SCLK_L;
  430. }
  431. for(i = 0;i < 24;i++)
  432. {
  433. SPI_Delay();
  434. SPI_SCLK_H;
  435. if(da & 0x800000)
  436. {
  437. SPI_MOSI_H;
  438. }
  439. else
  440. {
  441. SPI_MOSI_L;
  442. }
  443. da <<= 1;
  444. SPI_Delay();
  445. SPI_SCLK_L;
  446. }
  447. SPI_Delay();
  448. }
  449. /*********************************************************************************************************
  450. * 函数名称:SPI_Delay
  451. * 函数功能:延时
  452. * 输入参数:
  453. * 输出参数:
  454. * 返 回 值:
  455. * 创建日期:2024年04月20日
  456. * 注 意:
  457. *********************************************************************************************************/
  458. void SPI_Delay(void)
  459. {
  460. static uint16_t i = 750;
  461. while(i > 0)
  462. {
  463. i--;
  464. }
  465. }