spi_master.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. /************************************************************************
  2. Project: Welling Motor Control Paltform
  3. Filename: spi_master.c
  4. Partner Filename: spi_master.h
  5. Description: SPI master driver
  6. Complier: IAR Embedded Workbench for ARM 8.40.2
  7. CPU TYPE : GD32F30x
  8. *************************************************************************
  9. Copyright (c) 2022 Welling Motor Technology(Shanghai) Co. Ltd.
  10. All rights reserved.
  11. *************************************************************************
  12. *************************************************************************
  13. Revising History (ECL of this file):
  14. ************************************************************************/
  15. /************************************************************************
  16. Beginning of File, do not put anything above here except notes
  17. Compiler Directives:
  18. *************************************************************************/
  19. #ifndef _SPI_MASTER_C_
  20. #define _SPI_MASTER_C_
  21. #endif
  22. /************************************************************************
  23. Included File
  24. *************************************************************************/
  25. #include "user.h"
  26. #include "spi_master.h"
  27. #include "api_rt.h"
  28. /*************************************************************************
  29. Exported Functions (N/A)
  30. *************************************************************************/
  31. /*************************************************************************
  32. Function:
  33. Description:
  34. Call by:
  35. Input Variables:
  36. Output/Return Variables:
  37. Subroutine Call:
  38. Reference:
  39. *************************************************************************/
  40. void spi_voResolverInit(void)
  41. {
  42. spi_stResolverOut.uwSpiThetaTmpZ1Pu = 0;
  43. spi_stResolverOut.swSpdLpfTmpPu = 0;
  44. spi_stResolverOut.swSpdLpfTmpZ1Pu = 0;
  45. spi_stResolverOut.uwSpiThetaPu = 0;
  46. spi_stResolverOut.uwSpiOrignData = 0;
  47. spi_stResolverOut.slPllThetaPu = 0;
  48. spi_stResolverOut.uwPllThetaPu = 0;
  49. spi_stResolverOut.slThetaErrPu = 0;
  50. spi_stResolverOut.slThetaErrZ1Pu = 0;
  51. spi_stResolverOut.slThetaDeltaErrPu = 0;
  52. spi_stResolverOut.swSpdFbkPu = 0;
  53. spi_stResolverOut.swPllSpdFbkPu = 0;
  54. spi_stResolverOut.slPllSpdFbkPu = 0;
  55. spi_stResolverOut.swSpdFbkLpfPu = 0;
  56. }
  57. /*************************************************************************
  58. Function:
  59. Description:
  60. Call by:
  61. Input Variables:
  62. Output/Return Variables:
  63. Subroutine Call:
  64. Reference:
  65. *************************************************************************/
  66. void spi_voResolverCoef(SPI_RESOLVER_COEFIN *in, SPI_RESOLVER_COEF *out)
  67. {
  68. UWORD uwMvcPu;
  69. ULONG ulDamper;
  70. UWORD uwDamper;
  71. if (in->uwFbHz < 10)
  72. {
  73. in->uwFbHz = 10;
  74. }
  75. else if (in->uwFbHz > 10000)
  76. {
  77. in->uwFbHz = 10000;
  78. }
  79. else
  80. {
  81. //do noting
  82. }
  83. if (in->uwFreqTbcHz < 10)
  84. {
  85. in->uwFreqTbcHz = 10;
  86. }
  87. if (in->uwSpdPllMcoef > 100)
  88. {
  89. in->uwSpdPllMcoef = 100;
  90. }
  91. out->uwCurTs = (UWORD)(((ULONG)in->uwFbHz << 10) / in->uwFreqTbcHz); // Q10, TBC time
  92. out->uwCurTsPu = (UWORD)(((ULONG)205887 * in->uwFbHz) / in->uwFreqTbcHz); // Q15, Q15(2pi)-->205887
  93. // /************************Speed PLL Coefficient*****************************/
  94. // out->uwSpdPllKpPu = in->uwSpdPllKpPu; //Q14
  95. // out->uwSpdPllKiPu = in->uwSpdPllKiPu; //Q14
  96. /************************Speed PLL Coefficient*****************************/
  97. uwMvcPu = (UWORD)(((ULONG)in->uwSpdPllWvcHz << 10) / in->uwFbHz); // Q10
  98. /* PLL Kp=M*w/sqrt(1+M^2) */
  99. ulDamper = (1 + in->uwSpdPllMcoef * in->uwSpdPllMcoef) << 8; // Q8
  100. uwDamper = (UWORD)mth_slSqrt((SLONG)ulDamper); // Q4
  101. if(uwDamper == 0)
  102. {
  103. uwDamper = 1;
  104. }
  105. out->uwSpdPllKpPu = (UWORD)(((ULONG)in->uwSpdPllMcoef * uwMvcPu / uwDamper) << 8); // Q10-Q4+Q8=Q14
  106. /* PLL Ki=w^2*T_cnt_ctrl/sqrt(1+M^2) */
  107. out->uwSpdPllKiPu = (UWORD)(((((ULONG)uwMvcPu * out->uwCurTsPu) / uwDamper) * uwMvcPu) >> 17); // Q10+Q15-Q4+Q10-Q17=Q14
  108. }
  109. /*************************************************************************
  110. Function:
  111. Description:
  112. Call by:
  113. Input Variables:
  114. Output/Return Variables:
  115. Subroutine Call:
  116. Reference:
  117. *************************************************************************/
  118. void spi_voMagneticDetection(void)
  119. {
  120. UWORD MGL, MGH;
  121. MGL = (UWORD)gpio_input_bit_get(GPIOB, GPIO_PIN_0);
  122. MGH = (UWORD)gpio_input_bit_get(GPIOB, GPIO_PIN_1);
  123. if ((MGL != 0) || (MGH != 0))
  124. {
  125. spi_stResolverOut.blMagRangeFltFlg = TRUE; // ! can not indicate magnet range fault
  126. }
  127. else
  128. {
  129. spi_stResolverOut.blMagRangeFltFlg = FALSE;
  130. }
  131. }
  132. /*************************************************************************
  133. Function:
  134. Description:
  135. Call by:
  136. Input Variables:
  137. Output/Return Variables:
  138. Subroutine Call:
  139. Reference:
  140. *************************************************************************/
  141. static SLONG spi_pvt_slSpdFbkLpfPu, spi_pvt_slSpdLpfTmpPu;
  142. void spi_voResolver(const SPI_RESOLVER_COEF *coef, SPI_RESOLVER_OUT *out)
  143. {
  144. UWORD uwSpiThetaTmpPu = 0, uwSpiThetaTmpPu2 = 0;
  145. SWORD swThetaErrPu = 0, swThetaCompPu = 0;
  146. SWORD swSpdTmpPu = 0, swSpdErrPu = 0;
  147. ULONG ulTmp1 = 0, ulTmp2 = 0;
  148. if (spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE) == SET)
  149. {
  150. uwSpiThetaTmpPu = (UWORD)(((ULONG)(spi_i2s_data_receive(SPI2))) >> 1);
  151. uwSpiThetaTmpPu &= 0x7FF8;
  152. uwSpiThetaTmpPu2 = uwSpiThetaTmpPu;
  153. swThetaCompPu = (SWORD)(((SLONG)out->swSpdLpfTmpPu * TLatency_TM) >> 10); // Q15, Consider decoding and SPI Latency:10us
  154. ulTmp1 = uwSpiThetaTmpPu + swThetaCompPu + out->swSpiThetaOffsetPu + cof_sl720DegreePu;
  155. uwSpiThetaTmpPu = (UWORD)(ulTmp1 & 0x7FFF);
  156. ulTmp2 = uwSpiThetaTmpPu2 + cof_sl720DegreePu;
  157. uwSpiThetaTmpPu2 = (UWORD)(ulTmp2 & 0x7FFF);
  158. out->uwSpiOrignData = uwSpiThetaTmpPu2;
  159. /* Calculate speed: Differentiation method */
  160. swThetaErrPu = (SWORD)uwSpiThetaTmpPu - (SWORD)out->uwSpiThetaTmpZ1Pu;
  161. out->uwSpiThetaTmpZ1Pu = uwSpiThetaTmpPu;
  162. if (swThetaErrPu <= -cof_sl180DegreePu)
  163. {
  164. swThetaErrPu = (SWORD)(swThetaErrPu + cof_sl360DegreePu);
  165. }
  166. if (swThetaErrPu >= cof_sl180DegreePu)
  167. {
  168. swThetaErrPu = (SWORD)(swThetaErrPu - cof_sl360DegreePu);
  169. }
  170. swSpdTmpPu = (SWORD)(((SLONG)swThetaErrPu * DIFF_COEF_TBC) >> 10); // Q15
  171. /* Judge the correctness of spi position*/
  172. spi_pvt_slSpdLpfTmpPu = (SLONG)0x0277 * (swSpdTmpPu - out->swSpdLpfTmpPu) + spi_pvt_slSpdLpfTmpPu; // 50Hz Q30
  173. out->swSpdLpfTmpPu = (SWORD)(spi_pvt_slSpdLpfTmpPu >> 15);
  174. swSpdErrPu = out->swSpdLpfTmpPu - out->swSpdLpfTmpZ1Pu;
  175. out->swSpdLpfTmpZ1Pu = out->swSpdLpfTmpPu;
  176. if ((swSpdErrPu < USER_MOTOR_1000RPM2PU) && (swSpdErrPu > -USER_MOTOR_1000RPM2PU))
  177. {
  178. out->uwSpiThetaPu = uwSpiThetaTmpPu;
  179. out->blSpiThetaFltFlg = FALSE;
  180. }
  181. else
  182. {
  183. out->blSpiThetaFltFlg = TRUE;
  184. }
  185. }
  186. else
  187. {
  188. out->blSpiThetaFltFlg = TRUE;
  189. }
  190. out->swSpdFbkPu = swSpdTmpPu;
  191. /*Calculate speed: PLL method*/
  192. SLONG slThetaErrPu,slThetaDeltaErrPu,slPllThetaPu;
  193. SLONG slKpTmpPu,slKitTmpPu,slPllSpdFbkPu;
  194. ULONG ulSpdPllKpPu,ulSpdPllKiPu;
  195. slThetaErrPu = (SLONG)out->uwSpiThetaPu - (out->uwPllThetaPu + (((SLONG)out->swPllSpdFbkPu * coef->uwCurTs) >> 10)); //Q15
  196. if (slThetaErrPu >= cof_sl180DegreePu)
  197. {
  198. slThetaErrPu-= cof_sl360DegreePu;
  199. }
  200. if(slThetaErrPu <= -cof_sl180DegreePu)
  201. {
  202. slThetaErrPu += cof_sl360DegreePu;
  203. }
  204. slThetaDeltaErrPu = slThetaErrPu - out->slThetaErrZ1Pu;
  205. out->slThetaErrZ1Pu = slThetaErrPu;
  206. /* Variable parameter PI,untested*/
  207. // if(out->swPllSpdFbkPu < cof_uw1000RpmPu - cof_uw200RpmPu)
  208. // {
  209. // ulSpdPllKpPu = coef->uwSpdPllKpPu;
  210. // ulSpdPllKiPu = coef->uwSpdPllKiPu;
  211. // }
  212. // else if((out->swPllSpdFbkPu > cof_uw1000RpmPu) && (out->swPllSpdFbkPu < cof_uw2000RpmPu - cof_uw200RpmPu))
  213. // {
  214. // ulSpdPllKpPu = coef->uwSpdPllKpPu * 2;
  215. // ulSpdPllKiPu = coef->uwSpdPllKiPu * 2 * 2;
  216. // }
  217. // else if((out->swPllSpdFbkPu > cof_uw2000RpmPu) && (out->swPllSpdFbkPu < cof_uw3000RpmPu - cof_uw200RpmPu))
  218. // {
  219. // ulSpdPllKpPu = coef->uwSpdPllKpPu * 4;
  220. // ulSpdPllKiPu = coef->uwSpdPllKiPu * 4 * 4;
  221. // }
  222. // else if((out->swPllSpdFbkPu > cof_uw3000RpmPu) && (out->swPllSpdFbkPu < cof_uw4000RpmPu - cof_uw200RpmPu))
  223. // {
  224. // ulSpdPllKpPu = coef->uwSpdPllKpPu * 8;
  225. // ulSpdPllKiPu = coef->uwSpdPllKiPu * 8 * 8;
  226. // }
  227. // else if (out->swPllSpdFbkPu > cof_uw4000RpmPu)
  228. // {
  229. // ulSpdPllKpPu = coef->uwSpdPllKpPu * 16;
  230. // ulSpdPllKiPu = coef->uwSpdPllKiPu * 16 * 16;
  231. // }
  232. ulSpdPllKpPu = coef->uwSpdPllKpPu;
  233. ulSpdPllKiPu = coef->uwSpdPllKiPu;
  234. slKpTmpPu = slThetaDeltaErrPu * (SLONG)ulSpdPllKpPu; //Q15+Q14=Q29
  235. slKitTmpPu = slThetaErrPu * (SLONG)ulSpdPllKiPu;
  236. slPllSpdFbkPu = slKpTmpPu + slKitTmpPu + out->slPllSpdFbkPu;
  237. if(slPllSpdFbkPu >= 0x20000000)
  238. {
  239. slPllSpdFbkPu = 0x20000000-1; //Q29
  240. }
  241. if(slPllSpdFbkPu <= -0x20000000)
  242. {
  243. slPllSpdFbkPu = -0x20000000; //Q29
  244. }
  245. out->slPllSpdFbkPu = slPllSpdFbkPu; //Q29
  246. out->swPllSpdFbkPu = (SWORD)(slPllSpdFbkPu >> 14); //Q15
  247. slPllThetaPu = out->slPllThetaPu + (((SLONG)out->swPllSpdFbkPu * coef->uwCurTs) << 4); //Q15+Q10+Q4=Q29
  248. if(slPllThetaPu >= 0x20000000)
  249. {
  250. slPllThetaPu -= 0x20000000;
  251. }
  252. if(slPllThetaPu < 0)
  253. {
  254. slPllThetaPu += 0x20000000;
  255. }
  256. out->slPllThetaPu = slPllThetaPu;
  257. out->uwPllThetaPu = (UWORD)((ULONG)slPllThetaPu >> 14); //Q15 = Q29 - Q14
  258. // spi_pvt_slSpdFbkLpfPu = (SLONG)0x00FF * (out->swPllSpdFbkPu - out->swSpdFbkLpfPu) + spi_pvt_slSpdFbkLpfPu; //20Hz Q30
  259. // out->swSpdFbkLpfPu = spi_pvt_slSpdFbkLpfPu >> 15;
  260. }
  261. /*************************************************************************
  262. Function:
  263. Description:
  264. Call by:
  265. Input Variables:
  266. Output/Return Variables:
  267. Subroutine Call:
  268. Reference:
  269. *************************************************************************/
  270. void spi_voResolverLock(void)
  271. {
  272. /* CS signal enable */
  273. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
  274. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
  275. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TBE) != SET)
  276. {}
  277. spi_i2s_data_transmit(SPI2,0x0550);
  278. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TRANS) != RESET)
  279. {}
  280. /* CS signal disable */
  281. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
  282. }
  283. /*************************************************************************
  284. Function:
  285. Description:
  286. Call by:
  287. Input Variables:
  288. Output/Return Variables:
  289. Subroutine Call:
  290. Reference:
  291. *************************************************************************/
  292. void spi_voReadWriteSeneorReg(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
  293. {
  294. UWORD uwReadBCTReg = 0, uwReadETXY = 0;
  295. UWORD uwWriteBCTReg = 0, uwWriteETXY = 0, uwWriteRD = 0;
  296. UWORD SPI_DelayCnt1 = 0, SPI_DelayCnt2 = 0;
  297. /* Read the BCT register value */
  298. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel); /*!< CS signal enable,for data update */
  299. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TBE) != SET)
  300. {}
  301. spi_i2s_data_transmit(SPI2, 0x4200); //comp value
  302. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TRANS) != RESET)
  303. {}
  304. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
  305. while (spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE) != SET)
  306. {}
  307. uwReadBCTReg = spi_i2s_data_receive(SPI2); /*!< Read the first time */
  308. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
  309. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TBE) != SET)
  310. {}
  311. spi_i2s_data_transmit(SPI2, 0x0000); /*!< Write the second time */
  312. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TRANS) != RESET)
  313. {}
  314. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
  315. while (spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE) != SET)
  316. {}
  317. uwReadBCTReg = spi_i2s_data_receive(SPI2); /*!< Read the BCT register value */
  318. /* Read the ETX ETY value */
  319. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
  320. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TBE) != SET)
  321. {}
  322. spi_i2s_data_transmit(SPI2, 0x4300); //comp direction
  323. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TRANS) != RESET)
  324. {}
  325. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
  326. while (spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE) != SET)
  327. {}
  328. uwReadETXY = spi_i2s_data_receive(SPI2); /*!< Read the first time */
  329. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
  330. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TBE) != SET)
  331. {}
  332. spi_i2s_data_transmit(SPI2, 0x0000); /*!< Write the second time */
  333. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TRANS) != RESET)
  334. {}
  335. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
  336. while (spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE) != SET)
  337. {}
  338. uwReadETXY = spi_i2s_data_receive(SPI2); /*!< Read the ETX ETY value */
  339. if (uwReadBCTReg == 0x3000 && uwReadETXY == 0x0100)
  340. {
  341. spi_blReadRegCorrectFlg = TRUE;
  342. }
  343. else
  344. {
  345. spi_blReadRegCorrectFlg = FALSE;
  346. }
  347. /* Write MA702 BCT, EXY, RD Register */
  348. if ((spi_blReadRegCorrectFlg == FALSE) && (spi_blWriteRegFinishFlg == FALSE))
  349. //if (spi_blWriteRegFinishFlg == FALSE)
  350. {
  351. /* Write and Read BCT value*/
  352. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel); // Data update
  353. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TBE) != SET)// Discontinuous transmission, can not indicate send complete
  354. {}
  355. spi_i2s_data_transmit(SPI2, 0x8230); // LSB,BCT=48
  356. while (spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE) != SET)
  357. {}
  358. uwWriteBCTReg = spi_i2s_data_receive(SPI2);
  359. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
  360. /* Delay at least 22ms */
  361. while (SPI_DelayCnt2 < 20)
  362. {
  363. SPI_DelayCnt1++;
  364. if (SPI_DelayCnt1 == 10000)
  365. {
  366. SPI_DelayCnt2++;
  367. SPI_DelayCnt1 = 0;
  368. }
  369. }
  370. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
  371. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TBE) != SET)
  372. {}
  373. spi_i2s_data_transmit(SPI2, 0x0000);
  374. while (spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE) != SET)
  375. {}
  376. uwWriteBCTReg = spi_i2s_data_receive(SPI2);
  377. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
  378. /* Write and Read ETX or ETY */
  379. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
  380. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TBE) != SET)
  381. {}
  382. spi_i2s_data_transmit(SPI2, 0x8301);
  383. while (spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE) != SET)
  384. {}
  385. uwWriteETXY = spi_i2s_data_receive(SPI2);
  386. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
  387. /* Delay at least 22ms */
  388. SPI_DelayCnt2 = 0;
  389. while (SPI_DelayCnt2 < 20)
  390. {
  391. SPI_DelayCnt1++;
  392. if (SPI_DelayCnt1 == 10000)
  393. {
  394. SPI_DelayCnt2++;
  395. SPI_DelayCnt1 = 0;
  396. }
  397. }
  398. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
  399. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TBE) != SET)
  400. {}
  401. spi_i2s_data_transmit(SPI2, 0x0000);
  402. while (spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE) != SET)
  403. {}
  404. uwWriteETXY = spi_i2s_data_receive(SPI2);
  405. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
  406. /* Write and Read RD value*/
  407. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
  408. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TBE) != SET)
  409. {}
  410. spi_i2s_data_transmit(SPI2, 0x8980); // RD=1,Counterclockwise,8980; RD=0,Clockwise,8900
  411. while (spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE) != SET)
  412. {}
  413. uwWriteRD = spi_i2s_data_receive(SPI2);
  414. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
  415. /* Delay at least 22ms */
  416. SPI_DelayCnt2 = 0;
  417. while (SPI_DelayCnt2 < 20)
  418. {
  419. SPI_DelayCnt1++;
  420. if (SPI_DelayCnt1 == 10000)
  421. {
  422. SPI_DelayCnt2++;
  423. SPI_DelayCnt1 = 0;
  424. }
  425. }
  426. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
  427. while (spi_i2s_flag_get(SPI2, SPI_FLAG_TBE) != SET)
  428. {}
  429. spi_i2s_data_transmit(SPI2, 0x0000);
  430. while (spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE) != SET)
  431. {}
  432. uwWriteRD = spi_i2s_data_receive(SPI2);
  433. iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
  434. if (uwWriteBCTReg == 0x3000 && uwWriteETXY == 0x0100 && uwWriteRD == 0x8000) // MSB
  435. {
  436. spi_blWriteRegFinishFlg = TRUE; // Need stored in EEPROM
  437. }
  438. else
  439. {
  440. spi_blWriteRegFinishFlg = FALSE;
  441. }
  442. }
  443. }
  444. /*************************************************************************
  445. Local Functions (N/A)
  446. *************************************************************************/
  447. /*************************************************************************
  448. Copyright (c) 2022 Welling Motor Technology(Shanghai) Co. Ltd.
  449. All rights reserved.
  450. *************************************************************************/
  451. #ifdef _SPI_MASTER_C_
  452. #undef _SPI_MASTER_C_ /* parasoft-suppress MISRA2004-19_6 "本项目中无法更改,后续避免使用" */
  453. #endif
  454. /*************************************************************************
  455. End of this File (EOF)!
  456. Do not put anything after this part!
  457. *************************************************************************/