i2c_master.c 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567
  1. /************************************************************************
  2. Project: Welling Motor Control Paltform
  3. Filename: i2c_master.c
  4. Partner Filename: i2c_master.h
  5. Description: I2C 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. M0_20170410, by liyue, create this file;
  15. ************************************************************************/
  16. /************************************************************************
  17. Beginning of File, do not put anything above here except notes
  18. Compiler Directives:
  19. *************************************************************************/
  20. #ifndef _I2C_MASTER_C_
  21. #define _I2C_MASTER_C_
  22. #endif
  23. /************************************************************************
  24. Included File
  25. *************************************************************************/
  26. #include "i2c_master.h"
  27. #include "gd32f30x_dma.h"
  28. #include "api.h"
  29. /*************************************************************************
  30. Exported Functions (N/A)
  31. *************************************************************************/
  32. /*************************************************************************
  33. Function:
  34. Description:
  35. Call by:
  36. Input Variables:
  37. Output/Return Variables:
  38. Subroutine Call:
  39. Reference:
  40. *************************************************************************/
  41. static UWORD i2c_pvt_uwWaitCnt = 0, i2c_pvt_uwWaitCnt2 = 0;
  42. void i2c_voWaitEEReady(UBYTE SlaveAddr)
  43. {
  44. /* Wait at least 5ms */
  45. while (i2c_pvt_uwWaitCnt2 < 2)
  46. {
  47. i2c_pvt_uwWaitCnt++;
  48. if (i2c_pvt_uwWaitCnt == 10000)
  49. {
  50. i2c_pvt_uwWaitCnt2++;
  51. i2c_pvt_uwWaitCnt = 0;
  52. }
  53. }
  54. i2c_pvt_uwWaitCnt2 = 0;
  55. // /* GD MCU has ACK detect function */
  56. // ULONG ulTimeCnt = 0;
  57. // UWORD uwTimeoutNum = 0, uwTimeoutNum2;
  58. //
  59. // while(!I2C_EE_ComuFltFlg)
  60. // {
  61. // /* write to EEPROM enable*/
  62. // IO_WRITE2EE_ENABLE;
  63. // /* wait until I2C bus is idle */
  64. // while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && (++ulTimeCnt < I2C_SHORT_TIMEOUT));
  65. // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  66. // {
  67. // uwTimeoutNum ++;
  68. // }
  69. // ulTimeCnt = 0;
  70. // /* send a start condition to I2C bus */
  71. // i2c_start_on_bus(I2C0);
  72. // /* wait until SBSEND bit is set */
  73. // while((!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) && (++ulTimeCnt < I2C_SHORT_TIMEOUT));
  74. // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  75. // {
  76. // uwTimeoutNum ++;
  77. // }
  78. // ulTimeCnt = 0;
  79. // /* send slave address to I2C bus */
  80. // i2c_master_addressing(I2C0, SlaveAddr, I2C_TRANSMITTER);
  81. // /* wait until ADDSEND bit is set */
  82. // while((!((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) || (i2c_flag_get(I2C0, I2C_FLAG_AERR))))&& (++ulTimeCnt < I2C_SHORT_TIMEOUT));
  83. // if(ulTimeCnt < I2C_SHORT_TIMEOUT)
  84. // {
  85. // if(i2c_flag_get(I2C0, I2C_FLAG_ADDSEND))
  86. // {
  87. // ulTimeCnt = 0;
  88. // /* clear the bit of I2C_FLAG_ADDSEND */
  89. // i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
  90. // /* send a stop condition to I2C bus */
  91. // i2c_stop_on_bus(I2C0);
  92. // /* wait until stop condition generate */
  93. // while((I2C_CTL0(I2C0)&I2C_CTL0_STOP) && (++ulTimeCnt < I2C_SHORT_TIMEOUT));
  94. // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  95. // {
  96. // uwTimeoutNum ++;
  97. // }
  98. // ulTimeCnt = 0;
  99. // /* exit the function */
  100. // I2C_EE_ComuFltFlg = FALSE;
  101. // break;
  102. // }
  103. // else
  104. // {
  105. // /* clear the bit of I2C_FLAG_AERR */
  106. // i2c_flag_clear(I2C0, I2C_FLAG_AERR);
  107. // /* send a stop condition to I2C bus */
  108. // i2c_stop_on_bus(I2C0);
  109. // /* wait until stop condition generate */
  110. // while((I2C_CTL0(I2C0)&I2C_CTL0_STOP) && (++ulTimeCnt < I2C_SHORT_TIMEOUT));
  111. // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  112. // {
  113. // uwTimeoutNum ++;
  114. // }
  115. // ulTimeCnt = 0;
  116. // }
  117. // }
  118. // else
  119. // {
  120. // ulTimeCnt = 0;
  121. // uwTimeoutNum2 ++;
  122. // if(uwTimeoutNum2 > 4)
  123. // {
  124. // I2C_EE_ComuFltFlg = TRUE;
  125. // break;
  126. // }
  127. // }
  128. //
  129. // /* I2C communication timeout fault */
  130. // if(uwTimeoutNum > 3 )
  131. // {
  132. // I2C_EE_ComuFltFlg = TRUE;
  133. // }
  134. // }
  135. // /* write to EEPROM disable */
  136. // IO_WRITE2EE_DISABLE;
  137. }
  138. /*************************************************************************
  139. Function:
  140. Description:
  141. Call by:
  142. Input Variables:
  143. Output/Return Variables:
  144. Subroutine Call:
  145. Reference:
  146. *************************************************************************/
  147. void i2c_voDefaultWriteBuffer(void)
  148. {
  149. /* Parameter default value write*/
  150. UWORD *I2C_pBuffer;
  151. UBYTE i;
  152. I2C_pBuffer = &Syspara2.stMotorPara.uwPolePairs.uwDefault1;
  153. for (i = 0; i < I2C_MOTOR_PARA_N_WORDS; i++)
  154. {
  155. I2C_ubWriteBuffer[I2C_MOTOR_PARA_ARDDR + 2 * i] = (UBYTE)(*I2C_pBuffer >> 8);
  156. I2C_ubWriteBuffer[I2C_MOTOR_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*I2C_pBuffer);
  157. I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  158. }
  159. I2C_pBuffer = &Syspara2.stBikePara.uwWheelPerimeter.uwDefault1;
  160. for (i = 0; i < I2C_BIKE_PARA_N_WORDS; i++)
  161. {
  162. I2C_ubWriteBuffer[I2C_BIKE_PARA_ARDDR + 2 * i] = (UBYTE)(*I2C_pBuffer >> 8);
  163. I2C_ubWriteBuffer[I2C_BIKE_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*I2C_pBuffer);
  164. I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  165. }
  166. I2C_pBuffer = &Syspara2.stMControlPara.ParaFirstSetFlg.uwDefault1;
  167. for (i = 0; i < I2C_MCONTROL_PARA_N_WORDS; i++)
  168. {
  169. I2C_ubWriteBuffer[I2C_MCONTROL_PARA_ARDDR + 2 * i] = (UBYTE)(*I2C_pBuffer >> 8);
  170. I2C_ubWriteBuffer[I2C_MCONTROL_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*I2C_pBuffer);
  171. I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  172. }
  173. I2C_pBuffer = &Syspara2.stSensorPara.uwTorSensorOffsetOrigin.uwDefault1;
  174. for (i = 0; i < I2C_SENSOR_PARA_N_WORDS; i++)
  175. {
  176. I2C_ubWriteBuffer[I2C_SENSOR_PARA_ARDDR + 2 * i] = (UBYTE)(*I2C_pBuffer >> 8);
  177. I2C_ubWriteBuffer[I2C_SENSOR_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*I2C_pBuffer);
  178. I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  179. }
  180. I2C_pBuffer = &Syspara2.stAssistPara.uwStartupGain.uwDefault1;
  181. for (i = 0; i < I2C_ASSIST_PARA_N_WORDS; i++)
  182. {
  183. I2C_ubWriteBuffer[I2C_ASSIST_PARA_ARDDR + 2 * i] = (UBYTE)(*I2C_pBuffer >> 8);
  184. I2C_ubWriteBuffer[I2C_ASSIST_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*I2C_pBuffer);
  185. I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  186. }
  187. I2C_pWriteBuffer = I2C_ubWriteBuffer;
  188. I2C_ubWriteBuffer[I2C_MOTOR_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MOTOR_PARA_N_BYTES) >> 8);
  189. I2C_ubWriteBuffer[I2C_MOTOR_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MOTOR_PARA_N_BYTES));
  190. I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_BIKE_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  191. I2C_ubWriteBuffer[I2C_BIKE_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_BIKE_PARA_N_BYTES) >> 8);
  192. I2C_ubWriteBuffer[I2C_BIKE_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_BIKE_PARA_N_BYTES));
  193. I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_MCONTROL_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  194. I2C_ubWriteBuffer[I2C_MCONTROL_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MCONTROL_PARA_N_BYTES) >> 8);
  195. I2C_ubWriteBuffer[I2C_MCONTROL_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MCONTROL_PARA_N_BYTES));
  196. I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_SENSOR_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  197. I2C_ubWriteBuffer[I2C_SENSOR_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_SENSOR_PARA_N_BYTES) >> 8);
  198. I2C_ubWriteBuffer[I2C_SENSOR_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_SENSOR_PARA_N_BYTES));
  199. I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_ASSIST_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  200. I2C_ubWriteBuffer[I2C_ASSIST_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_ASSIST_PARA_N_BYTES) >> 8);
  201. I2C_ubWriteBuffer[I2C_ASSIST_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_ASSIST_PARA_N_BYTES));
  202. }
  203. /*************************************************************************
  204. Function:
  205. Description:
  206. Call by:
  207. Input Variables:
  208. Output/Return Variables:
  209. Subroutine Call:
  210. Reference:
  211. *************************************************************************/
  212. void i2c_voParaWriteBuffer(void)
  213. {
  214. /* Parameter real value write*/
  215. UWORD *I2C_pBuffer;
  216. UBYTE i;
  217. I2C_pBuffer = &Syspara2.stMotorPara.uwPolePairs.uwDefault1;
  218. for (i = 0; i < I2C_MOTOR_PARA_N_WORDS; i++)
  219. {
  220. I2C_ubWriteBuffer[I2C_MOTOR_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  221. I2C_ubWriteBuffer[I2C_MOTOR_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  222. I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  223. }
  224. I2C_pBuffer = &Syspara2.stBikePara.uwWheelPerimeter.uwDefault1;
  225. for (i = 0; i < I2C_BIKE_PARA_N_WORDS; i++)
  226. {
  227. I2C_ubWriteBuffer[I2C_BIKE_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  228. I2C_ubWriteBuffer[I2C_BIKE_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  229. I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  230. }
  231. I2C_pBuffer = &Syspara2.stMControlPara.ParaFirstSetFlg.uwDefault1;
  232. for (i = 0; i < I2C_MCONTROL_PARA_N_WORDS; i++)
  233. {
  234. I2C_ubWriteBuffer[I2C_MCONTROL_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  235. I2C_ubWriteBuffer[I2C_MCONTROL_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  236. I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  237. }
  238. I2C_pBuffer = &Syspara2.stSensorPara.uwTorSensorOffsetOrigin.uwDefault1;
  239. for (i = 0; i < I2C_SENSOR_PARA_N_WORDS; i++)
  240. {
  241. I2C_ubWriteBuffer[I2C_SENSOR_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  242. I2C_ubWriteBuffer[I2C_SENSOR_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  243. I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  244. }
  245. I2C_pBuffer = &Syspara2.stAssistPara.uwStartupGain.uwDefault1;
  246. for (i = 0; i < I2C_ASSIST_PARA_N_WORDS; i++)
  247. {
  248. I2C_ubWriteBuffer[I2C_ASSIST_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  249. I2C_ubWriteBuffer[I2C_ASSIST_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  250. I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  251. }
  252. I2C_pWriteBuffer = I2C_ubWriteBuffer;
  253. I2C_ubWriteBuffer[I2C_MOTOR_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MOTOR_PARA_N_BYTES) >> 8);
  254. I2C_ubWriteBuffer[I2C_MOTOR_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MOTOR_PARA_N_BYTES));
  255. I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_BIKE_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  256. I2C_ubWriteBuffer[I2C_BIKE_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_BIKE_PARA_N_BYTES) >> 8);
  257. I2C_ubWriteBuffer[I2C_BIKE_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_BIKE_PARA_N_BYTES));
  258. I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_MCONTROL_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  259. I2C_ubWriteBuffer[I2C_MCONTROL_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MCONTROL_PARA_N_BYTES) >> 8);
  260. I2C_ubWriteBuffer[I2C_MCONTROL_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MCONTROL_PARA_N_BYTES));
  261. I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_SENSOR_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  262. I2C_ubWriteBuffer[I2C_SENSOR_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_SENSOR_PARA_N_BYTES) >> 8);
  263. I2C_ubWriteBuffer[I2C_SENSOR_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_SENSOR_PARA_N_BYTES));
  264. I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_ASSIST_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  265. I2C_ubWriteBuffer[I2C_ASSIST_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_ASSIST_PARA_N_BYTES) >> 8);
  266. I2C_ubWriteBuffer[I2C_ASSIST_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_ASSIST_PARA_N_BYTES));
  267. }
  268. /*************************************************************************
  269. Function:
  270. Description:
  271. Call by:
  272. Input Variables:
  273. Output/Return Variables:
  274. Subroutine Call:
  275. Reference:
  276. *************************************************************************/
  277. void i2c_voHistoryWriteBuffer(void)
  278. {
  279. UWORD *I2C_pBuffer;
  280. UBYTE i;
  281. I2C_pBuffer = &Syspara2.stHistoryPara.uwAssModSelect.uwDefault1;
  282. for (i = 0; i < I2C_HISTORY_PARA_N_WORDS; i++)
  283. {
  284. I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  285. I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  286. I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  287. }
  288. I2C_pHistoryWriteBuffer = I2C_ubHistoyWriteBuffer;
  289. I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_HISTORY_PARA_N_BYTES) >> 8);
  290. I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_HISTORY_PARA_N_BYTES));
  291. }
  292. /*************************************************************************
  293. Function:
  294. Description:
  295. Call by:
  296. Input Variables:
  297. Output/Return Variables:
  298. Subroutine Call:
  299. Reference:
  300. *************************************************************************/
  301. //static void i2c_voByteWrite2EE(UBYTE SlaveAddr, UBYTE WriteAddr, UBYTE Data) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
  302. //{
  303. // ULONG ulTimeCnt = 0;
  304. // UWORD uwTimeoutNum = 0;
  305. //
  306. // if(!I2C_EE_ComuFltFlg)
  307. // {
  308. // /* write to EEPROM enable*/
  309. // IO_WRITE2EE_ENABLE;
  310. // /* wait until I2C bus is idle */
  311. // while((i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) != 0) && (ulTimeCnt< I2C_SHORT_TIMEOUT))
  312. // {
  313. // ulTimeCnt++;
  314. // }
  315. // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  316. // {
  317. // uwTimeoutNum ++;
  318. // }
  319. // ulTimeCnt = 0;
  320. // /* send a start condition to I2C bus */
  321. // i2c_start_on_bus(I2C0);
  322. // /* wait until SBSEND bit is set */
  323. // while((i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  324. // {
  325. // ulTimeCnt++;
  326. // }
  327. // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  328. // {
  329. // uwTimeoutNum ++;
  330. // }
  331. // ulTimeCnt = 0;
  332. // /* send slave address to I2C bus */
  333. // i2c_master_addressing(I2C0, SlaveAddr, I2C_TRANSMITTER);
  334. // /* wait until ADDSEND bit is set */
  335. // while((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  336. // {
  337. // ulTimeCnt++;
  338. // }
  339. // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  340. // {
  341. // uwTimeoutNum ++;
  342. // }
  343. // ulTimeCnt = 0;
  344. // i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
  345. // /* wait until the transmit data buffer is empty */
  346. // while((i2c_flag_get(I2C0, I2C_FLAG_TBE) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  347. // {
  348. // ulTimeCnt++;
  349. // }
  350. // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  351. // {
  352. // uwTimeoutNum ++;
  353. // }
  354. // ulTimeCnt = 0;
  355. // /* writeAddr transmission */
  356. // i2c_data_transmit(I2C0, WriteAddr);
  357. // /* wait until the BTC bit is set */
  358. // while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  359. // {
  360. // ulTimeCnt++;
  361. // }
  362. // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  363. // {
  364. // uwTimeoutNum ++;
  365. // }
  366. // ulTimeCnt = 0;
  367. // /* data transmission */
  368. // i2c_data_transmit(I2C0, Data);
  369. // /* wait until the BTC bit is set */
  370. // while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  371. // {
  372. // ulTimeCnt++;
  373. // }
  374. // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  375. // {
  376. // uwTimeoutNum ++;
  377. // }
  378. // ulTimeCnt = 0;
  379. // /* send a stop condition to I2C bus */
  380. // i2c_stop_on_bus(I2C0);
  381. // /* wait until stop condition generate */
  382. // while((I2C_CTL0(I2C0)&I2C_CTL0_STOP) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  383. // {
  384. // ulTimeCnt++;
  385. // }
  386. // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  387. // {
  388. // uwTimeoutNum ++;
  389. // }
  390. // ulTimeCnt = 0;
  391. // /* write to EEPROM disable */
  392. // IO_WRITE2EE_DISABLE;
  393. //
  394. // /* I2C EEPROM communication timeout fault */
  395. // if(uwTimeoutNum > 0)
  396. // {
  397. // I2C_EE_ComuFltFlg = TRUE;
  398. // }
  399. // }
  400. // else
  401. // {}
  402. //}
  403. /*************************************************************************
  404. Function:
  405. Description:
  406. Call by:
  407. Input Variables:
  408. Output/Return Variables:
  409. Subroutine Call:
  410. Reference:
  411. *************************************************************************/
  412. void i2c_voPageWrite2EE(const UBYTE *pBuffer, UBYTE SlaveAddr, UBYTE WriteAddr, UBYTE NBytesToWrite) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
  413. {
  414. ULONG ulTimeCnt = 0;
  415. UWORD uwTimeoutNum = 0;
  416. if(!I2C_EE_ComuFltFlg)
  417. {
  418. /* write to EEPROM enable*/
  419. IO_WRITE2EE_ENABLE;
  420. /* wait until I2C bus is idle */
  421. while((i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) != 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  422. {
  423. ulTimeCnt++;
  424. }
  425. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  426. {
  427. uwTimeoutNum ++;
  428. }
  429. ulTimeCnt = 0;
  430. /* send a start condition to I2C bus */
  431. i2c_start_on_bus(I2C0);
  432. /* wait until SBSEND bit is set */
  433. while((i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  434. {
  435. ulTimeCnt++;
  436. }
  437. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  438. {
  439. uwTimeoutNum ++;
  440. }
  441. ulTimeCnt = 0;
  442. /* send slave address to I2C bus */
  443. i2c_master_addressing(I2C0, SlaveAddr, I2C_TRANSMITTER);
  444. /* wait until ADDSEND bit is set */
  445. while((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  446. {
  447. ulTimeCnt++;
  448. }
  449. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  450. {
  451. uwTimeoutNum ++;
  452. }
  453. ulTimeCnt = 0;
  454. i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
  455. /* wait until the transmit data buffer is empty */
  456. while((i2c_flag_get(I2C0, I2C_FLAG_TBE) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  457. {
  458. ulTimeCnt++;
  459. }
  460. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  461. {
  462. uwTimeoutNum ++;
  463. }
  464. ulTimeCnt = 0;
  465. /* writeAddr transmission */
  466. i2c_data_transmit(I2C0, WriteAddr);
  467. /* wait until the BTC bit is set */
  468. while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  469. {
  470. ulTimeCnt++;
  471. }
  472. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  473. {
  474. uwTimeoutNum ++;
  475. }
  476. ulTimeCnt = 0;
  477. /* data transmission */
  478. while (NBytesToWrite != 0)
  479. {
  480. NBytesToWrite --;
  481. i2c_data_transmit(I2C0, *pBuffer);
  482. pBuffer++; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  483. /* wait until the BTC bit is set */
  484. while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  485. {
  486. ulTimeCnt++;
  487. }
  488. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  489. {
  490. uwTimeoutNum ++;
  491. }
  492. ulTimeCnt = 0;
  493. /* I2C communication timeout fault */
  494. if(uwTimeoutNum > 3 )
  495. {
  496. I2C_EE_ComuFltFlg = TRUE;
  497. break;
  498. }
  499. }
  500. /* send a stop condition to I2C bus */
  501. i2c_stop_on_bus(I2C0);
  502. /* wait until stop condition generate */
  503. while((I2C_CTL0(I2C0)&I2C_CTL0_STOP) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  504. {
  505. ulTimeCnt++;
  506. }
  507. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  508. {
  509. uwTimeoutNum ++;
  510. }
  511. ulTimeCnt = 0;
  512. /* I2C EEPROM communication timeout fault */
  513. if(uwTimeoutNum > 0)
  514. {
  515. I2C_EE_ComuFltFlg = TRUE;
  516. }
  517. /* write to EEPROM disable */
  518. IO_WRITE2EE_DISABLE;
  519. }
  520. else
  521. {}
  522. }
  523. /*************************************************************************
  524. Function:
  525. Description:
  526. Call by:
  527. Input Variables:
  528. Output/Return Variables:
  529. Subroutine Call:
  530. Reference:
  531. *************************************************************************/
  532. static void i2c_voBufferWrite2EE(const UBYTE *pBuffer, UBYTE SlaveAddr, UBYTE WriteAddr, UBYTE NBytesToWrite)
  533. {
  534. UBYTE ubNPages = 0, ubNSingleBytes = 0, ubAddr = 0, ubCnt = 0, ubTemp = 0;
  535. ubAddr = WriteAddr % I2C_EE_PAGESIZE_NBYTES;
  536. ubCnt = I2C_EE_PAGESIZE_NBYTES - ubAddr; // Cnt datas away from page alignment
  537. ubNPages = NBytesToWrite / I2C_EE_PAGESIZE_NBYTES;
  538. ubNSingleBytes = NBytesToWrite % I2C_EE_PAGESIZE_NBYTES;
  539. if (ubAddr == 0)
  540. {
  541. if (ubNPages == 0)
  542. {
  543. i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, ubNSingleBytes);
  544. i2c_voWaitEEReady(SlaveAddr);
  545. }
  546. else
  547. {
  548. while (ubNPages != 0)
  549. {
  550. ubNPages--;
  551. i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, I2C_EE_PAGESIZE_NBYTES);
  552. i2c_voWaitEEReady(SlaveAddr);
  553. WriteAddr += I2C_EE_PAGESIZE_NBYTES;
  554. pBuffer += I2C_EE_PAGESIZE_NBYTES; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  555. }
  556. if (ubNSingleBytes != 0)
  557. {
  558. i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, ubNSingleBytes);
  559. i2c_voWaitEEReady(SlaveAddr);
  560. }
  561. }
  562. }
  563. else
  564. {
  565. if (ubNPages == 0)
  566. {
  567. if (ubNSingleBytes > ubCnt)
  568. {
  569. ubTemp = ubNSingleBytes - ubCnt;
  570. i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, ubCnt);
  571. i2c_voWaitEEReady(SlaveAddr);
  572. WriteAddr += ubCnt;
  573. pBuffer += ubCnt; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  574. i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, ubTemp);
  575. i2c_voWaitEEReady(SlaveAddr);
  576. }
  577. else
  578. {
  579. i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, NBytesToWrite);
  580. i2c_voWaitEEReady(SlaveAddr);
  581. }
  582. }
  583. else
  584. {
  585. NBytesToWrite -= ubCnt;
  586. ubNPages = NBytesToWrite / I2C_EE_PAGESIZE_NBYTES;
  587. ubNSingleBytes = NBytesToWrite % I2C_EE_PAGESIZE_NBYTES;
  588. if (ubCnt != 0)
  589. {
  590. /* Write the remaining bytes of the page where WriteAddr is located */
  591. i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, ubCnt);
  592. i2c_voWaitEEReady(SlaveAddr);
  593. WriteAddr += ubCnt;
  594. pBuffer += ubCnt; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  595. }
  596. while (ubNPages != 0)
  597. {
  598. ubNPages--;
  599. i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, I2C_EE_PAGESIZE_NBYTES);
  600. i2c_voWaitEEReady(SlaveAddr);
  601. WriteAddr += I2C_EE_PAGESIZE_NBYTES;
  602. pBuffer += I2C_EE_PAGESIZE_NBYTES; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  603. }
  604. if (ubNSingleBytes != 0)
  605. {
  606. i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, I2C_EE_PAGESIZE_NBYTES);
  607. i2c_voWaitEEReady(SlaveAddr);
  608. }
  609. }
  610. }
  611. }
  612. /*************************************************************************
  613. Function:
  614. Description:
  615. Call by:
  616. Input Variables:
  617. Output/Return Variables:
  618. Subroutine Call:
  619. Reference:
  620. *************************************************************************/
  621. void i2c_voInfoWrite2EE(const I2C_TX_COF *coef, I2C_TX_OUT *out)
  622. {
  623. UBYTE ubNBytes;
  624. UBYTE ubReTX1;
  625. UBYTE ubSlaveAddr;
  626. UBYTE ubWriteAddr;
  627. ubNBytes = I2C_TX1_NBYTES;
  628. ubReTX1 = I2C_RETX1_TIMES;
  629. #if(ubReTX1 >= 2)
  630. ubReTX1 = 2;
  631. #endif
  632. ubWriteAddr = 0x00;
  633. ubSlaveAddr = I2C_SLAVEADDR_BLOCK1;
  634. while (ubReTX1 != 0)
  635. {
  636. ubReTX1--;
  637. I2C_pWriteBuffer = I2C_ubWriteBuffer;
  638. if (ubReTX1 == 1)
  639. {
  640. ubSlaveAddr = I2C_SLAVEADDR_BLOCK2;
  641. }
  642. if (ubReTX1 == 0)
  643. {
  644. ubSlaveAddr = I2C_SLAVEADDR_BLOCK1;
  645. }
  646. //i2c_voBufferWrite2EE(I2C_pWriteBuffer, ubSlaveAddr, ubWriteAddr, ubNBytes);
  647. iI2C_Write(0, ubSlaveAddr, ubWriteAddr, 8, I2C_pWriteBuffer, ubNBytes);
  648. }
  649. if ((ubReTX1 == 0) && (I2C_EE_ComuFltFlg != TRUE))
  650. {
  651. out->blTX1FinishFlg = TRUE;
  652. }
  653. else
  654. {
  655. out->blTX1FinishFlg = FALSE;
  656. }
  657. }
  658. /*************************************************************************
  659. Function:
  660. Description:
  661. Call by:
  662. Input Variables:
  663. Output/Return Variables:
  664. Subroutine Call:
  665. Reference:
  666. *************************************************************************/
  667. void i2c_voHistoryWrite2EE(const I2C_TX_COF *coef, I2C_TX_OUT *out)
  668. {
  669. UBYTE ubNBytes;
  670. UBYTE ubReTX2;
  671. UBYTE ubSlaveAddr;
  672. UBYTE ubWriteAddr;
  673. ubNBytes = I2C_TX2_NBYTES;
  674. ubReTX2 = I2C_RETX2_TIMES;
  675. #if(ubReTX2 >= 2)
  676. ubReTX2 = 2;
  677. #endif
  678. ubSlaveAddr = I2C_SLAVEADDR_BLOCK3;
  679. ubWriteAddr = 0x00;
  680. while (ubReTX2 != 0)
  681. {
  682. ubReTX2--;
  683. I2C_pHistoryWriteBuffer = I2C_ubHistoyWriteBuffer;
  684. if (ubReTX2 == 1)
  685. {
  686. ubSlaveAddr = I2C_SLAVEADDR_BLOCK4;
  687. }
  688. if (ubReTX2 == 0)
  689. {
  690. ubSlaveAddr = I2C_SLAVEADDR_BLOCK3;
  691. }
  692. //i2c_voBufferWrite2EE(I2C_pHistoryWriteBuffer, ubSlaveAddr, ubWriteAddr, ubNBytes);
  693. iI2C_Write(0, ubSlaveAddr, ubWriteAddr, 8, I2C_pHistoryWriteBuffer, ubNBytes);
  694. }
  695. if ((ubReTX2 == 0) && (I2C_EE_ComuFltFlg != TRUE))
  696. {
  697. out->blTX2FinishFlg = TRUE;
  698. }
  699. else
  700. {
  701. out->blTX2FinishFlg = FALSE;
  702. }
  703. }
  704. /*************************************************************************
  705. Function:
  706. Description:
  707. Call by:
  708. Input Variables:
  709. Output/Return Variables:
  710. Subroutine Call:
  711. Reference:
  712. *************************************************************************/
  713. void i2c_bus_reset(void)
  714. {
  715. i2c_deinit(I2C0);
  716. /* configure SDA/SCL for GPIO */
  717. GPIO_BC(GPIOB) |= GPIO_PIN_6;
  718. GPIO_BC(GPIOB) |= GPIO_PIN_7;
  719. gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
  720. gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
  721. __NOP();
  722. __NOP();
  723. __NOP();
  724. __NOP();
  725. __NOP();
  726. GPIO_BOP(GPIOB) |= GPIO_PIN_6;
  727. __NOP();
  728. __NOP();
  729. __NOP();
  730. __NOP();
  731. __NOP();
  732. GPIO_BOP(GPIOB) |= GPIO_PIN_7;
  733. /* connect I2C_SCL_PIN to I2C_SCL */
  734. /* connect I2C_SDA_PIN to I2C_SDA */
  735. gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
  736. gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
  737. /* configure the I2CX interface */
  738. /* configure I2C0 clock */
  739. i2c_clock_config(I2C0, 100000, I2C_DTCY_2);
  740. /* configure I2C0 address */
  741. i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C_SLAVEADDR_BLOCK1);
  742. /* enable acknowledge */
  743. i2c_ack_config(I2C0, I2C_ACK_ENABLE);
  744. // /* enable I2C0 DMA */
  745. // i2c_dma_config(I2C0, I2C_DMA_ON);
  746. /* enable I2C0 */
  747. i2c_enable(I2C0);
  748. }
  749. /*************************************************************************
  750. Function:
  751. Description:
  752. Call by:
  753. Input Variables:
  754. Output/Return Variables:
  755. Subroutine Call:
  756. Reference:
  757. *************************************************************************/
  758. // void i2c_voSysparaReadFromEE(I2C_RXCRC_OUT *out) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
  759. // {
  760. // UWORD timeout = 0;
  761. // UBYTE ubRdNBytes = 0, ubRdSlaveAddr = 0, ubRdAddr = 0;
  762. // UBYTE state = (UBYTE)I2C_START;
  763. // UBYTE read_cycle = 0;
  764. // UBYTE ubRdCnt = 2;
  765. // UBYTE i2c_timeout_flag = 0;
  766. // UBYTE *p_buffer;
  767. // while(ubRdCnt != 0)
  768. // {
  769. // ubRdCnt--;
  770. // if (ubRdCnt == 1)
  771. // {
  772. // ubRdSlaveAddr = I2C_SLAVEADDR_BLOCK1;
  773. // ubRdAddr = 0x00;
  774. // ubRdNBytes = I2C_RX1_NBYTES;
  775. // p_buffer = I2C_ubReadBuffer[0];
  776. // i2c_timeout_flag = 0;
  777. // }
  778. // else if (ubRdCnt == 0)
  779. // {
  780. // ubRdSlaveAddr = I2C_SLAVEADDR_BLOCK3;
  781. // ubRdAddr = 0x00;
  782. // ubRdNBytes = I2C_RX2_NBYTES;
  783. // p_buffer = I2C_ubReadBuffer[1];
  784. // i2c_timeout_flag = 0;
  785. // }
  786. // else
  787. // {
  788. // //do nothing
  789. // }
  790. // /* enable acknowledge */
  791. // i2c_ack_config(I2C0, I2C_ACK_ENABLE);
  792. // while(i2c_timeout_flag ==0)
  793. // {
  794. // switch(state)
  795. // {
  796. // case I2C_START:
  797. // if(RESET == read_cycle)
  798. // {
  799. // /* disable I2C0 */
  800. // i2c_disable(I2C0);
  801. // /* enable I2C0 */
  802. // i2c_enable(I2C0);
  803. // /* enable acknowledge */
  804. // i2c_ack_config(I2C0, I2C_ACK_ENABLE);
  805. // /* i2c master sends start signal only when the bus is idle */
  806. // while((i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) != 0) && (timeout < I2C_SHORT_TIMEOUT))
  807. // {
  808. // timeout++;
  809. // }
  810. // if(timeout < I2C_SHORT_TIMEOUT)
  811. // {
  812. // /* send the start signal */
  813. // i2c_start_on_bus(I2C0);
  814. // timeout = 0;
  815. // state = (UBYTE)I2C_SEND_ADDRESS;
  816. // }
  817. // else
  818. // {
  819. // i2c_bus_reset();
  820. // timeout = 0;
  821. // state = (UBYTE)I2C_START;
  822. // }
  823. // }
  824. // else
  825. // {
  826. // i2c_start_on_bus(I2C0);
  827. // timeout = 0;
  828. // state = (UBYTE)I2C_SEND_ADDRESS;
  829. // }
  830. // break;
  831. // case I2C_SEND_ADDRESS:
  832. // /* i2c master sends START signal successfully */
  833. // while((i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == 0) && (timeout < I2C_SHORT_TIMEOUT))
  834. // {
  835. // timeout++;
  836. // }
  837. // if(timeout < I2C_SHORT_TIMEOUT)
  838. // {
  839. // if(RESET == read_cycle)
  840. // {
  841. // i2c_master_addressing(I2C0, ubRdSlaveAddr, I2C_TRANSMITTER);
  842. // state = (UBYTE)I2C_CLEAR_ADDRESS_FLAG;
  843. // }
  844. // else
  845. // {
  846. // i2c_master_addressing(I2C0, ubRdSlaveAddr, I2C_RECEIVER);
  847. // state = (UBYTE)I2C_CLEAR_ADDRESS_FLAG;
  848. // }
  849. // timeout = 0;
  850. // }
  851. // else
  852. // {
  853. // timeout = 0;
  854. // state = (UBYTE)I2C_START;
  855. // read_cycle = 0;
  856. // }
  857. // break;
  858. // case I2C_CLEAR_ADDRESS_FLAG:
  859. // /* address flag set means i2c slave sends ACK */
  860. // while((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) == 0) && (timeout < I2C_SHORT_TIMEOUT))
  861. // {
  862. // timeout++;
  863. // }
  864. // if(timeout < I2C_SHORT_TIMEOUT)
  865. // {
  866. // i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
  867. // timeout = 0;
  868. // state = (UBYTE)I2C_TRANSMIT_DATA;
  869. // }
  870. // else
  871. // {
  872. // timeout = 0;
  873. // state = (UBYTE)I2C_START;
  874. // read_cycle = 0;
  875. // }
  876. // break;
  877. // case I2C_TRANSMIT_DATA:
  878. // if(RESET == read_cycle)
  879. // {
  880. // /* wait until the transmit data buffer is empty */
  881. // while((i2c_flag_get(I2C0, I2C_FLAG_TBE) == 0) && (timeout < I2C_SHORT_TIMEOUT))
  882. // {
  883. // timeout++;
  884. // }
  885. // if(timeout < I2C_SHORT_TIMEOUT)
  886. // {
  887. // /* send the EEPROM's internal address to write to : only one byte address */
  888. // i2c_data_transmit(I2C0, ubRdAddr);
  889. // timeout = 0;
  890. // }
  891. // else
  892. // {
  893. // timeout = 0;
  894. // state = (UBYTE)I2C_START;
  895. // read_cycle = 0;
  896. // }
  897. // /* wait until BTC bit is set */
  898. // while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (timeout < I2C_SHORT_TIMEOUT))
  899. // {
  900. // timeout++;
  901. // }
  902. // if(timeout < I2C_SHORT_TIMEOUT)
  903. // {
  904. // timeout = 0;
  905. // state = (UBYTE)I2C_START;
  906. // read_cycle++;
  907. // }
  908. // else
  909. // {
  910. // timeout = 0;
  911. // state = (UBYTE)I2C_START;
  912. // read_cycle = 0;
  913. // }
  914. // }
  915. // else
  916. // {
  917. // /* one byte master reception procedure (polling) */
  918. // if(ubRdNBytes < 2)
  919. // {
  920. // /* disable acknowledge */
  921. // i2c_ack_config(I2C0, I2C_ACK_DISABLE);
  922. // /* clear ADDSEND register by reading I2C_STAT0 then I2C_STAT1 register (I2C_STAT0 has already been read) */
  923. // i2c_flag_get(I2C0, I2C_FLAG_ADDSEND);
  924. // /* send a stop condition to I2C bus*/
  925. // i2c_stop_on_bus(I2C0);
  926. // /* wait for the byte to be received */
  927. // while(i2c_flag_get(I2C0, I2C_FLAG_RBNE) == 0)
  928. // {
  929. // // do nothing
  930. // }
  931. // /* read the byte received from the EEPROM */
  932. // *p_buffer = i2c_data_receive(I2C0);
  933. // /* decrement the read bytes counter */
  934. // ubRdNBytes--;
  935. // timeout = 0;
  936. // state = (UBYTE)I2C_STOP;
  937. // }
  938. // else
  939. // { /* more than one byte master reception procedure (DMA) */
  940. // dma_transfer_number_config(DMA0, DMA_CH6, ubRdNBytes);
  941. // DMA_CH6MADDR(DMA0) = (ULONG)p_buffer;
  942. // i2c_dma_last_transfer_config(I2C0, I2C_DMALST_ON);
  943. // /* enable I2C0 DMA */
  944. // i2c_dma_config(I2C0, I2C_DMA_ON);
  945. // /* enable DMA0 channel5 */
  946. // dma_channel_enable(DMA0, DMA_CH6);
  947. // /* wait until BTC bit is set */
  948. // while(dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_FTF) == 0)
  949. // {
  950. // // do nothing
  951. // }
  952. // state = (UBYTE)I2C_STOP;
  953. // }
  954. // }
  955. // break;
  956. // case I2C_STOP:
  957. // /* send a stop condition to I2C bus */
  958. // i2c_stop_on_bus(I2C0);
  959. // /* i2c master sends STOP signal successfully */
  960. // while((I2C_CTL0(I2C0) & I2C_CTL0_STOP) && (timeout < I2C_SHORT_TIMEOUT))
  961. // {
  962. // timeout++;
  963. // }
  964. // if(timeout < I2C_SHORT_TIMEOUT)
  965. // {
  966. // timeout = 0;
  967. // i2c_timeout_flag = 1;
  968. // state = (UBYTE)I2C_START;
  969. // read_cycle = 0;
  970. // /* disable DMA0 CH6 */
  971. // dma_channel_disable(DMA0, DMA_CH6);
  972. // /* disable I2C0 DMA */
  973. // i2c_dma_config(I2C0, I2C_DMA_OFF);
  974. // i2c_dma_last_transfer_config(I2C0, I2C_DMALST_OFF);
  975. // }
  976. // else
  977. // {
  978. // timeout = 0;
  979. // //state = I2C_START;
  980. // state = (UBYTE)I2C_STOP;
  981. // read_cycle = 0;
  982. // }
  983. // break;
  984. // default:
  985. // state = (UBYTE)I2C_START;
  986. // read_cycle = 0;
  987. // i2c_timeout_flag = 1;
  988. // timeout = 0;
  989. // break;
  990. // }
  991. // }
  992. // }
  993. // i2c_voReadBufferCRC(out);
  994. // i2c_voGetValueFrmBuffer(out);
  995. // out->ReadFinishFlg = TRUE;
  996. // }
  997. void i2c_voSysparaReadFromEE(I2C_RXCRC_OUT *out) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
  998. {
  999. UBYTE ubRdNBytes = 0, ubRdSlaveAddr = 0, ubRdAddr = 0;
  1000. UBYTE ubRdCnt = 2;
  1001. UBYTE *p_buffer;
  1002. while(ubRdCnt != 0)
  1003. {
  1004. ubRdCnt--;
  1005. if (ubRdCnt == 1)
  1006. {
  1007. ubRdSlaveAddr = I2C_SLAVEADDR_BLOCK1;
  1008. ubRdAddr = 0x00;
  1009. ubRdNBytes = I2C_RX1_NBYTES;
  1010. p_buffer = I2C_ubReadBuffer[0];
  1011. }
  1012. else if (ubRdCnt == 0)
  1013. {
  1014. ubRdSlaveAddr = I2C_SLAVEADDR_BLOCK3;
  1015. ubRdAddr = 0x00;
  1016. ubRdNBytes = I2C_RX2_NBYTES;
  1017. p_buffer = I2C_ubReadBuffer[1];
  1018. }
  1019. else
  1020. {
  1021. //do nothing
  1022. }
  1023. iI2C_Read(0, ubRdSlaveAddr, ubRdAddr, 8, p_buffer, ubRdNBytes);
  1024. }
  1025. i2c_voReadBufferCRC(out);
  1026. i2c_voGetValueFrmBuffer(out);
  1027. out->ReadFinishFlg = TRUE;
  1028. }
  1029. /*************************************************************************
  1030. Function:
  1031. Description:
  1032. Call by:
  1033. Input Variables:
  1034. Output/Return Variables:
  1035. Subroutine Call:
  1036. Reference:
  1037. *************************************************************************/
  1038. UWORD i2c_uwCRCCcitt(const UBYTE *ptubBuf, UWORD length)
  1039. {
  1040. UBYTE b = 0;
  1041. UWORD crc = 0xffff;
  1042. UWORD i, j;
  1043. for (i = 0; i < length; i++)
  1044. {
  1045. for (j = 0; j < 8; j++)
  1046. {
  1047. b = (UBYTE)(((ptubBuf[i] << j) & 0x80) ^ ((crc & 0x8000) >> 8)); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  1048. crc <<= 1;
  1049. if (b != 0)
  1050. {
  1051. crc ^= 0x1021; // crc = crc^(0x10000^0x11021)
  1052. }
  1053. }
  1054. }
  1055. return crc;
  1056. }
  1057. /*************************************************************************
  1058. Function:
  1059. Description:
  1060. Call by:
  1061. Input Variables:
  1062. Output/Return Variables:
  1063. Subroutine Call:
  1064. Reference:
  1065. *************************************************************************/
  1066. void i2c_voReadBufferCRC(I2C_RXCRC_OUT *out)
  1067. {
  1068. UWORD uwMotorParaCRC, uwBikeParaCRC, uwMControlParaCRC;
  1069. UWORD uwSensorParaCRC, uwAssistParaCRC, uwHistoryParaCRC;
  1070. UWORD uwMotorParaRdCRC, uwBikeParaRdCRC, uwMControlParaRdCRC;
  1071. UWORD uwSensorParaRdCRC, uwAssistParaRdCRC, uwHistoryParaRdCRC;
  1072. I2C_pReadBuffer = I2C_ubReadBuffer[0];
  1073. uwMotorParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer, I2C_MOTOR_PARA_N_BYTES);
  1074. uwBikeParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_BIKE_PARA_ARDDR, I2C_BIKE_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  1075. uwMControlParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_MCONTROL_PARA_ARDDR, I2C_MCONTROL_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  1076. uwSensorParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_SENSOR_PARA_ARDDR, I2C_SENSOR_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  1077. uwAssistParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_ASSIST_PARA_ARDDR, I2C_ASSIST_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  1078. I2C_pReadBuffer = I2C_ubReadBuffer[1];
  1079. uwHistoryParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer, I2C_HISTORY_PARA_N_BYTES);
  1080. uwMotorParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_MOTOR_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_MOTOR_PARA_CRC_ARDDR + 1];
  1081. uwBikeParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_BIKE_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_BIKE_PARA_CRC_ARDDR + 1];
  1082. uwMControlParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_CRC_ARDDR + 1];
  1083. uwSensorParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_SENSOR_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_SENSOR_PARA_CRC_ARDDR + 1];
  1084. uwAssistParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_ASSIST_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_ASSIST_PARA_CRC_ARDDR + 1];
  1085. uwHistoryParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[1][I2C_HISTORY_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[1][I2C_HISTORY_PARA_CRC_ARDDR + 1];
  1086. if (uwMotorParaCRC != uwMotorParaRdCRC)
  1087. {
  1088. out->blMotorParaFltFlg = TRUE;
  1089. }
  1090. if (uwBikeParaCRC != uwBikeParaRdCRC)
  1091. {
  1092. out->blBikeParaFltFlg = TRUE;
  1093. }
  1094. if (uwMControlParaCRC != uwMControlParaRdCRC)
  1095. {
  1096. out->blMControlParaFltFlg = TRUE;
  1097. }
  1098. if (uwSensorParaCRC != uwSensorParaRdCRC)
  1099. {
  1100. out->blSensorParaFltFlg = TRUE;
  1101. }
  1102. if (uwAssistParaCRC != uwAssistParaRdCRC)
  1103. {
  1104. out->blAssistParaFltFlg = TRUE;
  1105. }
  1106. if (uwHistoryParaCRC != uwHistoryParaRdCRC)
  1107. {
  1108. out->blHistoryParaFltFlg = TRUE;
  1109. }
  1110. }
  1111. /*************************************************************************
  1112. Function:
  1113. Description:
  1114. Call by:
  1115. Input Variables:
  1116. Output/Return Variables:
  1117. Subroutine Call:
  1118. Reference:
  1119. *************************************************************************/
  1120. void i2c_voGetValueFrmBuffer(const I2C_RXCRC_OUT *out)
  1121. {
  1122. UBYTE j = 0;
  1123. if (out->blMotorParaFltFlg != TRUE)
  1124. {
  1125. for (j = 0; j < I2C_MOTOR_PARA_N_WORDS; j++)
  1126. {
  1127. I2C_uwMotorParaRead[j] = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_MOTOR_PARA_ARDDR + 2 * j] << 8) + I2C_ubReadBuffer[0][I2C_MOTOR_PARA_ARDDR + 2 * j + 1];
  1128. }
  1129. }
  1130. else
  1131. {}
  1132. if (out->blBikeParaFltFlg != TRUE)
  1133. {
  1134. for (j = 0; j < I2C_BIKE_PARA_N_WORDS; j++)
  1135. {
  1136. I2C_uwBikeParaRead[j] = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_BIKE_PARA_ARDDR + 2 * j] << 8) + I2C_ubReadBuffer[0][I2C_BIKE_PARA_ARDDR + 2 * j + 1];
  1137. }
  1138. }
  1139. else
  1140. {}
  1141. if (out->blMControlParaFltFlg != TRUE)
  1142. {
  1143. for (j = 0; j < I2C_MCONTROL_PARA_N_WORDS; j++)
  1144. {
  1145. I2C_uwMControlRead[j] =
  1146. (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_ARDDR + 2 * j] << 8) + I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_ARDDR + 2 * j + 1];
  1147. }
  1148. }
  1149. else
  1150. {}
  1151. if (out->blSensorParaFltFlg != TRUE)
  1152. {
  1153. for (j = 0; j < I2C_SENSOR_PARA_N_WORDS; j++)
  1154. {
  1155. I2C_uwSensorRead[j] = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_SENSOR_PARA_ARDDR + 2 * j] << 8) + I2C_ubReadBuffer[0][I2C_SENSOR_PARA_ARDDR + 2 * j + 1];
  1156. }
  1157. }
  1158. else
  1159. {}
  1160. if (out->blAssistParaFltFlg != TRUE)
  1161. {
  1162. for (j = 0; j < I2C_ASSIST_PARA_N_WORDS; j++)
  1163. {
  1164. I2C_uwAssistParaRead[j] =
  1165. (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_ASSIST_PARA_ARDDR + 2 * j] << 8) + I2C_ubReadBuffer[0][I2C_ASSIST_PARA_ARDDR + 2 * j + 1];
  1166. }
  1167. }
  1168. else
  1169. {}
  1170. if (out->blHistoryParaFltFlg != TRUE)
  1171. {
  1172. for (j = 0; j < I2C_HISTORY_PARA_N_WORDS; j++)
  1173. {
  1174. I2C_uwHistoryParaRead[j] =
  1175. (UWORD)((UWORD)I2C_ubReadBuffer[1][I2C_HISTORY_PARA_ARDDR + 2 * j] << 8) + I2C_ubReadBuffer[1][I2C_HISTORY_PARA_ARDDR + 2 * j + 1];
  1176. }
  1177. }
  1178. else
  1179. {}
  1180. Syspara2.stMotorPara.uwPolePairs.uwReal = I2C_uwMotorParaRead[0];
  1181. Syspara2.stMotorPara.uwRsmOhm.uwReal = I2C_uwMotorParaRead[1];
  1182. Syspara2.stMotorPara.uwLduH.uwReal = I2C_uwMotorParaRead[2];
  1183. Syspara2.stMotorPara.uwLquH.uwReal = I2C_uwMotorParaRead[3];
  1184. Syspara2.stMotorPara.uwFluxmWb.uwReal = I2C_uwMotorParaRead[4];
  1185. Syspara2.stMotorPara.uwIdMaxA.uwReal = I2C_uwMotorParaRead[5];
  1186. Syspara2.stMotorPara.uwIdMinA.uwReal = I2C_uwMotorParaRead[6];
  1187. Syspara2.stMotorPara.uwRSpdRpm.uwReal = I2C_uwMotorParaRead[7];
  1188. Syspara2.stMotorPara.uwRPwrWt.uwReal = I2C_uwMotorParaRead[8];
  1189. Syspara2.stMotorPara.uwRCurA.uwReal = I2C_uwMotorParaRead[9];
  1190. Syspara2.stMotorPara.uwRVolV.uwReal = I2C_uwMotorParaRead[10];
  1191. Syspara2.stMotorPara.uwJD.uwReal = I2C_uwMotorParaRead[11];
  1192. Syspara2.stMotorPara.uwTorMaxNm.uwReal = I2C_uwMotorParaRead[12];
  1193. Syspara2.stBikePara.uwWheelPerimeter.uwReal = I2C_uwBikeParaRead[0];
  1194. Syspara2.stBikePara.uwMechRationMotor.uwReal = I2C_uwBikeParaRead[1];
  1195. Syspara2.stBikePara.uwAssistMaxSpdKmH.uwReal = I2C_uwBikeParaRead[2];
  1196. Syspara2.stBikePara.uwThrottleMaxSpdKmH.uwReal = I2C_uwBikeParaRead[3];
  1197. Syspara2.stBikePara.uwNmFrontChainring.uwReal = I2C_uwBikeParaRead[4];
  1198. Syspara2.stBikePara.uwNmBackChainring.uwReal = I2C_uwBikeParaRead[5];
  1199. Syspara2.stBikePara.uwAssistSelect1.uwReal = I2C_uwBikeParaRead[6];
  1200. Syspara2.stBikePara.uwAssistSelect2.uwReal = I2C_uwBikeParaRead[7];
  1201. Syspara2.stBikePara.uwLightVoltage.uwReal = I2C_uwBikeParaRead[8];
  1202. Syspara2.stBikePara.swDeltPerimeter.swReal = (SWORD)I2C_uwBikeParaRead[9];
  1203. Syspara2.stBikePara.uwStartMode.uwReal = I2C_uwBikeParaRead[10];
  1204. Syspara2.stBikePara.uwAutoPowerOffTime.uwReal = I2C_uwBikeParaRead[11];
  1205. Syspara2.stMControlPara.ParaFirstSetFlg.uwReal = I2C_uwMControlRead[0];
  1206. Syspara2.stMControlPara.SpiOffsetFirstSetFlg.uwReal = I2C_uwMControlRead[1];
  1207. Syspara2.stMControlPara.uwSPIPosOffsetOrigin.uwReal = I2C_uwMControlRead[2];
  1208. Syspara2.stMControlPara.uwSPIPosOffsetNow.uwReal = I2C_uwMControlRead[3];
  1209. Syspara2.stMControlPara.uwIPeakMaxA.uwReal = I2C_uwMControlRead[4];
  1210. Syspara2.stMControlPara.uwAlamOCurA.uwReal = I2C_uwMControlRead[5];
  1211. Syspara2.stMControlPara.uwAlamOVolV.uwReal = I2C_uwMControlRead[6];
  1212. Syspara2.stMControlPara.uwAlamUVolV.uwReal = I2C_uwMControlRead[7];
  1213. Syspara2.stMControlPara.uwAlamOverSpdRpm.uwReal = I2C_uwMControlRead[8];
  1214. Syspara2.stMControlPara.uwAlamOverHeatCe.uwReal = I2C_uwMControlRead[9];
  1215. Syspara2.stMControlPara.uwAlamRecHeatCe.uwReal = I2C_uwMControlRead[10];
  1216. Syspara2.stMControlPara.uwPwrLimitStartCe.uwReal = I2C_uwMControlRead[11];
  1217. Syspara2.stSensorPara.uwTorSensorOffsetOrigin.uwReal = I2C_uwSensorRead[0];
  1218. Syspara2.stSensorPara.uwTorSensorOffsetNow1.uwReal = I2C_uwSensorRead[1];
  1219. Syspara2.stSensorPara.uwTorSensorOffsetNow2.uwReal = I2C_uwSensorRead[2];
  1220. Syspara2.stSensorPara.uwTorSensorOffsetNow3.uwReal = I2C_uwSensorRead[3];
  1221. Syspara2.stSensorPara.uwTorSensorOffsetNow4.uwReal = I2C_uwSensorRead[4];
  1222. Syspara2.stSensorPara.uwBikeTorMaxNm.uwReal = I2C_uwSensorRead[5];
  1223. Syspara2.stSensorPara.uwBikeTor1StepRealNm.uwReal = I2C_uwSensorRead[6];
  1224. Syspara2.stSensorPara.uwBikeTor1StepADC.uwReal = I2C_uwSensorRead[7];
  1225. Syspara2.stSensorPara.uwBikeTor2StepRealNm.uwReal = I2C_uwSensorRead[8];
  1226. Syspara2.stSensorPara.uwBikeTor2StepADC.uwReal = I2C_uwSensorRead[9];
  1227. Syspara2.stSensorPara.uwBikeTor3StepRealNm.uwReal = I2C_uwSensorRead[10];
  1228. Syspara2.stSensorPara.uwBikeTor3StepADC.uwReal = I2C_uwSensorRead[11];
  1229. Syspara2.stSensorPara.uwBikeTor4StepRealNm.uwReal = I2C_uwSensorRead[12];
  1230. Syspara2.stSensorPara.uwBikeTor4StepADC.uwReal = I2C_uwSensorRead[13];
  1231. Syspara2.stSensorPara.uwCadSensorPulseNm.uwReal = I2C_uwSensorRead[14];
  1232. Syspara2.stSensorPara.uwBikeSpdSensorPulseNm.uwReal = I2C_uwSensorRead[15];
  1233. Syspara2.stAssistPara.uwStartupGain.uwReal = I2C_uwAssistParaRead[0];
  1234. Syspara2.stAssistPara.uwStartcruiseGain.uwReal = I2C_uwAssistParaRead[1];
  1235. Syspara2.stAssistPara.uwAssistStartNm.uwReal = I2C_uwAssistParaRead[2];
  1236. Syspara2.stAssistPara.uwAssistStopNm.uwReal = I2C_uwAssistParaRead[3];
  1237. Syspara2.stAssistPara.uwStartUpGainStep.uwReal = I2C_uwAssistParaRead[4];
  1238. Syspara2.stAssistPara.uwStartUpCadNm.uwReal = I2C_uwAssistParaRead[5];
  1239. Syspara2.stAssistPara.uwTorLPFCadNm.uwReal = I2C_uwAssistParaRead[6];
  1240. Syspara2.stAssistPara.uwSpeedAssistSpdRpm.uwReal = I2C_uwAssistParaRead[7];
  1241. Syspara2.stAssistPara.uwSpeedAssistIMaxA.uwReal = I2C_uwAssistParaRead[8];
  1242. Syspara2.stAssistPara.uwAssistLimitBikeSpdStart.uwReal = I2C_uwAssistParaRead[9];
  1243. Syspara2.stAssistPara.uwAssistLimitBikeSpdStop.uwReal = I2C_uwAssistParaRead[10];
  1244. Syspara2.stAssistPara.uwCadenceAssistWeight.uwReal = I2C_uwAssistParaRead[11];
  1245. Syspara2.stHistoryPara.uwAssModSelect.uwReal = I2C_uwHistoryParaRead[0];
  1246. Syspara2.stHistoryPara.uwOpenTimes.uwReal = I2C_uwHistoryParaRead[1];
  1247. Syspara2.stHistoryPara.uwUsedTimeH.uwReal = I2C_uwHistoryParaRead[2];
  1248. Syspara2.stHistoryPara.uwUsedTimeL.uwReal = I2C_uwHistoryParaRead[3];
  1249. Syspara2.stHistoryPara.uwNTCTempMaxCe.uwReal = I2C_uwHistoryParaRead[4];
  1250. Syspara2.stHistoryPara.uwNTCTempMinCe.uwReal = I2C_uwHistoryParaRead[5];
  1251. Syspara2.stHistoryPara.uwAlamHOcurTimes.uwReal = I2C_uwHistoryParaRead[6];
  1252. Syspara2.stHistoryPara.uwAlamSOcurTimes.uwReal = I2C_uwHistoryParaRead[7];
  1253. Syspara2.stHistoryPara.uwAlamOHeatTimes.uwReal = I2C_uwHistoryParaRead[8];
  1254. Syspara2.stHistoryPara.uwAlamRotorLockTimes.uwReal = I2C_uwHistoryParaRead[9];
  1255. Syspara2.stHistoryPara.uwAlamPhsLossTimes.uwReal = I2C_uwHistoryParaRead[10];
  1256. Syspara2.stHistoryPara.uwAlamOVolTimes.uwReal = I2C_uwHistoryParaRead[11];
  1257. Syspara2.stHistoryPara.uwAlamUVolTimes.uwReal = I2C_uwHistoryParaRead[12];
  1258. Syspara2.stHistoryPara.uwAlamComOTimeTimes.uwReal = I2C_uwHistoryParaRead[13];
  1259. Syspara2.stHistoryPara.uwG1AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[14];
  1260. Syspara2.stHistoryPara.uwG2AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[15];
  1261. Syspara2.stHistoryPara.uwG3AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[16];
  1262. Syspara2.stHistoryPara.uwG4AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[17];
  1263. Syspara2.stHistoryPara.uwG5AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[18];
  1264. Syspara2.stHistoryPara.uwODOTripH.uwReal = I2C_uwHistoryParaRead[19];
  1265. Syspara2.stHistoryPara.uwODOTripL.uwReal = I2C_uwHistoryParaRead[20];
  1266. Syspara2.stHistoryPara.uwODOTimeH.uwReal = I2C_uwHistoryParaRead[21];
  1267. Syspara2.stHistoryPara.uwODOTimeL.uwReal = I2C_uwHistoryParaRead[22];
  1268. Syspara2.stHistoryPara.uwTripSumH.uwReal = I2C_uwHistoryParaRead[23];
  1269. Syspara2.stHistoryPara.uwTripSumL.uwReal = I2C_uwHistoryParaRead[24];
  1270. Syspara2.stHistoryPara.uwTripSumTimeH.uwReal = I2C_uwHistoryParaRead[25];
  1271. Syspara2.stHistoryPara.uwTripSumTimeL.uwReal = I2C_uwHistoryParaRead[26];
  1272. Syspara2.stHistoryPara.uwTorSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[27];
  1273. Syspara2.stHistoryPara.uwCadSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[28];
  1274. Syspara2.stHistoryPara.uwBikeSpdSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[29];
  1275. Syspara2.stHistoryPara.uwPosSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[30];
  1276. }
  1277. /*************************************************************************
  1278. Function:
  1279. Description:
  1280. Call by:
  1281. Input Variables:
  1282. Output/Return Variables:
  1283. Subroutine Call:
  1284. Reference:
  1285. *************************************************************************/
  1286. void i2c_voWriteTest(void)
  1287. {
  1288. UBYTE WriteBuffer[4];
  1289. UBYTE *pBuffer;
  1290. WriteBuffer[0] = 0x06;
  1291. WriteBuffer[1] = 0x08;
  1292. WriteBuffer[2] = 0x0A;
  1293. WriteBuffer[3] = 0x01;
  1294. pBuffer = WriteBuffer;
  1295. i2c_voPageWrite2EE(pBuffer, I2C_SLAVEADDR_BLOCK1, 0x00, 4);
  1296. }
  1297. /*************************************************************************
  1298. Function:
  1299. Description:
  1300. Call by:
  1301. Input Variables:
  1302. Output/Return Variables:
  1303. Subroutine Call:
  1304. Reference:
  1305. *************************************************************************/
  1306. void i2c_voReadTest(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
  1307. {
  1308. UBYTE ReadBuffer[6];
  1309. ULONG ulTimeCnt = 0;
  1310. UWORD uwTimeoutNum = 0;
  1311. UWORD uwReadNBytes = 6;
  1312. /* wait until I2C bus is idle */
  1313. while((i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) != 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1314. {
  1315. ulTimeCnt++;
  1316. }
  1317. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1318. {
  1319. uwTimeoutNum ++;
  1320. }
  1321. ulTimeCnt = 0;
  1322. /* send a start condition to I2C bus */
  1323. i2c_start_on_bus(I2C0);
  1324. /* wait until SBSEND bit is set */
  1325. while((i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1326. {
  1327. ulTimeCnt++;
  1328. }
  1329. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1330. {
  1331. uwTimeoutNum ++;
  1332. }
  1333. ulTimeCnt = 0;
  1334. /* send slave address to I2C bus */
  1335. i2c_master_addressing(I2C0, I2C_SLAVEADDR_BLOCK1, I2C_TRANSMITTER);
  1336. /* wait until ADDSEND bit is set */
  1337. while((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1338. {
  1339. ulTimeCnt++;
  1340. }
  1341. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1342. {
  1343. uwTimeoutNum ++;
  1344. }
  1345. ulTimeCnt = 0;
  1346. /* clear ADDSEND bit */
  1347. i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
  1348. /* wait until the TBE bit is set */
  1349. while((i2c_flag_get(I2C0, I2C_FLAG_TBE) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1350. {
  1351. ulTimeCnt++;
  1352. }
  1353. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1354. {
  1355. uwTimeoutNum ++;
  1356. }
  1357. ulTimeCnt = 0;
  1358. /* readAddr transmission */
  1359. i2c_data_transmit(I2C0, 0x00);
  1360. /* wait until the BTC bit is set */
  1361. while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1362. {
  1363. ulTimeCnt++;
  1364. }
  1365. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1366. {
  1367. uwTimeoutNum ++;
  1368. }
  1369. ulTimeCnt = 0;
  1370. /* send a start condition to I2C bus */
  1371. i2c_start_on_bus(I2C0);
  1372. /* wait until SBSEND bit is set */
  1373. while((i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1374. {
  1375. ulTimeCnt++;
  1376. }
  1377. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1378. {
  1379. uwTimeoutNum ++;
  1380. }
  1381. ulTimeCnt = 0;
  1382. /* send slave address to I2C bus */
  1383. i2c_master_addressing(I2C0, I2C_SLAVEADDR_BLOCK1, I2C_RECEIVER);
  1384. /* wait until ADDSEND bit is set */
  1385. while((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) == 0)&& (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1386. {
  1387. ulTimeCnt++;
  1388. }
  1389. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1390. {
  1391. uwTimeoutNum ++;
  1392. }
  1393. ulTimeCnt = 0;
  1394. /* clear ADDSEND bit */
  1395. i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
  1396. while(uwReadNBytes != 0)
  1397. {
  1398. uwReadNBytes--;
  1399. if(2 == uwReadNBytes)
  1400. {
  1401. /* wait until BTC bit is set */
  1402. while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1403. {
  1404. ulTimeCnt++;
  1405. }
  1406. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1407. {
  1408. uwTimeoutNum ++;
  1409. }
  1410. ulTimeCnt = 0;
  1411. /* disable acknowledge */
  1412. i2c_ack_config(I2C0, I2C_ACK_DISABLE);
  1413. }
  1414. if(1 == uwReadNBytes)
  1415. {
  1416. /* wait until BTC bit is set */
  1417. while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1418. {
  1419. ulTimeCnt++;
  1420. }
  1421. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1422. {
  1423. uwTimeoutNum ++;
  1424. }
  1425. ulTimeCnt = 0;
  1426. /* send a stop condition to I2C bus */
  1427. i2c_stop_on_bus(I2C0);
  1428. }
  1429. while((i2c_flag_get(I2C0, I2C_FLAG_RBNE) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1430. {
  1431. ulTimeCnt++;
  1432. }
  1433. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1434. {
  1435. uwTimeoutNum ++;
  1436. }
  1437. ulTimeCnt = 0;
  1438. ReadBuffer[5 - uwReadNBytes] = i2c_data_receive(I2C0);
  1439. }
  1440. /* wait until stop condition generate */
  1441. while((I2C_CTL0(I2C0)&I2C_CTL0_STOP) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1442. {
  1443. ulTimeCnt++;
  1444. }
  1445. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1446. {
  1447. uwTimeoutNum ++;
  1448. }
  1449. ulTimeCnt = 0;
  1450. if(uwTimeoutNum > 3)
  1451. {
  1452. I2C_EE_ComuFltFlg = TRUE;
  1453. }
  1454. }
  1455. /*************************************************************************
  1456. Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
  1457. All rights reserved.
  1458. *************************************************************************/
  1459. #ifdef _I2C_MASTER_C_
  1460. #undef _I2C_MASTER_C_ /* parasoft-suppress MISRA2004-19_6 "本项目中无法更改,后续避免使用" */
  1461. #endif
  1462. /*************************************************************************
  1463. End of this File (EOF)!
  1464. Do not put anything after this part!
  1465. *************************************************************************/