12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526 |
- /************************************************************************
- Project: Welling Motor Control Paltform
- Filename: i2c_master.c
- Partner Filename: i2c_master.h
- Description: I2C master driver
- Complier: IAR Embedded Workbench for ARM 8.40.2
- CPU TYPE : GD32F30x
- *************************************************************************
- Copyright (c) 2022 Welling Motor Technology(Shanghai) Co. Ltd.
- All rights reserved.
- *************************************************************************
- *************************************************************************
- Revising History (ECL of this file):
- M0_20170410, by liyue, create this file;
- ************************************************************************/
- /************************************************************************
- Beginning of File, do not put anything above here except notes
- Compiler Directives:
- *************************************************************************/
- #ifndef _I2C_MASTER_C_
- #define _I2C_MASTER_C_
- #endif
- /************************************************************************
- Included File
- *************************************************************************/
- #include "i2c_master.h"
- #include "api_rt.h"
- #include "gd32f30x_dma.h"
- /*************************************************************************
- Exported Functions (N/A)
- *************************************************************************/
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- static UWORD i2c_pvt_uwWaitCnt = 0, i2c_pvt_uwWaitCnt2 = 0;
- void i2c_voWaitEEReady(UBYTE SlaveAddr)
- {
- /* Wait at least 5ms */
- while (i2c_pvt_uwWaitCnt2 < 2)
- {
- i2c_pvt_uwWaitCnt++;
- if (i2c_pvt_uwWaitCnt == 10000)
- {
- i2c_pvt_uwWaitCnt2++;
- i2c_pvt_uwWaitCnt = 0;
- }
- }
- i2c_pvt_uwWaitCnt2 = 0;
-
- // /* GD MCU has ACK detect function */
- // ULONG ulTimeCnt = 0;
- // UWORD uwTimeoutNum = 0, uwTimeoutNum2;
- //
- // while(!I2C_EE_ComuFltFlg)
- // {
- // /* write to EEPROM enable*/
- // iGpio_Write(HW_GPIO_I2CWP_PIN,ApiGpio_LowLevel);
- // /* wait until I2C bus is idle */
- // while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) && (++ulTimeCnt < I2C_SHORT_TIMEOUT));
- // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- // {
- // uwTimeoutNum ++;
- // }
- // ulTimeCnt = 0;
- // /* send a start condition to I2C bus */
- // i2c_start_on_bus(I2C0);
- // /* wait until SBSEND bit is set */
- // while((!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) && (++ulTimeCnt < I2C_SHORT_TIMEOUT));
- // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- // {
- // uwTimeoutNum ++;
- // }
- // ulTimeCnt = 0;
- // /* send slave address to I2C bus */
- // i2c_master_addressing(I2C0, SlaveAddr, I2C_TRANSMITTER);
- // /* wait until ADDSEND bit is set */
- // while((!((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) || (i2c_flag_get(I2C0, I2C_FLAG_AERR))))&& (++ulTimeCnt < I2C_SHORT_TIMEOUT));
- // if(ulTimeCnt < I2C_SHORT_TIMEOUT)
- // {
- // if(i2c_flag_get(I2C0, I2C_FLAG_ADDSEND))
- // {
- // ulTimeCnt = 0;
- // /* clear the bit of I2C_FLAG_ADDSEND */
- // i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
- // /* send a stop condition to I2C bus */
- // i2c_stop_on_bus(I2C0);
- // /* wait until stop condition generate */
- // while((I2C_CTL0(I2C0)&I2C_CTL0_STOP) && (++ulTimeCnt < I2C_SHORT_TIMEOUT));
- // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- // {
- // uwTimeoutNum ++;
- // }
- // ulTimeCnt = 0;
- // /* exit the function */
- // I2C_EE_ComuFltFlg = FALSE;
- // break;
- // }
- // else
- // {
- // /* clear the bit of I2C_FLAG_AERR */
- // i2c_flag_clear(I2C0, I2C_FLAG_AERR);
- // /* send a stop condition to I2C bus */
- // i2c_stop_on_bus(I2C0);
- // /* wait until stop condition generate */
- // while((I2C_CTL0(I2C0)&I2C_CTL0_STOP) && (++ulTimeCnt < I2C_SHORT_TIMEOUT));
- // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- // {
- // uwTimeoutNum ++;
- // }
- // ulTimeCnt = 0;
- // }
- // }
- // else
- // {
- // ulTimeCnt = 0;
- // uwTimeoutNum2 ++;
- // if(uwTimeoutNum2 > 4)
- // {
- // I2C_EE_ComuFltFlg = TRUE;
- // break;
- // }
- // }
- //
- // /* I2C communication timeout fault */
- // if(uwTimeoutNum > 3 )
- // {
- // I2C_EE_ComuFltFlg = TRUE;
- // }
- // }
- // /* write to EEPROM disable */
- // iGpio_Write(HW_GPIO_I2CWP_PIN,ApiGpio_LowLevel);
-
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- void i2c_voDefaultWriteBuffer(void)
- {
- /* Parameter default value write*/
- UWORD *I2C_pBuffer;
- UBYTE i;
- I2C_pBuffer = &Syspara2.stMotorPara.uwPolePairs.uwDefault1;
- for (i = 0; i < I2C_MOTOR_PARA_N_WORDS; i++)
- {
- I2C_ubWriteBuffer[I2C_MOTOR_PARA_ARDDR + 2 * i] = (UBYTE)(*I2C_pBuffer >> 8);
- I2C_ubWriteBuffer[I2C_MOTOR_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*I2C_pBuffer);
- I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- I2C_pBuffer = &Syspara2.stBikePara.uwWheelPerimeter.uwDefault1;
- for (i = 0; i < I2C_BIKE_PARA_N_WORDS; i++)
- {
- I2C_ubWriteBuffer[I2C_BIKE_PARA_ARDDR + 2 * i] = (UBYTE)(*I2C_pBuffer >> 8);
- I2C_ubWriteBuffer[I2C_BIKE_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*I2C_pBuffer);
- I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- I2C_pBuffer = &Syspara2.stMControlPara.ParaFirstSetFlg.uwDefault1;
- for (i = 0; i < I2C_MCONTROL_PARA_N_WORDS; i++)
- {
- I2C_ubWriteBuffer[I2C_MCONTROL_PARA_ARDDR + 2 * i] = (UBYTE)(*I2C_pBuffer >> 8);
- I2C_ubWriteBuffer[I2C_MCONTROL_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*I2C_pBuffer);
- I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- I2C_pBuffer = &Syspara2.stSensorPara.uwTorSensorOffsetOrigin.uwDefault1;
- for (i = 0; i < I2C_SENSOR_PARA_N_WORDS; i++)
- {
- I2C_ubWriteBuffer[I2C_SENSOR_PARA_ARDDR + 2 * i] = (UBYTE)(*I2C_pBuffer >> 8);
- I2C_ubWriteBuffer[I2C_SENSOR_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*I2C_pBuffer);
- I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- I2C_pBuffer = &Syspara2.stAssistPara.uwStartupGain.uwDefault1;
- for (i = 0; i < I2C_ASSIST_PARA_N_WORDS; i++)
- {
- I2C_ubWriteBuffer[I2C_ASSIST_PARA_ARDDR + 2 * i] = (UBYTE)(*I2C_pBuffer >> 8);
- I2C_ubWriteBuffer[I2C_ASSIST_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*I2C_pBuffer);
- I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- I2C_pWriteBuffer = I2C_ubWriteBuffer;
- I2C_ubWriteBuffer[I2C_MOTOR_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MOTOR_PARA_N_BYTES) >> 8);
- I2C_ubWriteBuffer[I2C_MOTOR_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MOTOR_PARA_N_BYTES));
- I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_BIKE_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubWriteBuffer[I2C_BIKE_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_BIKE_PARA_N_BYTES) >> 8);
- I2C_ubWriteBuffer[I2C_BIKE_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_BIKE_PARA_N_BYTES));
- I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_MCONTROL_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubWriteBuffer[I2C_MCONTROL_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MCONTROL_PARA_N_BYTES) >> 8);
- I2C_ubWriteBuffer[I2C_MCONTROL_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MCONTROL_PARA_N_BYTES));
- I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_SENSOR_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubWriteBuffer[I2C_SENSOR_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_SENSOR_PARA_N_BYTES) >> 8);
- I2C_ubWriteBuffer[I2C_SENSOR_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_SENSOR_PARA_N_BYTES));
- I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_ASSIST_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubWriteBuffer[I2C_ASSIST_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_ASSIST_PARA_N_BYTES) >> 8);
- I2C_ubWriteBuffer[I2C_ASSIST_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_ASSIST_PARA_N_BYTES));
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- void i2c_voParaWriteBuffer(void)
- {
- /* Parameter real value write*/
- UWORD *I2C_pBuffer;
- UBYTE i;
-
- I2C_pBuffer = &Syspara2.stMotorPara.uwPolePairs.uwDefault1;
- for (i = 0; i < I2C_MOTOR_PARA_N_WORDS; i++)
- {
- I2C_ubWriteBuffer[I2C_MOTOR_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubWriteBuffer[I2C_MOTOR_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- I2C_pBuffer = &Syspara2.stBikePara.uwWheelPerimeter.uwDefault1;
- for (i = 0; i < I2C_BIKE_PARA_N_WORDS; i++)
- {
- I2C_ubWriteBuffer[I2C_BIKE_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubWriteBuffer[I2C_BIKE_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- I2C_pBuffer = &Syspara2.stMControlPara.ParaFirstSetFlg.uwDefault1;
- for (i = 0; i < I2C_MCONTROL_PARA_N_WORDS; i++)
- {
- I2C_ubWriteBuffer[I2C_MCONTROL_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubWriteBuffer[I2C_MCONTROL_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- I2C_pBuffer = &Syspara2.stSensorPara.uwTorSensorOffsetOrigin.uwDefault1;
- for (i = 0; i < I2C_SENSOR_PARA_N_WORDS; i++)
- {
- I2C_ubWriteBuffer[I2C_SENSOR_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubWriteBuffer[I2C_SENSOR_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- I2C_pBuffer = &Syspara2.stAssistPara.uwStartupGain.uwDefault1;
- for (i = 0; i < I2C_ASSIST_PARA_N_WORDS; i++)
- {
- I2C_ubWriteBuffer[I2C_ASSIST_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubWriteBuffer[I2C_ASSIST_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- I2C_pWriteBuffer = I2C_ubWriteBuffer;
- I2C_ubWriteBuffer[I2C_MOTOR_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MOTOR_PARA_N_BYTES) >> 8);
- I2C_ubWriteBuffer[I2C_MOTOR_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MOTOR_PARA_N_BYTES));
- I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_BIKE_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubWriteBuffer[I2C_BIKE_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_BIKE_PARA_N_BYTES) >> 8);
- I2C_ubWriteBuffer[I2C_BIKE_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_BIKE_PARA_N_BYTES));
- I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_MCONTROL_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubWriteBuffer[I2C_MCONTROL_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MCONTROL_PARA_N_BYTES) >> 8);
- I2C_ubWriteBuffer[I2C_MCONTROL_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_MCONTROL_PARA_N_BYTES));
- I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_SENSOR_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubWriteBuffer[I2C_SENSOR_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_SENSOR_PARA_N_BYTES) >> 8);
- I2C_ubWriteBuffer[I2C_SENSOR_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_SENSOR_PARA_N_BYTES));
- I2C_pWriteBuffer = I2C_ubWriteBuffer + I2C_ASSIST_PARA_ARDDR; /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubWriteBuffer[I2C_ASSIST_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_ASSIST_PARA_N_BYTES) >> 8);
- I2C_ubWriteBuffer[I2C_ASSIST_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pWriteBuffer, I2C_ASSIST_PARA_N_BYTES));
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- void i2c_voHistoryWriteBuffer(void)
- {
- UWORD *I2C_pBuffer;
- UBYTE i;
- I2C_pBuffer = &Syspara2.stHistoryPara.uwAssModSelect.uwDefault1;
- for (i = 0; i < I2C_HISTORY_PARA_N_WORDS; i++)
- {
- I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- I2C_pHistoryWriteBuffer = I2C_ubHistoyWriteBuffer;
- I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_HISTORY_PARA_N_BYTES) >> 8);
- I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_HISTORY_PARA_N_BYTES));
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- //static void i2c_voByteWrite2EE(UBYTE SlaveAddr, UBYTE WriteAddr, UBYTE Data) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
- //{
- // ULONG ulTimeCnt = 0;
- // UWORD uwTimeoutNum = 0;
- //
- // if(!I2C_EE_ComuFltFlg)
- // {
- // /* write to EEPROM enable*/
- // iGpio_Write(HW_GPIO_I2CWP_PIN,ApiGpio_LowLevel);
- // /* wait until I2C bus is idle */
- // while((i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) != 0) && (ulTimeCnt< I2C_SHORT_TIMEOUT))
- // {
- // ulTimeCnt++;
- // }
- // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- // {
- // uwTimeoutNum ++;
- // }
- // ulTimeCnt = 0;
- // /* send a start condition to I2C bus */
- // i2c_start_on_bus(I2C0);
- // /* wait until SBSEND bit is set */
- // while((i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- // {
- // ulTimeCnt++;
- // }
- // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- // {
- // uwTimeoutNum ++;
- // }
- // ulTimeCnt = 0;
- // /* send slave address to I2C bus */
- // i2c_master_addressing(I2C0, SlaveAddr, I2C_TRANSMITTER);
- // /* wait until ADDSEND bit is set */
- // while((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- // {
- // ulTimeCnt++;
- // }
- // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- // {
- // uwTimeoutNum ++;
- // }
- // ulTimeCnt = 0;
- // i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
- // /* wait until the transmit data buffer is empty */
- // while((i2c_flag_get(I2C0, I2C_FLAG_TBE) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- // {
- // ulTimeCnt++;
- // }
- // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- // {
- // uwTimeoutNum ++;
- // }
- // ulTimeCnt = 0;
- // /* writeAddr transmission */
- // i2c_data_transmit(I2C0, WriteAddr);
- // /* wait until the BTC bit is set */
- // while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- // {
- // ulTimeCnt++;
- // }
- // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- // {
- // uwTimeoutNum ++;
- // }
- // ulTimeCnt = 0;
- // /* data transmission */
- // i2c_data_transmit(I2C0, Data);
- // /* wait until the BTC bit is set */
- // while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- // {
- // ulTimeCnt++;
- // }
- // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- // {
- // uwTimeoutNum ++;
- // }
- // ulTimeCnt = 0;
- // /* send a stop condition to I2C bus */
- // i2c_stop_on_bus(I2C0);
- // /* wait until stop condition generate */
- // while((I2C_CTL0(I2C0)&I2C_CTL0_STOP) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- // {
- // ulTimeCnt++;
- // }
- // if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- // {
- // uwTimeoutNum ++;
- // }
- // ulTimeCnt = 0;
- // /* write to EEPROM disable */
- // iGpio_Write(HW_GPIO_I2CWP_PIN,ApiGpio_LowLevel);
- //
- // /* I2C EEPROM communication timeout fault */
- // if(uwTimeoutNum > 0)
- // {
- // I2C_EE_ComuFltFlg = TRUE;
- // }
- // }
- // else
- // {}
- //}
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- void i2c_voPageWrite2EE(const UBYTE *pBuffer, UBYTE SlaveAddr, UBYTE WriteAddr, UBYTE NBytesToWrite) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
- {
- ULONG ulTimeCnt = 0;
- UWORD uwTimeoutNum = 0;
-
- if(!I2C_EE_ComuFltFlg)
- {
- /* write to EEPROM enable*/
- iGpio_Write(HW_GPIO_I2CWP_PIN,ApiGpio_HighLevel);
- /* wait until I2C bus is idle */
- while((i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) != 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* send a start condition to I2C bus */
- i2c_start_on_bus(I2C0);
- /* wait until SBSEND bit is set */
- while((i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* send slave address to I2C bus */
- i2c_master_addressing(I2C0, SlaveAddr, I2C_TRANSMITTER);
- /* wait until ADDSEND bit is set */
- while((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
- /* wait until the transmit data buffer is empty */
- while((i2c_flag_get(I2C0, I2C_FLAG_TBE) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* writeAddr transmission */
- i2c_data_transmit(I2C0, WriteAddr);
- /* wait until the BTC bit is set */
- while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* data transmission */
- while (NBytesToWrite != 0)
- {
- NBytesToWrite --;
- i2c_data_transmit(I2C0, *pBuffer);
- pBuffer++; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- /* wait until the BTC bit is set */
- while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* I2C communication timeout fault */
- if(uwTimeoutNum > 3 )
- {
- I2C_EE_ComuFltFlg = TRUE;
- break;
- }
- }
- /* send a stop condition to I2C bus */
- i2c_stop_on_bus(I2C0);
- /* wait until stop condition generate */
- while((I2C_CTL0(I2C0)&I2C_CTL0_STOP) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* I2C EEPROM communication timeout fault */
- if(uwTimeoutNum > 0)
- {
- I2C_EE_ComuFltFlg = TRUE;
- }
- /* write to EEPROM disable */
-
- iGpio_Write(HW_GPIO_I2CWP_PIN,ApiGpio_LowLevel);
- }
- else
- {}
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- static void i2c_voBufferWrite2EE(const UBYTE *pBuffer, UBYTE SlaveAddr, UBYTE WriteAddr, UBYTE NBytesToWrite)
- {
- UBYTE ubNPages = 0, ubNSingleBytes = 0, ubAddr = 0, ubCnt = 0, ubTemp = 0;
-
- ubAddr = WriteAddr % I2C_EE_PAGESIZE_NBYTES;
- ubCnt = I2C_EE_PAGESIZE_NBYTES - 1 - ubAddr; // Cnt datas away from page alignment
- ubNPages = NBytesToWrite / I2C_EE_PAGESIZE_NBYTES;
- ubNSingleBytes = NBytesToWrite % I2C_EE_PAGESIZE_NBYTES;
- if (ubAddr == 0)
- {
- if (ubNPages == 0)
- {
- i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, ubNSingleBytes);
- i2c_voWaitEEReady(SlaveAddr);
- }
- else
- {
- while (ubNPages != 0)
- {
- ubNPages--;
- i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, I2C_EE_PAGESIZE_NBYTES);
- i2c_voWaitEEReady(SlaveAddr);
- WriteAddr += I2C_EE_PAGESIZE_NBYTES;
- pBuffer += I2C_EE_PAGESIZE_NBYTES; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- if (ubNSingleBytes != 0)
- {
- i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, ubNSingleBytes);
- i2c_voWaitEEReady(SlaveAddr);
- }
- }
- }
- else
- {
- if (ubNPages == 0)
- {
- if (ubNSingleBytes > ubCnt)
- {
- ubTemp = ubNSingleBytes - ubCnt;
- i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, ubCnt);
- i2c_voWaitEEReady(SlaveAddr);
- WriteAddr += ubCnt;
- pBuffer += ubCnt; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, ubTemp);
- i2c_voWaitEEReady(SlaveAddr);
- }
- else
- {
- i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, NBytesToWrite);
- i2c_voWaitEEReady(SlaveAddr);
- }
- }
- else
- {
- NBytesToWrite -= ubCnt;
- ubNPages = NBytesToWrite / I2C_EE_PAGESIZE_NBYTES;
- ubNSingleBytes = NBytesToWrite % I2C_EE_PAGESIZE_NBYTES;
- if (ubCnt != 0)
- {
- /* Write the remaining bytes of the page where WriteAddr is located */
- i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, ubCnt);
- i2c_voWaitEEReady(SlaveAddr);
- WriteAddr += ubCnt;
- pBuffer += ubCnt; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- while (ubNPages != 0)
- {
- ubNPages--;
- i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, I2C_EE_PAGESIZE_NBYTES);
- i2c_voWaitEEReady(SlaveAddr);
- WriteAddr += I2C_EE_PAGESIZE_NBYTES;
- pBuffer += I2C_EE_PAGESIZE_NBYTES; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- }
- if (ubNSingleBytes != 0)
- {
- i2c_voPageWrite2EE(pBuffer, SlaveAddr, WriteAddr, I2C_EE_PAGESIZE_NBYTES);
- i2c_voWaitEEReady(SlaveAddr);
- }
- }
- }
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- void i2c_voInfoWrite2EE(const I2C_TX_COF *coef, I2C_TX_OUT *out)
- {
- UBYTE ubNBytes;
- UBYTE ubReTX1;
- UBYTE ubSlaveAddr;
- UBYTE ubWriteAddr;
- ubNBytes = I2C_TX1_NBYTES;
- ubReTX1 = I2C_RETX1_TIMES;
- #if(ubReTX1 >= 2)
- ubReTX1 = 2;
- #endif
- ubWriteAddr = 0x00;
- ubSlaveAddr = I2C_SLAVEADDR_BLOCK1;
- while (ubReTX1 != 0)
- {
- ubReTX1--;
- I2C_pWriteBuffer = I2C_ubWriteBuffer;
- if (ubReTX1 == 1)
- {
- ubSlaveAddr = I2C_SLAVEADDR_BLOCK2;
- }
- if (ubReTX1 == 0)
- {
- ubSlaveAddr = I2C_SLAVEADDR_BLOCK1;
- }
- i2c_voBufferWrite2EE(I2C_pWriteBuffer, ubSlaveAddr, ubWriteAddr, ubNBytes);
- }
- if ((ubReTX1 == 0) && (I2C_EE_ComuFltFlg != TRUE))
- {
- out->blTX1FinishFlg = TRUE;
- }
- else
- {
- out->blTX1FinishFlg = FALSE;
- }
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- void i2c_voHistoryWrite2EE(const I2C_TX_COF *coef, I2C_TX_OUT *out)
- {
- UBYTE ubNBytes;
- UBYTE ubReTX2;
- UBYTE ubSlaveAddr;
- UBYTE ubWriteAddr;
- ubNBytes = I2C_TX2_NBYTES;
- ubReTX2 = I2C_RETX2_TIMES;
- #if(ubReTX2 >= 2)
- ubReTX2 = 2;
- #endif
- ubSlaveAddr = I2C_SLAVEADDR_BLOCK3;
- ubWriteAddr = 0x00;
- while (ubReTX2 != 0)
- {
- ubReTX2--;
- I2C_pHistoryWriteBuffer = I2C_ubHistoyWriteBuffer;
- if (ubReTX2 == 1)
- {
- ubSlaveAddr = I2C_SLAVEADDR_BLOCK4;
- }
- if (ubReTX2 == 0)
- {
- ubSlaveAddr = I2C_SLAVEADDR_BLOCK3;
- }
- i2c_voBufferWrite2EE(I2C_pHistoryWriteBuffer, ubSlaveAddr, ubWriteAddr, ubNBytes);
- }
- if ((ubReTX2 == 0) && (I2C_EE_ComuFltFlg != TRUE))
- {
- out->blTX2FinishFlg = TRUE;
- }
- else
- {
- out->blTX2FinishFlg = FALSE;
- }
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- void i2c_bus_reset(void)
- {
- i2c_deinit(I2C0);
- /* configure SDA/SCL for GPIO */
- GPIO_BC(GPIOB) |= GPIO_PIN_6;
- GPIO_BC(GPIOB) |= GPIO_PIN_7;
- gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
- gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
- __NOP();
- __NOP();
- __NOP();
- __NOP();
- __NOP();
- GPIO_BOP(GPIOB) |= GPIO_PIN_6;
- __NOP();
- __NOP();
- __NOP();
- __NOP();
- __NOP();
- GPIO_BOP(GPIOB) |= GPIO_PIN_7;
- /* connect I2C_SCL_PIN to I2C_SCL */
- /* connect I2C_SDA_PIN to I2C_SDA */
- gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
- gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
- /* configure the I2CX interface */
- /* configure I2C0 clock */
- i2c_clock_config(I2C0, 100000, I2C_DTCY_2);
-
- /* configure I2C0 address */
- i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C_SLAVEADDR_BLOCK1);
-
- /* enable acknowledge */
- i2c_ack_config(I2C0, I2C_ACK_ENABLE);
-
- // /* enable I2C0 DMA */
- // i2c_dma_config(I2C0, I2C_DMA_ON);
-
- /* enable I2C0 */
- i2c_enable(I2C0);
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- void i2c_voSysparaReadFromEE(I2C_RXCRC_OUT *out) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
- {
-
- UWORD timeout = 0;
- UBYTE ubRdNBytes = 0, ubRdSlaveAddr = 0, ubRdAddr = 0;
- UBYTE state = (UBYTE)I2C_START;
- UBYTE read_cycle = 0;
- UBYTE ubRdCnt = 2;
-
- UBYTE i2c_timeout_flag = 0;
- UBYTE *p_buffer;
- while(ubRdCnt != 0)
- {
- ubRdCnt--;
- /* enable acknowledge */
- i2c_ack_config(I2C0, I2C_ACK_ENABLE);
- if (ubRdCnt == 1)
- {
- ubRdSlaveAddr = I2C_SLAVEADDR_BLOCK1;
- ubRdAddr = 0x00;
- ubRdNBytes = I2C_RX1_NBYTES;
- p_buffer = I2C_ubReadBuffer[0];
- i2c_timeout_flag = 0;
- }
- else if (ubRdCnt == 0)
- {
- ubRdSlaveAddr = I2C_SLAVEADDR_BLOCK3;
- ubRdAddr = 0x00;
- ubRdNBytes = I2C_RX2_NBYTES;
- p_buffer = I2C_ubReadBuffer[1];
- i2c_timeout_flag = 0;
- }
- else
- {
- //do nothing
- }
-
- while(i2c_timeout_flag ==0)
- {
- switch(state)
- {
- case I2C_START:
- if(RESET == read_cycle)
- {
- /* disable I2C0 */
- i2c_disable(I2C0);
- /* enable I2C0 */
- i2c_enable(I2C0);
- /* enable acknowledge */
- i2c_ack_config(I2C0, I2C_ACK_ENABLE);
- /* i2c master sends start signal only when the bus is idle */
- while((i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) != 0) && (timeout < I2C_SHORT_TIMEOUT))
- {
- timeout++;
- }
-
- if(timeout < I2C_SHORT_TIMEOUT)
- {
- /* send the start signal */
- i2c_start_on_bus(I2C0);
- timeout = 0;
- state = (UBYTE)I2C_SEND_ADDRESS;
- }
- else
- {
- i2c_bus_reset();
- timeout = 0;
- state = (UBYTE)I2C_START;
-
- }
- }
- else
- {
- i2c_start_on_bus(I2C0);
- timeout = 0;
- state = (UBYTE)I2C_SEND_ADDRESS;
- }
- break;
- case I2C_SEND_ADDRESS:
- /* i2c master sends START signal successfully */
- while((i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == 0) && (timeout < I2C_SHORT_TIMEOUT))
- {
- timeout++;
- }
- if(timeout < I2C_SHORT_TIMEOUT)
- {
- if(RESET == read_cycle)
- {
- i2c_master_addressing(I2C0, ubRdSlaveAddr, I2C_TRANSMITTER);
- state = (UBYTE)I2C_CLEAR_ADDRESS_FLAG;
- }
- else
- {
- i2c_master_addressing(I2C0, ubRdSlaveAddr, I2C_RECEIVER);
- state = (UBYTE)I2C_CLEAR_ADDRESS_FLAG;
- }
- timeout = 0;
- }
- else
- {
- timeout = 0;
- state = (UBYTE)I2C_START;
- read_cycle = 0;
-
- }
- break;
- case I2C_CLEAR_ADDRESS_FLAG:
- /* address flag set means i2c slave sends ACK */
- while((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) == 0) && (timeout < I2C_SHORT_TIMEOUT))
- {
- timeout++;
- }
- if(timeout < I2C_SHORT_TIMEOUT)
- {
- i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
- timeout = 0;
- state = (UBYTE)I2C_TRANSMIT_DATA;
- } else
- {
- timeout = 0;
- state = (UBYTE)I2C_START;
- read_cycle = 0;
-
- }
- break;
- case I2C_TRANSMIT_DATA:
- if(RESET == read_cycle)
- {
- /* wait until the transmit data buffer is empty */
- while((i2c_flag_get(I2C0, I2C_FLAG_TBE) == 0) && (timeout < I2C_SHORT_TIMEOUT))
- {
- timeout++;
- }
- if(timeout < I2C_SHORT_TIMEOUT)
- {
- /* send the EEPROM's internal address to write to : only one byte address */
- i2c_data_transmit(I2C0, ubRdAddr);
- timeout = 0;
- }
- else
- {
- timeout = 0;
- state = (UBYTE)I2C_START;
- read_cycle = 0;
-
- }
- /* wait until BTC bit is set */
- while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (timeout < I2C_SHORT_TIMEOUT))
- {
- timeout++;
- }
- if(timeout < I2C_SHORT_TIMEOUT)
- {
- timeout = 0;
- state = (UBYTE)I2C_START;
- read_cycle++;
- } else
- {
- timeout = 0;
- state = (UBYTE)I2C_START;
- read_cycle = 0;
-
- }
- }
- else
- {
- /* one byte master reception procedure (polling) */
- if(ubRdNBytes < 2)
- {
- /* disable acknowledge */
- i2c_ack_config(I2C0, I2C_ACK_DISABLE);
- /* clear ADDSEND register by reading I2C_STAT0 then I2C_STAT1 register (I2C_STAT0 has already been read) */
- i2c_flag_get(I2C0, I2C_FLAG_ADDSEND);
- /* send a stop condition to I2C bus*/
- i2c_stop_on_bus(I2C0);
- /* wait for the byte to be received */
- while(i2c_flag_get(I2C0, I2C_FLAG_RBNE) == 0)
- {
- // do nothing
- }
- /* read the byte received from the EEPROM */
- *p_buffer = i2c_data_receive(I2C0);
- /* decrement the read bytes counter */
- ubRdNBytes--;
- timeout = 0;
- state = (UBYTE)I2C_STOP;
- }
- else
- { /* more than one byte master reception procedure (DMA) */
- dma_transfer_number_config(DMA0, DMA_CH6, ubRdNBytes);
-
- DMA_CH6MADDR(DMA0) = (ULONG)p_buffer;
-
- i2c_dma_last_transfer_config(I2C0, I2C_DMALST_ON);
- /* enable I2C0 DMA */
- i2c_dma_config(I2C0, I2C_DMA_ON);
- /* enable DMA0 channel5 */
- dma_channel_enable(DMA0, DMA_CH6);
- /* wait until BTC bit is set */
- while(dma_flag_get(DMA0, DMA_CH6, DMA_FLAG_FTF) == 0)
- {
- // do nothing
- }
- state = (UBYTE)I2C_STOP;
- }
- }
- break;
- case I2C_STOP:
- /* send a stop condition to I2C bus */
- i2c_stop_on_bus(I2C0);
- /* i2c master sends STOP signal successfully */
- while((I2C_CTL0(I2C0) & I2C_CTL0_STOP) && (timeout < I2C_SHORT_TIMEOUT))
- {
- timeout++;
- }
- if(timeout < I2C_SHORT_TIMEOUT)
- {
- timeout = 0;
- i2c_timeout_flag = 1;
- state = (UBYTE)I2C_START;
-
- /* disable DMA0 CH6 */
- dma_channel_disable(DMA0, DMA_CH6);
- /* disable I2C0 DMA */
- i2c_dma_config(I2C0, I2C_DMA_OFF);
- i2c_dma_last_transfer_config(I2C0, I2C_DMALST_OFF);
- }
- else
- {
- timeout = 0;
- //state = I2C_START;
- state = (UBYTE)I2C_STOP;
- read_cycle = 0;
- }
-
- break;
- default:
- state = (UBYTE)I2C_START;
- read_cycle = 0;
- i2c_timeout_flag = 1;
- timeout = 0;
-
- break;
- }
- }
-
- }
-
- i2c_voReadBufferCRC(out);
- i2c_voGetValueFrmBuffer(out);
- out->ReadFinishFlg = TRUE;
-
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- UWORD i2c_uwCRCCcitt(const UBYTE *ptubBuf, UWORD length)
- {
- UBYTE b = 0;
- UWORD crc = 0xffff;
- UWORD i, j;
- for (i = 0; i < length; i++)
- {
- for (j = 0; j < 8; j++)
- {
- b = (UBYTE)(((ptubBuf[i] << j) & 0x80) ^ ((crc & 0x8000) >> 8)); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- crc <<= 1;
- if (b != 0)
- {
- crc ^= 0x1021; // crc = crc^(0x10000^0x11021)
- }
- }
- }
- return crc;
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- void i2c_voReadBufferCRC(I2C_RXCRC_OUT *out)
- {
- UWORD uwMotorParaCRC, uwBikeParaCRC, uwMControlParaCRC;
- UWORD uwSensorParaCRC, uwAssistParaCRC, uwHistoryParaCRC;
- UWORD uwMotorParaRdCRC, uwBikeParaRdCRC, uwMControlParaRdCRC;
- UWORD uwSensorParaRdCRC, uwAssistParaRdCRC, uwHistoryParaRdCRC;
- I2C_pReadBuffer = I2C_ubReadBuffer[0];
- uwMotorParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer, I2C_MOTOR_PARA_N_BYTES);
- uwBikeParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_BIKE_PARA_ARDDR, I2C_BIKE_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- uwMControlParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_MCONTROL_PARA_ARDDR, I2C_MCONTROL_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- uwSensorParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_SENSOR_PARA_ARDDR, I2C_SENSOR_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- uwAssistParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_ASSIST_PARA_ARDDR, I2C_ASSIST_PARA_N_BYTES); /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
- I2C_pReadBuffer = I2C_ubReadBuffer[1];
- uwHistoryParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer, I2C_HISTORY_PARA_N_BYTES);
- uwMotorParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_MOTOR_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_MOTOR_PARA_CRC_ARDDR + 1];
- uwBikeParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_BIKE_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_BIKE_PARA_CRC_ARDDR + 1];
- uwMControlParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_CRC_ARDDR + 1];
- uwSensorParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_SENSOR_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_SENSOR_PARA_CRC_ARDDR + 1];
- uwAssistParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_ASSIST_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_ASSIST_PARA_CRC_ARDDR + 1];
- uwHistoryParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[1][I2C_HISTORY_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[1][I2C_HISTORY_PARA_CRC_ARDDR + 1];
- if (uwMotorParaCRC != uwMotorParaRdCRC)
- {
- out->blMotorParaFltFlg = TRUE;
- }
- if (uwBikeParaCRC != uwBikeParaRdCRC)
- {
- out->blBikeParaFltFlg = TRUE;
- }
- if (uwMControlParaCRC != uwMControlParaRdCRC)
- {
- out->blMControlParaFltFlg = TRUE;
- }
- if (uwSensorParaCRC != uwSensorParaRdCRC)
- {
- out->blSensorParaFltFlg = TRUE;
- }
- if (uwAssistParaCRC != uwAssistParaRdCRC)
- {
- out->blAssistParaFltFlg = TRUE;
- }
- if (uwHistoryParaCRC != uwHistoryParaRdCRC)
- {
- out->blHistoryParaFltFlg = TRUE;
- }
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- void i2c_voGetValueFrmBuffer(const I2C_RXCRC_OUT *out)
- {
- UBYTE j = 0;
- if (out->blMotorParaFltFlg != TRUE)
- {
- for (j = 0; j < I2C_MOTOR_PARA_N_WORDS; j++)
- {
- 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];
- }
- }
- else
- {}
- if (out->blBikeParaFltFlg != TRUE)
- {
- for (j = 0; j < I2C_BIKE_PARA_N_WORDS; j++)
- {
- 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];
- }
- }
- else
- {}
- if (out->blMControlParaFltFlg != TRUE)
- {
- for (j = 0; j < I2C_MCONTROL_PARA_N_WORDS; j++)
- {
- I2C_uwMControlRead[j] =
- (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_ARDDR + 2 * j] << 8) + I2C_ubReadBuffer[0][I2C_MCONTROL_PARA_ARDDR + 2 * j + 1];
- }
- }
- else
- {}
- if (out->blSensorParaFltFlg != TRUE)
- {
- for (j = 0; j < I2C_SENSOR_PARA_N_WORDS; j++)
- {
- 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];
- }
- }
- else
- {}
- if (out->blAssistParaFltFlg != TRUE)
- {
- for (j = 0; j < I2C_ASSIST_PARA_N_WORDS; j++)
- {
- I2C_uwAssistParaRead[j] =
- (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_ASSIST_PARA_ARDDR + 2 * j] << 8) + I2C_ubReadBuffer[0][I2C_ASSIST_PARA_ARDDR + 2 * j + 1];
- }
- }
- else
- {}
- if (out->blHistoryParaFltFlg != TRUE)
- {
- for (j = 0; j < I2C_HISTORY_PARA_N_WORDS; j++)
- {
- I2C_uwHistoryParaRead[j] =
- (UWORD)((UWORD)I2C_ubReadBuffer[1][I2C_HISTORY_PARA_ARDDR + 2 * j] << 8) + I2C_ubReadBuffer[1][I2C_HISTORY_PARA_ARDDR + 2 * j + 1];
- }
- }
- else
- {}
- Syspara2.stMotorPara.uwPolePairs.uwReal = I2C_uwMotorParaRead[0];
- Syspara2.stMotorPara.uwRsmOhm.uwReal = I2C_uwMotorParaRead[1];
- Syspara2.stMotorPara.uwLduH.uwReal = I2C_uwMotorParaRead[2];
- Syspara2.stMotorPara.uwLquH.uwReal = I2C_uwMotorParaRead[3];
- Syspara2.stMotorPara.uwFluxmWb.uwReal = I2C_uwMotorParaRead[4];
- Syspara2.stMotorPara.uwIdMaxA.uwReal = I2C_uwMotorParaRead[5];
- Syspara2.stMotorPara.uwIdMinA.uwReal = I2C_uwMotorParaRead[6];
- Syspara2.stMotorPara.uwRSpdRpm.uwReal = I2C_uwMotorParaRead[7];
- Syspara2.stMotorPara.uwRPwrWt.uwReal = I2C_uwMotorParaRead[8];
- Syspara2.stMotorPara.uwRCurA.uwReal = I2C_uwMotorParaRead[9];
- Syspara2.stMotorPara.uwRVolV.uwReal = I2C_uwMotorParaRead[10];
- Syspara2.stMotorPara.uwJD.uwReal = I2C_uwMotorParaRead[11];
- Syspara2.stMotorPara.uwTorMaxNm.uwReal = I2C_uwMotorParaRead[12];
- Syspara2.stBikePara.uwWheelPerimeter.uwReal = I2C_uwBikeParaRead[0];
- Syspara2.stBikePara.uwMechRationMotor.uwReal = I2C_uwBikeParaRead[1];
- Syspara2.stBikePara.uwAssistMaxSpdKmH.uwReal = I2C_uwBikeParaRead[2];
- Syspara2.stBikePara.uwThrottleMaxSpdKmH.uwReal = I2C_uwBikeParaRead[3];
- Syspara2.stBikePara.uwNmFrontChainring.uwReal = I2C_uwBikeParaRead[4];
- Syspara2.stBikePara.uwNmBackChainring.uwReal = I2C_uwBikeParaRead[5];
- Syspara2.stBikePara.uwAssistSelect1.uwReal = I2C_uwBikeParaRead[6];
- Syspara2.stBikePara.uwAssistSelect2.uwReal = I2C_uwBikeParaRead[7];
- Syspara2.stBikePara.uwLightVoltage.uwReal = I2C_uwBikeParaRead[8];
- Syspara2.stBikePara.swDeltPerimeter.swReal = (SWORD)I2C_uwBikeParaRead[9];
- Syspara2.stBikePara.uwStartMode.uwReal = I2C_uwBikeParaRead[10];
- Syspara2.stBikePara.uwAutoPowerOffTime.uwReal = I2C_uwBikeParaRead[11];
- Syspara2.stMControlPara.ParaFirstSetFlg.uwReal = I2C_uwMControlRead[0];
- Syspara2.stMControlPara.SpiOffsetFirstSetFlg.uwReal = I2C_uwMControlRead[1];
- Syspara2.stMControlPara.uwSPIPosOffsetOrigin.uwReal = I2C_uwMControlRead[2];
- Syspara2.stMControlPara.uwSPIPosOffsetNow.uwReal = I2C_uwMControlRead[3];
- Syspara2.stMControlPara.uwIPeakMaxA.uwReal = I2C_uwMControlRead[4];
- Syspara2.stMControlPara.uwAlamOCurA.uwReal = I2C_uwMControlRead[5];
- Syspara2.stMControlPara.uwAlamOVolV.uwReal = I2C_uwMControlRead[6];
- Syspara2.stMControlPara.uwAlamUVolV.uwReal = I2C_uwMControlRead[7];
- Syspara2.stMControlPara.uwAlamOverSpdRpm.uwReal = I2C_uwMControlRead[8];
- Syspara2.stMControlPara.uwAlamOverHeatCe.uwReal = I2C_uwMControlRead[9];
- Syspara2.stMControlPara.uwAlamRecHeatCe.uwReal = I2C_uwMControlRead[10];
- Syspara2.stMControlPara.uwPwrLimitStartCe.uwReal = I2C_uwMControlRead[11];
- Syspara2.stSensorPara.uwTorSensorOffsetOrigin.uwReal = I2C_uwSensorRead[0];
- Syspara2.stSensorPara.uwTorSensorOffsetNow1.uwReal = I2C_uwSensorRead[1];
- Syspara2.stSensorPara.uwTorSensorOffsetNow2.uwReal = I2C_uwSensorRead[2];
- Syspara2.stSensorPara.uwTorSensorOffsetNow3.uwReal = I2C_uwSensorRead[3];
- Syspara2.stSensorPara.uwTorSensorOffsetNow4.uwReal = I2C_uwSensorRead[4];
- Syspara2.stSensorPara.uwBikeTorMaxNm.uwReal = I2C_uwSensorRead[5];
- Syspara2.stSensorPara.uwBikeTor1StepRealNm.uwReal = I2C_uwSensorRead[6];
- Syspara2.stSensorPara.uwBikeTor1StepADC.uwReal = I2C_uwSensorRead[7];
- Syspara2.stSensorPara.uwBikeTor2StepRealNm.uwReal = I2C_uwSensorRead[8];
- Syspara2.stSensorPara.uwBikeTor2StepADC.uwReal = I2C_uwSensorRead[9];
- Syspara2.stSensorPara.uwBikeTor3StepRealNm.uwReal = I2C_uwSensorRead[10];
- Syspara2.stSensorPara.uwBikeTor3StepADC.uwReal = I2C_uwSensorRead[11];
- Syspara2.stSensorPara.uwBikeTor4StepRealNm.uwReal = I2C_uwSensorRead[12];
- Syspara2.stSensorPara.uwBikeTor4StepADC.uwReal = I2C_uwSensorRead[13];
- Syspara2.stSensorPara.uwCadSensorPulseNm.uwReal = I2C_uwSensorRead[14];
- Syspara2.stSensorPara.uwBikeSpdSensorPulseNm.uwReal = I2C_uwSensorRead[15];
- Syspara2.stAssistPara.uwStartupGain.uwReal = I2C_uwAssistParaRead[0];
- Syspara2.stAssistPara.uwStartcruiseGain.uwReal = I2C_uwAssistParaRead[1];
- Syspara2.stAssistPara.uwAssistStartNm.uwReal = I2C_uwAssistParaRead[2];
- Syspara2.stAssistPara.uwAssistStopNm.uwReal = I2C_uwAssistParaRead[3];
- Syspara2.stAssistPara.uwStartUpGainStep.uwReal = I2C_uwAssistParaRead[4];
- Syspara2.stAssistPara.uwStartUpCadNm.uwReal = I2C_uwAssistParaRead[5];
- Syspara2.stAssistPara.uwTorLPFCadNm.uwReal = I2C_uwAssistParaRead[6];
- Syspara2.stAssistPara.uwSpeedAssistSpdRpm.uwReal = I2C_uwAssistParaRead[7];
- Syspara2.stAssistPara.uwSpeedAssistIMaxA.uwReal = I2C_uwAssistParaRead[8];
- Syspara2.stAssistPara.uwAssistLimitBikeSpdStart.uwReal = I2C_uwAssistParaRead[9];
- Syspara2.stAssistPara.uwAssistLimitBikeSpdStop.uwReal = I2C_uwAssistParaRead[10];
- Syspara2.stAssistPara.uwCadenceAssistWeight.uwReal = I2C_uwAssistParaRead[11];
- Syspara2.stHistoryPara.uwAssModSelect.uwReal = I2C_uwHistoryParaRead[0];
- Syspara2.stHistoryPara.uwOpenTimes.uwReal = I2C_uwHistoryParaRead[1];
- Syspara2.stHistoryPara.uwUsedTimeH.uwReal = I2C_uwHistoryParaRead[2];
- Syspara2.stHistoryPara.uwUsedTimeL.uwReal = I2C_uwHistoryParaRead[3];
- Syspara2.stHistoryPara.uwNTCTempMaxCe.uwReal = I2C_uwHistoryParaRead[4];
- Syspara2.stHistoryPara.uwNTCTempMinCe.uwReal = I2C_uwHistoryParaRead[5];
- Syspara2.stHistoryPara.uwAlamHOcurTimes.uwReal = I2C_uwHistoryParaRead[6];
- Syspara2.stHistoryPara.uwAlamSOcurTimes.uwReal = I2C_uwHistoryParaRead[7];
- Syspara2.stHistoryPara.uwAlamOHeatTimes.uwReal = I2C_uwHistoryParaRead[8];
- Syspara2.stHistoryPara.uwAlamRotorLockTimes.uwReal = I2C_uwHistoryParaRead[9];
- Syspara2.stHistoryPara.uwAlamPhsLossTimes.uwReal = I2C_uwHistoryParaRead[10];
- Syspara2.stHistoryPara.uwAlamOVolTimes.uwReal = I2C_uwHistoryParaRead[11];
- Syspara2.stHistoryPara.uwAlamUVolTimes.uwReal = I2C_uwHistoryParaRead[12];
- Syspara2.stHistoryPara.uwAlamComOTimeTimes.uwReal = I2C_uwHistoryParaRead[13];
- Syspara2.stHistoryPara.uwG1AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[14];
- Syspara2.stHistoryPara.uwG2AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[15];
- Syspara2.stHistoryPara.uwG3AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[16];
- Syspara2.stHistoryPara.uwG4AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[17];
- Syspara2.stHistoryPara.uwG5AvgPwrConsumption.uwReal = I2C_uwHistoryParaRead[18];
- Syspara2.stHistoryPara.uwODOTripH.uwReal = I2C_uwHistoryParaRead[19];
- Syspara2.stHistoryPara.uwODOTripL.uwReal = I2C_uwHistoryParaRead[20];
- Syspara2.stHistoryPara.uwODOTimeH.uwReal = I2C_uwHistoryParaRead[21];
- Syspara2.stHistoryPara.uwODOTimeL.uwReal = I2C_uwHistoryParaRead[22];
- Syspara2.stHistoryPara.uwTripSumH.uwReal = I2C_uwHistoryParaRead[23];
- Syspara2.stHistoryPara.uwTripSumL.uwReal = I2C_uwHistoryParaRead[24];
- Syspara2.stHistoryPara.uwTripSumTimeH.uwReal = I2C_uwHistoryParaRead[25];
- Syspara2.stHistoryPara.uwTripSumTimeL.uwReal = I2C_uwHistoryParaRead[26];
- Syspara2.stHistoryPara.uwTorSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[27];
- Syspara2.stHistoryPara.uwCadSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[28];
- Syspara2.stHistoryPara.uwBikeSpdSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[29];
- Syspara2.stHistoryPara.uwPosSensorAlamTimes.uwReal = I2C_uwHistoryParaRead[30];
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- void i2c_voWriteTest(void)
- {
- UBYTE WriteBuffer[4];
- UBYTE *pBuffer;
-
- WriteBuffer[0] = 0x06;
- WriteBuffer[1] = 0x08;
- WriteBuffer[2] = 0x0A;
- WriteBuffer[3] = 0x01;
- pBuffer = WriteBuffer;
- i2c_voPageWrite2EE(pBuffer, I2C_SLAVEADDR_BLOCK1, 0x00, 4);
- }
- /*************************************************************************
- Function:
- Description:
- Call by:
- Input Variables:
- Output/Return Variables:
- Subroutine Call:
- Reference:
- *************************************************************************/
- void i2c_voReadTest(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
- {
- UBYTE ReadBuffer[6];
-
- ULONG ulTimeCnt = 0;
- UWORD uwTimeoutNum = 0;
- UWORD uwReadNBytes = 6;
-
- /* wait until I2C bus is idle */
- while((i2c_flag_get(I2C0, I2C_FLAG_I2CBSY) != 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* send a start condition to I2C bus */
- i2c_start_on_bus(I2C0);
- /* wait until SBSEND bit is set */
- while((i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* send slave address to I2C bus */
- i2c_master_addressing(I2C0, I2C_SLAVEADDR_BLOCK1, I2C_TRANSMITTER);
- /* wait until ADDSEND bit is set */
- while((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* clear ADDSEND bit */
- i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
- /* wait until the TBE bit is set */
- while((i2c_flag_get(I2C0, I2C_FLAG_TBE) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* readAddr transmission */
- i2c_data_transmit(I2C0, 0x00);
- /* wait until the BTC bit is set */
- while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
-
- /* send a start condition to I2C bus */
- i2c_start_on_bus(I2C0);
- /* wait until SBSEND bit is set */
- while((i2c_flag_get(I2C0, I2C_FLAG_SBSEND) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* send slave address to I2C bus */
- i2c_master_addressing(I2C0, I2C_SLAVEADDR_BLOCK1, I2C_RECEIVER);
- /* wait until ADDSEND bit is set */
- while((i2c_flag_get(I2C0, I2C_FLAG_ADDSEND) == 0)&& (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* clear ADDSEND bit */
- i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
-
- while(uwReadNBytes != 0)
- {
- uwReadNBytes--;
- if(2 == uwReadNBytes)
- {
- /* wait until BTC bit is set */
- while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* disable acknowledge */
- i2c_ack_config(I2C0, I2C_ACK_DISABLE);
- }
- if(1 == uwReadNBytes)
- {
- /* wait until BTC bit is set */
- while((i2c_flag_get(I2C0, I2C_FLAG_BTC) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- /* send a stop condition to I2C bus */
- i2c_stop_on_bus(I2C0);
- }
-
- while((i2c_flag_get(I2C0, I2C_FLAG_RBNE) == 0) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
- ReadBuffer[5 - uwReadNBytes] = i2c_data_receive(I2C0);
- }
-
-
- /* wait until stop condition generate */
- while((I2C_CTL0(I2C0)&I2C_CTL0_STOP) && (ulTimeCnt < I2C_SHORT_TIMEOUT))
- {
- ulTimeCnt++;
- }
- if(ulTimeCnt == I2C_SHORT_TIMEOUT)
- {
- uwTimeoutNum ++;
- }
- ulTimeCnt = 0;
-
- if(uwTimeoutNum > 3)
- {
- I2C_EE_ComuFltFlg = TRUE;
- }
- }
- /*************************************************************************
- Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
- All rights reserved.
- *************************************************************************/
- #ifdef _I2C_MASTER_C_
- #undef _I2C_MASTER_C_ /* parasoft-suppress MISRA2004-19_6 "本项目中无法更改,后续避免使用" */
- #endif
- /*************************************************************************
- End of this File (EOF)!
- Do not put anything after this part!
- *************************************************************************/
|