i2c_master.c 62 KB

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