i2c_master.c 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524
  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. /* enable acknowledge */
  768. i2c_ack_config(I2C0, I2C_ACK_ENABLE);
  769. if (ubRdCnt == 1)
  770. {
  771. ubRdSlaveAddr = I2C_SLAVEADDR_BLOCK1;
  772. ubRdAddr = 0x00;
  773. ubRdNBytes = I2C_RX1_NBYTES;
  774. p_buffer = I2C_ubReadBuffer[0];
  775. i2c_timeout_flag = 0;
  776. }
  777. else if (ubRdCnt == 0)
  778. {
  779. ubRdSlaveAddr = I2C_SLAVEADDR_BLOCK3;
  780. ubRdAddr = 0x00;
  781. ubRdNBytes = I2C_RX2_NBYTES;
  782. p_buffer = I2C_ubReadBuffer[1];
  783. i2c_timeout_flag = 0;
  784. }
  785. else
  786. {
  787. //do nothing
  788. }
  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. } else
  867. {
  868. timeout = 0;
  869. state = (UBYTE)I2C_START;
  870. read_cycle = 0;
  871. }
  872. break;
  873. case I2C_TRANSMIT_DATA:
  874. if(RESET == read_cycle)
  875. {
  876. /* wait until the transmit data buffer is empty */
  877. while((i2c_flag_get(I2C0, I2C_FLAG_TBE) == 0) && (timeout < I2C_SHORT_TIMEOUT))
  878. {
  879. timeout++;
  880. }
  881. if(timeout < I2C_SHORT_TIMEOUT)
  882. {
  883. /* send the EEPROM's internal address to write to : only one byte address */
  884. i2c_data_transmit(I2C0, ubRdAddr);
  885. timeout = 0;
  886. }
  887. else
  888. {
  889. timeout = 0;
  890. state = (UBYTE)I2C_START;
  891. read_cycle = 0;
  892. }
  893. /* wait until BTC bit is set */
  894. while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (timeout < I2C_SHORT_TIMEOUT))
  895. {
  896. timeout++;
  897. }
  898. if(timeout < I2C_SHORT_TIMEOUT)
  899. {
  900. timeout = 0;
  901. state = (UBYTE)I2C_START;
  902. read_cycle++;
  903. } else
  904. {
  905. timeout = 0;
  906. state = (UBYTE)I2C_START;
  907. read_cycle = 0;
  908. }
  909. }
  910. else
  911. {
  912. /* one byte master reception procedure (polling) */
  913. if(ubRdNBytes < 2)
  914. {
  915. /* disable acknowledge */
  916. i2c_ack_config(I2C0, I2C_ACK_DISABLE);
  917. /* clear ADDSEND register by reading I2C_STAT0 then I2C_STAT1 register (I2C_STAT0 has already been read) */
  918. i2c_flag_get(I2C0, I2C_FLAG_ADDSEND);
  919. /* send a stop condition to I2C bus*/
  920. i2c_stop_on_bus(I2C0);
  921. /* wait for the byte to be received */
  922. while(i2c_flag_get(I2C0, I2C_FLAG_RBNE) == 0)
  923. {
  924. // do nothing
  925. }
  926. /* read the byte received from the EEPROM */
  927. *p_buffer = i2c_data_receive(I2C0);
  928. /* decrement the read bytes counter */
  929. ubRdNBytes--;
  930. timeout = 0;
  931. state = (UBYTE)I2C_STOP;
  932. }
  933. else
  934. { /* more than one byte master reception procedure (DMA) */
  935. dma_transfer_number_config(DMA0, DMA_CH6, ubRdNBytes);
  936. DMA_CH6MADDR(DMA0) = (ULONG)p_buffer;
  937. i2c_dma_last_transfer_config(I2C0, I2C_DMALST_ON);
  938. /* enable I2C0 DMA */
  939. i2c_dma_config(I2C0, I2C_DMA_ON);
  940. /* enable DMA0 channel5 */
  941. dma_channel_enable(DMA0, DMA_CH6);
  942. /* wait until BTC bit is set */
  943. while(dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_FTF) == 0)
  944. {
  945. // do nothing
  946. }
  947. state = (UBYTE)I2C_STOP;
  948. }
  949. }
  950. break;
  951. case I2C_STOP:
  952. /* send a stop condition to I2C bus */
  953. i2c_stop_on_bus(I2C0);
  954. /* i2c master sends STOP signal successfully */
  955. while((I2C_CTL0(I2C0) & I2C_CTL0_STOP) && (timeout < I2C_SHORT_TIMEOUT))
  956. {
  957. timeout++;
  958. }
  959. if(timeout < I2C_SHORT_TIMEOUT)
  960. {
  961. timeout = 0;
  962. i2c_timeout_flag = 1;
  963. state = (UBYTE)I2C_START;
  964. /* disable DMA0 CH6 */
  965. dma_channel_disable(DMA0, DMA_CH6);
  966. /* disable I2C0 DMA */
  967. i2c_dma_config(I2C0, I2C_DMA_OFF);
  968. i2c_dma_last_transfer_config(I2C0, I2C_DMALST_OFF);
  969. }
  970. else
  971. {
  972. timeout = 0;
  973. //state = I2C_START;
  974. state = (UBYTE)I2C_STOP;
  975. read_cycle = 0;
  976. }
  977. break;
  978. default:
  979. state = (UBYTE)I2C_START;
  980. read_cycle = 0;
  981. i2c_timeout_flag = 1;
  982. timeout = 0;
  983. break;
  984. }
  985. }
  986. }
  987. i2c_voReadBufferCRC(out);
  988. i2c_voGetValueFrmBuffer(out);
  989. out->ReadFinishFlg = TRUE;
  990. }
  991. /*************************************************************************
  992. Function:
  993. Description:
  994. Call by:
  995. Input Variables:
  996. Output/Return Variables:
  997. Subroutine Call:
  998. Reference:
  999. *************************************************************************/
  1000. UWORD i2c_uwCRCCcitt(const UBYTE *ptubBuf, UWORD length)
  1001. {
  1002. UBYTE b = 0;
  1003. UWORD crc = 0xffff;
  1004. UWORD i, j;
  1005. for (i = 0; i < length; i++)
  1006. {
  1007. for (j = 0; j < 8; j++)
  1008. {
  1009. b = (UBYTE)(((ptubBuf[i] << j) & 0x80) ^ ((crc & 0x8000) >> 8)); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  1010. crc <<= 1;
  1011. if (b != 0)
  1012. {
  1013. crc ^= 0x1021; // crc = crc^(0x10000^0x11021)
  1014. }
  1015. }
  1016. }
  1017. return crc;
  1018. }
  1019. /*************************************************************************
  1020. Function:
  1021. Description:
  1022. Call by:
  1023. Input Variables:
  1024. Output/Return Variables:
  1025. Subroutine Call:
  1026. Reference:
  1027. *************************************************************************/
  1028. void i2c_voReadBufferCRC(I2C_RXCRC_OUT *out)
  1029. {
  1030. UWORD uwMotorParaCRC, uwBikeParaCRC, uwMControlParaCRC;
  1031. UWORD uwSensorParaCRC, uwAssistParaCRC, uwHistoryParaCRC;
  1032. UWORD uwMotorParaRdCRC, uwBikeParaRdCRC, uwMControlParaRdCRC;
  1033. UWORD uwSensorParaRdCRC, uwAssistParaRdCRC, uwHistoryParaRdCRC;
  1034. I2C_pReadBuffer = I2C_ubReadBuffer[0];
  1035. uwMotorParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer, I2C_MOTOR_PARA_N_BYTES);
  1036. uwBikeParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_BIKE_PARA_ARDDR, I2C_BIKE_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  1037. uwMControlParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_MCONTROL_PARA_ARDDR, I2C_MCONTROL_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  1038. uwSensorParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_SENSOR_PARA_ARDDR, I2C_SENSOR_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  1039. uwAssistParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_ASSIST_PARA_ARDDR, I2C_ASSIST_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  1040. I2C_pReadBuffer = I2C_ubReadBuffer[1];
  1041. uwHistoryParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer, I2C_HISTORY_PARA_N_BYTES);
  1042. uwMotorParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_MOTOR_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_MOTOR_PARA_CRC_ARDDR + 1];
  1043. uwBikeParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_BIKE_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_BIKE_PARA_CRC_ARDDR + 1];
  1044. uwMControlParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_CRC_ARDDR + 1];
  1045. uwSensorParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_SENSOR_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_SENSOR_PARA_CRC_ARDDR + 1];
  1046. uwAssistParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_ASSIST_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_ASSIST_PARA_CRC_ARDDR + 1];
  1047. uwHistoryParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[1][I2C_HISTORY_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[1][I2C_HISTORY_PARA_CRC_ARDDR + 1];
  1048. if (uwMotorParaCRC != uwMotorParaRdCRC)
  1049. {
  1050. out->blMotorParaFltFlg = TRUE;
  1051. }
  1052. if (uwBikeParaCRC != uwBikeParaRdCRC)
  1053. {
  1054. out->blBikeParaFltFlg = TRUE;
  1055. }
  1056. if (uwMControlParaCRC != uwMControlParaRdCRC)
  1057. {
  1058. out->blMControlParaFltFlg = TRUE;
  1059. }
  1060. if (uwSensorParaCRC != uwSensorParaRdCRC)
  1061. {
  1062. out->blSensorParaFltFlg = TRUE;
  1063. }
  1064. if (uwAssistParaCRC != uwAssistParaRdCRC)
  1065. {
  1066. out->blAssistParaFltFlg = TRUE;
  1067. }
  1068. if (uwHistoryParaCRC != uwHistoryParaRdCRC)
  1069. {
  1070. out->blHistoryParaFltFlg = TRUE;
  1071. }
  1072. }
  1073. /*************************************************************************
  1074. Function:
  1075. Description:
  1076. Call by:
  1077. Input Variables:
  1078. Output/Return Variables:
  1079. Subroutine Call:
  1080. Reference:
  1081. *************************************************************************/
  1082. void i2c_voGetValueFrmBuffer(const I2C_RXCRC_OUT *out)
  1083. {
  1084. UBYTE j = 0;
  1085. if (out->blMotorParaFltFlg != TRUE)
  1086. {
  1087. for (j = 0; j < I2C_MOTOR_PARA_N_WORDS; j++)
  1088. {
  1089. 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];
  1090. }
  1091. }
  1092. else
  1093. {}
  1094. if (out->blBikeParaFltFlg != TRUE)
  1095. {
  1096. for (j = 0; j < I2C_BIKE_PARA_N_WORDS; j++)
  1097. {
  1098. 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];
  1099. }
  1100. }
  1101. else
  1102. {}
  1103. if (out->blMControlParaFltFlg != TRUE)
  1104. {
  1105. for (j = 0; j < I2C_MCONTROL_PARA_N_WORDS; j++)
  1106. {
  1107. I2C_uwMControlRead[j] =
  1108. (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_ARDDR + 2 * j] << 8) + I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_ARDDR + 2 * j + 1];
  1109. }
  1110. }
  1111. else
  1112. {}
  1113. if (out->blSensorParaFltFlg != TRUE)
  1114. {
  1115. for (j = 0; j < I2C_SENSOR_PARA_N_WORDS; j++)
  1116. {
  1117. 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];
  1118. }
  1119. }
  1120. else
  1121. {}
  1122. if (out->blAssistParaFltFlg != TRUE)
  1123. {
  1124. for (j = 0; j < I2C_ASSIST_PARA_N_WORDS; j++)
  1125. {
  1126. I2C_uwAssistParaRead[j] =
  1127. (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_ASSIST_PARA_ARDDR + 2 * j] << 8) + I2C_ubReadBuffer[0][I2C_ASSIST_PARA_ARDDR + 2 * j + 1];
  1128. }
  1129. }
  1130. else
  1131. {}
  1132. if (out->blHistoryParaFltFlg != TRUE)
  1133. {
  1134. for (j = 0; j < I2C_HISTORY_PARA_N_WORDS; j++)
  1135. {
  1136. I2C_uwHistoryParaRead[j] =
  1137. (UWORD)((UWORD)I2C_ubReadBuffer[1][I2C_HISTORY_PARA_ARDDR + 2 * j] << 8) + I2C_ubReadBuffer[1][I2C_HISTORY_PARA_ARDDR + 2 * j + 1];
  1138. }
  1139. }
  1140. else
  1141. {}
  1142. Syspara2.stMotorPara.uwPolePairs.uwReal = I2C_uwMotorParaRead[0];
  1143. Syspara2.stMotorPara.uwRsmOhm.uwReal = I2C_uwMotorParaRead[1];
  1144. Syspara2.stMotorPara.uwLduH.uwReal = I2C_uwMotorParaRead[2];
  1145. Syspara2.stMotorPara.uwLquH.uwReal = I2C_uwMotorParaRead[3];
  1146. Syspara2.stMotorPara.uwFluxmWb.uwReal = I2C_uwMotorParaRead[4];
  1147. Syspara2.stMotorPara.uwIdMaxA.uwReal = I2C_uwMotorParaRead[5];
  1148. Syspara2.stMotorPara.uwIdMinA.uwReal = I2C_uwMotorParaRead[6];
  1149. Syspara2.stMotorPara.uwRSpdRpm.uwReal = I2C_uwMotorParaRead[7];
  1150. Syspara2.stMotorPara.uwRPwrWt.uwReal = I2C_uwMotorParaRead[8];
  1151. Syspara2.stMotorPara.uwRCurA.uwReal = I2C_uwMotorParaRead[9];
  1152. Syspara2.stMotorPara.uwRVolV.uwReal = I2C_uwMotorParaRead[10];
  1153. Syspara2.stMotorPara.uwJD.uwReal = I2C_uwMotorParaRead[11];
  1154. Syspara2.stMotorPara.uwTorMaxNm.uwReal = I2C_uwMotorParaRead[12];
  1155. Syspara2.stBikePara.uwWheelPerimeter.uwReal = I2C_uwBikeParaRead[0];
  1156. Syspara2.stBikePara.uwMechRationMotor.uwReal = I2C_uwBikeParaRead[1];
  1157. Syspara2.stBikePara.uwAssistMaxSpdKmH.uwReal = I2C_uwBikeParaRead[2];
  1158. Syspara2.stBikePara.uwThrottleMaxSpdKmH.uwReal = I2C_uwBikeParaRead[3];
  1159. Syspara2.stBikePara.uwNmFrontChainring.uwReal = I2C_uwBikeParaRead[4];
  1160. Syspara2.stBikePara.uwNmBackChainring.uwReal = I2C_uwBikeParaRead[5];
  1161. Syspara2.stBikePara.uwAssistSelect1.uwReal = I2C_uwBikeParaRead[6];
  1162. Syspara2.stBikePara.uwAssistSelect2.uwReal = I2C_uwBikeParaRead[7];
  1163. Syspara2.stBikePara.uwLightVoltage.uwReal = I2C_uwBikeParaRead[8];
  1164. Syspara2.stBikePara.swDeltPerimeter.swReal = (SWORD)I2C_uwBikeParaRead[9];
  1165. Syspara2.stBikePara.uwStartMode.uwReal = I2C_uwBikeParaRead[10];
  1166. Syspara2.stBikePara.uwAutoPowerOffTime.uwReal = I2C_uwBikeParaRead[11];
  1167. Syspara2.stMControlPara.ParaFirstSetFlg.uwReal = I2C_uwMControlRead[0];
  1168. Syspara2.stMControlPara.SpiOffsetFirstSetFlg.uwReal = I2C_uwMControlRead[1];
  1169. Syspara2.stMControlPara.uwSPIPosOffsetOrigin.uwReal = I2C_uwMControlRead[2];
  1170. Syspara2.stMControlPara.uwSPIPosOffsetNow.uwReal = I2C_uwMControlRead[3];
  1171. Syspara2.stMControlPara.uwIPeakMaxA.uwReal = I2C_uwMControlRead[4];
  1172. Syspara2.stMControlPara.uwAlamOCurA.uwReal = I2C_uwMControlRead[5];
  1173. Syspara2.stMControlPara.uwAlamOVolV.uwReal = I2C_uwMControlRead[6];
  1174. Syspara2.stMControlPara.uwAlamUVolV.uwReal = I2C_uwMControlRead[7];
  1175. Syspara2.stMControlPara.uwAlamOverSpdRpm.uwReal = I2C_uwMControlRead[8];
  1176. Syspara2.stMControlPara.uwAlamOverHeatCe.uwReal = I2C_uwMControlRead[9];
  1177. Syspara2.stMControlPara.uwAlamRecHeatCe.uwReal = I2C_uwMControlRead[10];
  1178. Syspara2.stMControlPara.uwPwrLimitStartCe.uwReal = I2C_uwMControlRead[11];
  1179. Syspara2.stSensorPara.uwTorSensorOffsetOrigin.uwReal = I2C_uwSensorRead[0];
  1180. Syspara2.stSensorPara.uwTorSensorOffsetNow1.uwReal = I2C_uwSensorRead[1];
  1181. Syspara2.stSensorPara.uwTorSensorOffsetNow2.uwReal = I2C_uwSensorRead[2];
  1182. Syspara2.stSensorPara.uwTorSensorOffsetNow3.uwReal = I2C_uwSensorRead[3];
  1183. Syspara2.stSensorPara.uwTorSensorOffsetNow4.uwReal = I2C_uwSensorRead[4];
  1184. Syspara2.stSensorPara.uwBikeTorMaxNm.uwReal = I2C_uwSensorRead[5];
  1185. Syspara2.stSensorPara.uwBikeTor1StepRealNm.uwReal = I2C_uwSensorRead[6];
  1186. Syspara2.stSensorPara.uwBikeTor1StepADC.uwReal = I2C_uwSensorRead[7];
  1187. Syspara2.stSensorPara.uwBikeTor2StepRealNm.uwReal = I2C_uwSensorRead[8];
  1188. Syspara2.stSensorPara.uwBikeTor2StepADC.uwReal = I2C_uwSensorRead[9];
  1189. Syspara2.stSensorPara.uwBikeTor3StepRealNm.uwReal = I2C_uwSensorRead[10];
  1190. Syspara2.stSensorPara.uwBikeTor3StepADC.uwReal = I2C_uwSensorRead[11];
  1191. Syspara2.stSensorPara.uwBikeTor4StepRealNm.uwReal = I2C_uwSensorRead[12];
  1192. Syspara2.stSensorPara.uwBikeTor4StepADC.uwReal = I2C_uwSensorRead[13];
  1193. Syspara2.stSensorPara.uwCadSensorPulseNm.uwReal = I2C_uwSensorRead[14];
  1194. Syspara2.stSensorPara.uwBikeSpdSensorPulseNm.uwReal = I2C_uwSensorRead[15];
  1195. Syspara2.stAssistPara.uwStartupGain.uwReal = I2C_uwAssistParaRead[0];
  1196. Syspara2.stAssistPara.uwStartcruiseGain.uwReal = I2C_uwAssistParaRead[1];
  1197. Syspara2.stAssistPara.uwAssistStartNm.uwReal = I2C_uwAssistParaRead[2];
  1198. Syspara2.stAssistPara.uwAssistStopNm.uwReal = I2C_uwAssistParaRead[3];
  1199. Syspara2.stAssistPara.uwStartUpGainStep.uwReal = I2C_uwAssistParaRead[4];
  1200. Syspara2.stAssistPara.uwStartUpCadNm.uwReal = I2C_uwAssistParaRead[5];
  1201. Syspara2.stAssistPara.uwTorLPFCadNm.uwReal = I2C_uwAssistParaRead[6];
  1202. Syspara2.stAssistPara.uwSpeedAssistSpdRpm.uwReal = I2C_uwAssistParaRead[7];
  1203. Syspara2.stAssistPara.uwSpeedAssistIMaxA.uwReal = I2C_uwAssistParaRead[8];
  1204. Syspara2.stAssistPara.uwAssistLimitBikeSpdStart.uwReal = I2C_uwAssistParaRead[9];
  1205. Syspara2.stAssistPara.uwAssistLimitBikeSpdStop.uwReal = I2C_uwAssistParaRead[10];
  1206. Syspara2.stAssistPara.uwCadenceAssistWeight.uwReal = I2C_uwAssistParaRead[11];
  1207. Syspara2.stHistoryPara.uwAssModSelect.uwReal = I2C_uwHistoryParaRead[0];
  1208. Syspara2.stHistoryPara.uwOpenTimes.uwReal = I2C_uwHistoryParaRead[1];
  1209. Syspara2.stHistoryPara.uwUsedTimeH.uwReal = I2C_uwHistoryParaRead[2];
  1210. Syspara2.stHistoryPara.uwUsedTimeL.uwReal = I2C_uwHistoryParaRead[3];
  1211. Syspara2.stHistoryPara.uwNTCTempMaxCe.uwReal = I2C_uwHistoryParaRead[4];
  1212. Syspara2.stHistoryPara.uwNTCTempMinCe.uwReal = I2C_uwHistoryParaRead[5];
  1213. Syspara2.stHistoryPara.uwAlamHOcurTimes.uwReal = I2C_uwHistoryParaRead[6];
  1214. Syspara2.stHistoryPara.uwAlamSOcurTimes.uwReal = I2C_uwHistoryParaRead[7];
  1215. Syspara2.stHistoryPara.uwAlamOHeatTimes.uwReal = I2C_uwHistoryParaRead[8];
  1216. Syspara2.stHistoryPara.uwAlamRotorLockTimes.uwReal = I2C_uwHistoryParaRead[9];
  1217. Syspara2.stHistoryPara.uwAlamPhsLossTimes.uwReal = I2C_uwHistoryParaRead[10];
  1218. Syspara2.stHistoryPara.uwAlamOVolTimes.uwReal = I2C_uwHistoryParaRead[11];
  1219. Syspara2.stHistoryPara.uwAlamUVolTimes.uwReal = I2C_uwHistoryParaRead[12];
  1220. Syspara2.stHistoryPara.uwAlamComOTimeTimes.uwReal = I2C_uwHistoryParaRead[13];
  1221. Syspara2.stHistoryPara.uwG1AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[14];
  1222. Syspara2.stHistoryPara.uwG2AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[15];
  1223. Syspara2.stHistoryPara.uwG3AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[16];
  1224. Syspara2.stHistoryPara.uwG4AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[17];
  1225. Syspara2.stHistoryPara.uwG5AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[18];
  1226. Syspara2.stHistoryPara.uwODOTripH.uwReal = I2C_uwHistoryParaRead[19];
  1227. Syspara2.stHistoryPara.uwODOTripL.uwReal = I2C_uwHistoryParaRead[20];
  1228. Syspara2.stHistoryPara.uwODOTimeH.uwReal = I2C_uwHistoryParaRead[21];
  1229. Syspara2.stHistoryPara.uwODOTimeL.uwReal = I2C_uwHistoryParaRead[22];
  1230. Syspara2.stHistoryPara.uwTripSumH.uwReal = I2C_uwHistoryParaRead[23];
  1231. Syspara2.stHistoryPara.uwTripSumL.uwReal = I2C_uwHistoryParaRead[24];
  1232. Syspara2.stHistoryPara.uwTripSumTimeH.uwReal = I2C_uwHistoryParaRead[25];
  1233. Syspara2.stHistoryPara.uwTripSumTimeL.uwReal = I2C_uwHistoryParaRead[26];
  1234. Syspara2.stHistoryPara.uwTorSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[27];
  1235. Syspara2.stHistoryPara.uwCadSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[28];
  1236. Syspara2.stHistoryPara.uwBikeSpdSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[29];
  1237. Syspara2.stHistoryPara.uwPosSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[30];
  1238. }
  1239. /*************************************************************************
  1240. Function:
  1241. Description:
  1242. Call by:
  1243. Input Variables:
  1244. Output/Return Variables:
  1245. Subroutine Call:
  1246. Reference:
  1247. *************************************************************************/
  1248. void i2c_voWriteTest(void)
  1249. {
  1250. UBYTE WriteBuffer[4];
  1251. UBYTE *pBuffer;
  1252. WriteBuffer[0] = 0x06;
  1253. WriteBuffer[1] = 0x08;
  1254. WriteBuffer[2] = 0x0A;
  1255. WriteBuffer[3] = 0x01;
  1256. pBuffer = WriteBuffer;
  1257. i2c_voPageWrite2EE(pBuffer, I2C_SLAVEADDR_BLOCK1, 0x00, 4);
  1258. }
  1259. /*************************************************************************
  1260. Function:
  1261. Description:
  1262. Call by:
  1263. Input Variables:
  1264. Output/Return Variables:
  1265. Subroutine Call:
  1266. Reference:
  1267. *************************************************************************/
  1268. void i2c_voReadTest(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
  1269. {
  1270. UBYTE ReadBuffer[6];
  1271. ULONG ulTimeCnt = 0;
  1272. UWORD uwTimeoutNum = 0;
  1273. UWORD uwReadNBytes = 6;
  1274. /* wait until I2C bus is idle */
  1275. while((i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) != 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1276. {
  1277. ulTimeCnt++;
  1278. }
  1279. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1280. {
  1281. uwTimeoutNum ++;
  1282. }
  1283. ulTimeCnt = 0;
  1284. /* send a start condition to I2C bus */
  1285. i2c_start_on_bus(I2C0);
  1286. /* wait until SBSEND bit is set */
  1287. while((i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1288. {
  1289. ulTimeCnt++;
  1290. }
  1291. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1292. {
  1293. uwTimeoutNum ++;
  1294. }
  1295. ulTimeCnt = 0;
  1296. /* send slave address to I2C bus */
  1297. i2c_master_addressing(I2C0, I2C_SLAVEADDR_BLOCK1, I2C_TRANSMITTER);
  1298. /* wait until ADDSEND bit is set */
  1299. while((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1300. {
  1301. ulTimeCnt++;
  1302. }
  1303. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1304. {
  1305. uwTimeoutNum ++;
  1306. }
  1307. ulTimeCnt = 0;
  1308. /* clear ADDSEND bit */
  1309. i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
  1310. /* wait until the TBE bit is set */
  1311. while((i2c_flag_get(I2C0, I2C_FLAG_TBE) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1312. {
  1313. ulTimeCnt++;
  1314. }
  1315. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1316. {
  1317. uwTimeoutNum ++;
  1318. }
  1319. ulTimeCnt = 0;
  1320. /* readAddr transmission */
  1321. i2c_data_transmit(I2C0, 0x00);
  1322. /* wait until the BTC bit is set */
  1323. while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1324. {
  1325. ulTimeCnt++;
  1326. }
  1327. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1328. {
  1329. uwTimeoutNum ++;
  1330. }
  1331. ulTimeCnt = 0;
  1332. /* send a start condition to I2C bus */
  1333. i2c_start_on_bus(I2C0);
  1334. /* wait until SBSEND bit is set */
  1335. while((i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1336. {
  1337. ulTimeCnt++;
  1338. }
  1339. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1340. {
  1341. uwTimeoutNum ++;
  1342. }
  1343. ulTimeCnt = 0;
  1344. /* send slave address to I2C bus */
  1345. i2c_master_addressing(I2C0, I2C_SLAVEADDR_BLOCK1, I2C_RECEIVER);
  1346. /* wait until ADDSEND bit is set */
  1347. while((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) == 0)&& (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1348. {
  1349. ulTimeCnt++;
  1350. }
  1351. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1352. {
  1353. uwTimeoutNum ++;
  1354. }
  1355. ulTimeCnt = 0;
  1356. /* clear ADDSEND bit */
  1357. i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
  1358. while(uwReadNBytes != 0)
  1359. {
  1360. uwReadNBytes--;
  1361. if(2 == uwReadNBytes)
  1362. {
  1363. /* wait until BTC bit is set */
  1364. while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1365. {
  1366. ulTimeCnt++;
  1367. }
  1368. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1369. {
  1370. uwTimeoutNum ++;
  1371. }
  1372. ulTimeCnt = 0;
  1373. /* disable acknowledge */
  1374. i2c_ack_config(I2C0, I2C_ACK_DISABLE);
  1375. }
  1376. if(1 == uwReadNBytes)
  1377. {
  1378. /* wait until BTC bit is set */
  1379. while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1380. {
  1381. ulTimeCnt++;
  1382. }
  1383. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1384. {
  1385. uwTimeoutNum ++;
  1386. }
  1387. ulTimeCnt = 0;
  1388. /* send a stop condition to I2C bus */
  1389. i2c_stop_on_bus(I2C0);
  1390. }
  1391. while((i2c_flag_get(I2C0, I2C_FLAG_RBNE) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1392. {
  1393. ulTimeCnt++;
  1394. }
  1395. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1396. {
  1397. uwTimeoutNum ++;
  1398. }
  1399. ulTimeCnt = 0;
  1400. ReadBuffer[5 - uwReadNBytes] = i2c_data_receive(I2C0);
  1401. }
  1402. /* wait until stop condition generate */
  1403. while((I2C_CTL0(I2C0)&I2C_CTL0_STOP) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
  1404. {
  1405. ulTimeCnt++;
  1406. }
  1407. if(ulTimeCnt == I2C_SHORT_TIMEOUT)
  1408. {
  1409. uwTimeoutNum ++;
  1410. }
  1411. ulTimeCnt = 0;
  1412. if(uwTimeoutNum > 3)
  1413. {
  1414. I2C_EE_ComuFltFlg = TRUE;
  1415. }
  1416. }
  1417. /*************************************************************************
  1418. Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
  1419. All rights reserved.
  1420. *************************************************************************/
  1421. #ifdef _I2C_MASTER_C_
  1422. #undef _I2C_MASTER_C_ /* parasoft-suppress MISRA2004-19_6 "本项目中无法更改,后续避免使用" */
  1423. #endif
  1424. /*************************************************************************
  1425. End of this File (EOF)!
  1426. Do not put anything after this part!
  1427. *************************************************************************/