i2c_master.c 62 KB

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