i2c_master.c 52 KB

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