i2c_master.c 64 KB

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