#include "MAIN.H" #include "user.H" //can信息 UnInfCan UnInfCan_1 _at_ 0xF5E8; UnSwSample UnSwSample_1 = {0}; UnSwOut UnSwOut_1 = {0}; //CAN发送周期 uword CntCan_1 = 0; bit FlgCan_1 = 0; //第一次采集到有效数据指示 bit FlgOneTime = 0; uword RgCanPerid = 1000; //PWM 20181227 ubyte PwmH[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; uword adc_result = 0; //RAM重启保存标志 ubyte RestartDataFlg1 _at_ 0xF5E7; ubyte RestartDataFlg2 _at_ 0xF600; //KGF保存数据 uword RestartDataKGF _at_ 0xF5E5; MotorDirection motor_dir; MotorState motor_sta; ubyte can_error_cnt = 0; ubyte can_error_flg = 0; //----------------------------------------------------------------------- //RTC定时器 //----------------------------------------------------------------------- void RTCProcess(void) { //************************************************************************ //////CAN发送周期 if(FlgCan_1){CntCan_1++;if(CntCan_1 >= RgCanPerid){FlgCan_1=0; CntCan_1=0;}}else{CntCan_1=0;} //************************************************************************ } //初始化完成发送CAN帧 20210706 //ubyte *pStt, 发送数据,只发送两个字节 void InitCanTransmit(ubyte InitCanTransmit1,ubyte InitCanTransmit2) { ubyte InitCanTransmitbuf[8] = {0,0,0,0,0,0,0,0}; //---------------------------------------------------------------- InitCanTransmitbuf[0] = 0; InitCanTransmitbuf[1] = 0; InitCanTransmitbuf[2] = InitCanTransmit1; InitCanTransmitbuf[3] = InitCanTransmit2; InitCanTransmitbuf[4] = 0; InitCanTransmitbuf[5] = 0; InitCanTransmitbuf[6] = 0; InitCanTransmitbuf[7] = 0; // CAN_waitTransmit(DF_SwTx);//不需要等待上一帧发送完成,因为这是第一次发送 //// Password(); CAN_vLoadData(DF_SwTxInit, (ulong *)(InitCanTransmitbuf)); // 装载数据 CAN_vTransmit(DF_SwTxInit); } //输出PWM 20181227 /* ubyte *pStt, 状态机变量 bit Cmd, 状态机输入,1,根据PwmH的值来决定输出,0,输出0 bit Out, 状态机输出 ubyte *pCnt, 定时计数器 ubyte *pPwmH 状态机参数,PWM的高电平时间 */ bit funcPwmOut(ubyte *pStt,bit Cmd,ubyte *pCnt,ubyte *pPwmH) { ubyte PwmL = 0; bit Out = 0; //------------------------------------------------------------------------------------------------ if((*pPwmH) > dfPwmH)(*pPwmH) = dfPwmH; //限制最大值 PwmL = dfPwmH - (*pPwmH);//计算PWM低电平 if((1 == Cmd) ) { if(0 == (*pPwmH)) //高电平为0,表示PWM无效,由Cmd来控制,Cmd为1输出1,Cmd为0,输出0 { Out = 1; (*pStt) = 0; } else { switch((*pStt)) { case 0: (*pCnt) = 0; (*pStt) = 1; Out = 1; break; case 1: if((*pCnt) >= (*pPwmH)) { (*pCnt) = 0; (*pStt) = 2; Out = 0; } else { (*pCnt)++; (*pStt) = 1; Out = 1; } break; case 2: if((*pCnt) >= PwmL) { (*pCnt) = 0; (*pStt) = 1; Out = 1; } else { (*pCnt)++; (*pStt) = 2; Out = 0; } break; //----------------------------------------------------- default:; }//switch }//else }//if else { Out = 0; (*pStt) = 0; } return Out; } //根据接收的CAN缓冲区数据驱动相应LED指示灯。 void LedDr(void) { static ubyte RgSTT[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; static ubyte CntTime[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; ubyte i = 0; //------------------------------------------------------------------------------------------------ dfOut_01 = funcPwmOut(&RgSTT[0 ],dfCmd_01,&CntTime[0 ],&PwmH[0 ]); dfOut_02 = funcPwmOut(&RgSTT[1 ],dfCmd_02,&CntTime[1 ],&PwmH[1 ]); dfOut_03 = funcPwmOut(&RgSTT[2 ],dfCmd_03,&CntTime[2 ],&PwmH[2 ]); dfOut_04 = funcPwmOut(&RgSTT[3 ],dfCmd_04,&CntTime[3 ],&PwmH[3 ]); dfOut_05 = funcPwmOut(&RgSTT[4 ],dfCmd_05,&CntTime[4 ],&PwmH[4 ]); dfOut_06 = funcPwmOut(&RgSTT[5 ],dfCmd_06,&CntTime[5 ],&PwmH[5 ]); dfOut_07 = funcPwmOut(&RgSTT[6 ],dfCmd_07,&CntTime[6 ],&PwmH[6 ]); dfOut_08 = funcPwmOut(&RgSTT[7 ],dfCmd_08,&CntTime[7 ],&PwmH[7 ]); dfOut_09 = funcPwmOut(&RgSTT[8 ],dfCmd_09,&CntTime[8 ],&PwmH[8 ]); dfOut_10 = funcPwmOut(&RgSTT[9 ],dfCmd_10,&CntTime[9 ],&PwmH[9 ]); dfOut_11 = funcPwmOut(&RgSTT[10],dfCmd_11,&CntTime[10],&PwmH[10]); dfOut_12 = funcPwmOut(&RgSTT[11],dfCmd_12,&CntTime[11],&PwmH[11]); dfOut_13 = funcPwmOut(&RgSTT[12],dfCmd_13,&CntTime[12],&PwmH[12]); dfOut_14 = funcPwmOut(&RgSTT[13],dfCmd_14,&CntTime[13],&PwmH[13]); dfOut_15 = funcPwmOut(&RgSTT[14],dfCmd_15,&CntTime[14],&PwmH[14]); dfOut_16 = funcPwmOut(&RgSTT[15],dfCmd_16,&CntTime[15],&PwmH[15]); i = dfOut_02; //20210906保存IO口状态 解决KGF重启指示灯闪烁问题 RestartDataKGF = dfOut_01; RestartDataKGF = RestartDataKGF + (i<<1); i = dfOut_03; RestartDataKGF = RestartDataKGF + (i<<2); i = dfOut_04; RestartDataKGF = RestartDataKGF + (i<<3); i = dfOut_05; RestartDataKGF = RestartDataKGF + (i<<4); i = dfOut_06; RestartDataKGF = RestartDataKGF + (i<<5); i = dfOut_07; RestartDataKGF = RestartDataKGF + (i<<6); i = dfOut_08; RestartDataKGF = RestartDataKGF + (i<<7); i = dfOut_09; RestartDataKGF = RestartDataKGF + (i<<8); i = dfOut_10; RestartDataKGF = RestartDataKGF + (i<<9); i = dfOut_11; RestartDataKGF = RestartDataKGF + (i<<10); i = dfOut_12; RestartDataKGF = RestartDataKGF + (i<<11); i = dfOut_13; RestartDataKGF = RestartDataKGF + (i<<12); i = dfOut_14; RestartDataKGF = RestartDataKGF + (i<<13); i = dfOut_15; RestartDataKGF = RestartDataKGF + (i<<14); i = dfOut_16; RestartDataKGF = RestartDataKGF + (i<<15); } //can错误处理 void CanErrorProcess(void) { ubyte ubNSRL = 0; ubyte ubNSRH = 0; ubyte ubResetLEC = 0x3F; //------------------------------------------- EA = 0; CAN_pushAMRegs(); // push the CAN Access Mediator Registers SFR_PAGE(_su0, SST0); // switch to page 0 CAN_vWriteCANAddress(CAN_NSR0); CAN_vReadEN(); ubNSRL = CAN_DATA0; ubNSRH = CAN_DATA1; if (ubNSRL & 0x20) // if ALERT { CAN_vInit(); } if (ubNSRL & 0x07) // if LEC { ubResetLEC = 0x38; } //// Reset LEC, TXOK, RXOK, ALERT, EWRN, BOFF, LLE, LOE (if set) CAN_vWriteCANAddress(CAN_NSR0); // Addressing CAN_NSR0 CAN_DATA0 = ~(ubNSRL & ubResetLEC); // load CAN_NSR0 status register[7-0] CAN_DATA1 = ~(ubNSRH); // load CAN_NSR0 status register[15-8] CAN_vWriteEN(D0_VALID+D1_VALID); // Data0 and Data1 are Valid for SFR_PAGE(_su0, RST0); // restore the old SCU page CAN_popAMRegs(); // restore the CAN Access Mediator Registers EA = 1; } ////效验算法 //void Password(void) //{ // ubyte i; ////--------------------------------- // for(i=0;i<5;i++) // { // UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][3];//CAN 第0个字节 // UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][2];//CAN 第1个字节 // UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][1];//CAN 第2个字节 // UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][0];//CAN 第3个字节 // UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][7];//CAN 第4个字节 // UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][6];//CAN 第5个字节 // UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][5];//CAN 第6个字节 // } //} void CanTransmit(void) { // ulong i; //----------------- -------- CAN_waitTransmit(DF_SwTx);//发送前等待上一帧发送完毕,这样不会丢帧 // Password(); CAN_vLoadData(DF_SwTx, (ulong *)(&UnInfCan_1.ArrData.Arr[0][0])); // 装载数据 CAN_vTransmit(DF_SwTx); } //CAN发送一帧 void CanTX(void) { //----------------------------------- // if(1 == SwOut09)UnInfCan_1.ArrData.Arr[0][3] |= 0x01;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x01); //KGF1 //20200303修改为与接收到的数据一致,反馈与接收到时数据为一致 // if(1 == SwOut10)UnInfCan_1.ArrData.Arr[0][3] |= 0x02;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x02); //KGF2 // if(1 == SwOut04)UnInfCan_1.ArrData.Arr[0][3] |= 0x04;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x04); //KGF3 // if(1 == SwOut03)UnInfCan_1.ArrData.Arr[0][3] |= 0x08;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x08); //KGF4 // if(1 == SwOut06)UnInfCan_1.ArrData.Arr[0][3] |= 0x10;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x10); //KGF5 // if(1 == SwOut05)UnInfCan_1.ArrData.Arr[0][3] |= 0x20;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x20); //KGF6 // if(1 == SwOut15)UnInfCan_1.ArrData.Arr[0][3] |= 0x40;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x40); //KGF7 // if(1 == SwOut16)UnInfCan_1.ArrData.Arr[0][3] |= 0x80;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x80); //KGF8 // if(1 == SwOut13)UnInfCan_1.ArrData.Arr[0][2] |= 0x01;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x01); //KGF9 // if(1 == SwOut14)UnInfCan_1.ArrData.Arr[0][2] |= 0x02;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x02); //KGF10 // if(1 == SwOut08)UnInfCan_1.ArrData.Arr[0][2] |= 0x04;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x04); //KGF11 // if(1 == SwOut07)UnInfCan_1.ArrData.Arr[0][2] |= 0x08;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x08); //KGF12 // if(1 == SwOut02)UnInfCan_1.ArrData.Arr[0][2] |= 0x10;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x10); //KGF13 // if(1 == SwOut01)UnInfCan_1.ArrData.Arr[0][2] |= 0x20;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x20); //KGF14 // if(1 == SwOut11)UnInfCan_1.ArrData.Arr[0][2] |= 0x40;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x40); //KGF15 // if(1 == SwOut12)UnInfCan_1.ArrData.Arr[0][2] |= 0x80;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x80); //KGF16 // if(1 == SwIn01 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x01);else UnInfCan_1.ArrData.Arr[0][1] |= 0x01; //Dia01 20200225修改为0数据变为1,1数据变为0,这样大CPU方便处理 // if(1 == SwIn02 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x02);else UnInfCan_1.ArrData.Arr[0][1] |= 0x02; //Dia02 // if(1 == SwIn03 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x04);else UnInfCan_1.ArrData.Arr[0][1] |= 0x04; //Dia03 // if(1 == SwIn04 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x08);else UnInfCan_1.ArrData.Arr[0][1] |= 0x08; //Dia04 // if(1 == SwIn05 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x10);else UnInfCan_1.ArrData.Arr[0][1] |= 0x10; //Dia05 // if(1 == SwIn06 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x20);else UnInfCan_1.ArrData.Arr[0][1] |= 0x20; //Dia06 // if(1 == SwIn07 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x40);else UnInfCan_1.ArrData.Arr[0][1] |= 0x40; //Dia07 // if(1 == SwIn08 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x80);else UnInfCan_1.ArrData.Arr[0][1] |= 0x80; //Dia08 UnInfCan_1.ArrData.Arr[0][3] = UnInfCan_1.ArrData.ArrRX[0][0]; UnInfCan_1.ArrData.Arr[0][2] = UnInfCan_1.ArrData.ArrRX[0][1]; UnInfCan_1.ArrData.Arr[0][1] = motor_sta; UnInfCan_1.ArrData.Arr[0][0] = can_error_flg; UnInfCan_1.ArrData.Arr[0][7] = 0; UnInfCan_1.ArrData.Arr[0][6] = 0; UnInfCan_1.ArrData.Arr[0][5] = (ubyte)(adc_result>>8); UnInfCan_1.ArrData.Arr[0][4] = (ubyte)(adc_result); CanTransmit(); } /*-------- 电机控制函数 --------*/ // 电机正转(通道0工作) void motorForward(void) { CC6_vLoadChannelShadowRegister_CC6_CHANNEL_0(0x0960*1/255);//这个是50us UnInfCan_1.ArrData.ArrRX[0][1] CC6_vLoadChannelShadowRegister_CC6_CHANNEL_1(0x0960);//这个是50us CC6_vEnableShadowTransfer_CC6_TIMER_12(); CC6_vEnableShadowTransfer_CC6_TIMER_13(); } // 电机反转(通道1工作) void motorReverse(void) { CC6_vLoadChannelShadowRegister_CC6_CHANNEL_0(0x0960);//这个是50us CC6_vLoadChannelShadowRegister_CC6_CHANNEL_1(0x0960*1/255);//这个是50us CC6_vEnableShadowTransfer_CC6_TIMER_12(); CC6_vEnableShadowTransfer_CC6_TIMER_13(); } // 电机停止(所有通道关闭) void motorStop(void) { CC6_vLoadChannelShadowRegister_CC6_CHANNEL_0(0x0960);//这个是50us CC6_vLoadChannelShadowRegister_CC6_CHANNEL_1(0x0960);//这个是50us CC6_vEnableShadowTransfer_CC6_TIMER_12(); CC6_vEnableShadowTransfer_CC6_TIMER_13(); } // 电机停止(所有通道关闭) void motorStop1(void) { CC6_vLoadChannelShadowRegister_CC6_CHANNEL_0(0x0960*UnInfCan_1.ArrData.ArrRX[0][1]/255);//这个是50us UnInfCan_1.ArrData.ArrRX[0][1] CC6_vLoadChannelShadowRegister_CC6_CHANNEL_1(0x0960*UnInfCan_1.ArrData.ArrRX[0][1]/255);//这个是50us CC6_vEnableShadowTransfer_CC6_TIMER_12(); CC6_vEnableShadowTransfer_CC6_TIMER_13(); } // 电机状态机函数 // 电机状态机函数 void motorStateMachine(MotorState *current_state, MotorDirection direction_cmd, bool over_current) { switch (*current_state) { // 停止状态 case MOTOR_STOPPED: if (over_current) { *current_state = MOTOR_FAULT; motorStop(); } else if (direction_cmd == DIR_FORWARD) { *current_state = MOTOR_FORWARD; motorForward(); } else if (direction_cmd == DIR_REVERSE) { *current_state = MOTOR_REVERSE; motorReverse(); } else { motorStop(); // 确保停止(处理其他无效值) } break; // 正转状态 case MOTOR_FORWARD: if (over_current) { *current_state = MOTOR_FAULT; motorStop(); } else if (direction_cmd != DIR_FORWARD) { *current_state = MOTOR_STOPPED; motorStop(); } // 否则保持正转状态 break; // 反转状态 case MOTOR_REVERSE: if (over_current) { *current_state = MOTOR_FAULT; motorStop(); } else if (direction_cmd != DIR_REVERSE) { *current_state = MOTOR_STOPPED; motorStop(); } // 否则保持反转状态 break; // 故障状态(过流保护) case MOTOR_FAULT: // 只有在停止命令时才能退出故障状态 if (direction_cmd == DIR_STOP) { *current_state = MOTOR_STOPPED; } // 否则保持故障状态,电机保持停止 motorStop(); break; default: // 异常处理 *current_state = MOTOR_STOPPED; motorStop(); break; } } //CAN发送接收 void CanRXTX(void) { stCAN_SWObj StrCanRx = {0}; uword tmp = 0; ubyte i = 0,j = 0; static ubyte first_sta = 0; bool over_current1 = 0; //------------------------------------ if(0 == first_sta) { first_sta = 1; // 启动并行ADC请求(假设通道0x80对应实际物理通道) ADC_vStartParReqChNum(0x80); // 设置加载事件(需确认函数参数) ADC_vSetLoadEvent(); } // 等待转换完成(需明确仲裁槽号) if(0 == ADC_ubBusy()) { UnInfCan_1.ArrData.Arr[0][3] ++; // 获取结果 adc_result = ADC_uwGetResultData0(); // 启动并行ADC请求(假设通道0x80对应实际物理通道) ADC_vStartParReqChNum(0x80); // 设置加载事件(需确认函数参数) ADC_vSetLoadEvent(); } if(CAN_ubNewData(DF_SwRx)) { CAN_vGetMsgObj(DF_SwRx, &StrCanRx); UnInfCan_1.ArrData.ArrRX[0][3] = StrCanRx.ulDATAL.ubDB[0]; UnInfCan_1.ArrData.ArrRX[0][2] = StrCanRx.ulDATAL.ubDB[1]; UnInfCan_1.ArrData.ArrRX[0][1] = StrCanRx.ulDATAL.ubDB[2]; UnInfCan_1.ArrData.ArrRX[0][0] = StrCanRx.ulDATAL.ubDB[3]; UnInfCan_1.ArrData.ArrRX[0][7] = StrCanRx.ulDATAH.ubDB[0]; UnInfCan_1.ArrData.ArrRX[0][6] = StrCanRx.ulDATAH.ubDB[1]; UnInfCan_1.ArrData.ArrRX[0][5] = StrCanRx.ulDATAH.ubDB[2]; UnInfCan_1.ArrData.ArrRX[0][4] = StrCanRx.ulDATAH.ubDB[3]; CAN_vReleaseObj(DF_SwRx); //CAN发送周期 50-5000ms tmp = (uword)UnInfCan_1.ArrData.ArrRX[0][6]; tmp = (tmp << 8); tmp |= ((uword)UnInfCan_1.ArrData.ArrRX[0][7]); if(tmp >= 50)RgCanPerid = tmp; if(tmp >= 5000)RgCanPerid = 5000; } // 读取方向控制信号(根据您的硬件接口) if (1 == UnInfCan_1.BitData.D21 && 0 == UnInfCan_1.BitData.D22) { motor_dir = DIR_FORWARD; } else if (0 == UnInfCan_1.BitData.D21 && 1 == UnInfCan_1.BitData.D22) { motor_dir = DIR_REVERSE; } else { motor_dir = DIR_STOP; } if(adc_result < OVRE_CURRENT_MAX)//过流状态采集到的是低电平,正常是高电平。 { over_current1 = 1; } else { over_current1 = 0; } motorStateMachine(&motor_sta, motor_dir, over_current1); //处理电机 if(CAN_ubNewData(DF_SwRxPwm)) { CAN_vGetMsgObj(DF_SwRxPwm, &StrCanRx); UnInfCan_1.ArrData.ArrRX[1][2] = StrCanRx.ulDATAL.ubDB[0]; UnInfCan_1.ArrData.ArrRX[1][3] = StrCanRx.ulDATAL.ubDB[1]; UnInfCan_1.ArrData.ArrRX[1][0] = StrCanRx.ulDATAL.ubDB[2]; UnInfCan_1.ArrData.ArrRX[1][1] = StrCanRx.ulDATAL.ubDB[3]; UnInfCan_1.ArrData.ArrRX[1][6] = StrCanRx.ulDATAH.ubDB[0]; UnInfCan_1.ArrData.ArrRX[1][7] = StrCanRx.ulDATAH.ubDB[1]; UnInfCan_1.ArrData.ArrRX[1][4] = StrCanRx.ulDATAH.ubDB[2]; UnInfCan_1.ArrData.ArrRX[1][5] = StrCanRx.ulDATAH.ubDB[3]; CAN_vReleaseObj(DF_SwRxPwm); //接收的数据保存到PWM数据结构中20181227 PwmH[0 ] = (ubyte)UnInfCan_1.BitData.Pwm_01; PwmH[1 ] = (ubyte)UnInfCan_1.BitData.Pwm_02; PwmH[2 ] = (ubyte)UnInfCan_1.BitData.Pwm_03; PwmH[3 ] = (ubyte)UnInfCan_1.BitData.Pwm_04; PwmH[4 ] = (ubyte)UnInfCan_1.BitData.Pwm_05; PwmH[5 ] = (ubyte)UnInfCan_1.BitData.Pwm_06; PwmH[6 ] = (ubyte)UnInfCan_1.BitData.Pwm_07; PwmH[7 ] = (ubyte)UnInfCan_1.BitData.Pwm_08; PwmH[8 ] = (ubyte)UnInfCan_1.BitData.Pwm_09; PwmH[9 ] = (ubyte)UnInfCan_1.BitData.Pwm_10; PwmH[10] = (ubyte)UnInfCan_1.BitData.Pwm_11; PwmH[11] = (ubyte)UnInfCan_1.BitData.Pwm_12; PwmH[12] = (ubyte)UnInfCan_1.BitData.Pwm_13; PwmH[13] = (ubyte)UnInfCan_1.BitData.Pwm_14; PwmH[14] = (ubyte)UnInfCan_1.BitData.Pwm_15; PwmH[15] = (ubyte)UnInfCan_1.BitData.Pwm_16; // UnInfCan_1.ArrData.Arr[0][3] = UnInfCan_1.ArrData.ArrRX[1][0]; // UnInfCan_1.ArrData.Arr[0][2] = UnInfCan_1.ArrData.ArrRX[1][1]; // UnInfCan_1.ArrData.Arr[0][1] = UnInfCan_1.ArrData.ArrRX[1][2]; 20200225注释不更新诊断数据 // UnInfCan_1.ArrData.Arr[0][0] = UnInfCan_1.ArrData.ArrRX[1][3]; // UnInfCan_1.ArrData.Arr[0][7] = UnInfCan_1.ArrData.ArrRX[1][4]; // UnInfCan_1.ArrData.Arr[0][6] = UnInfCan_1.ArrData.ArrRX[1][5]; // UnInfCan_1.ArrData.Arr[0][5] = UnInfCan_1.ArrData.ArrRX[1][6]; // UnInfCan_1.ArrData.Arr[0][4] = UnInfCan_1.ArrData.ArrRX[1][7]; // CanTransmit(); } //接收一帧,调用一次点灯程序。 // LedDr(); //100ms发送一帧 if(!FlgCan_1) { FlgCan_1 = 1; CanTX(); } if( (0x40 == can_error_cnt) || (0x80 == can_error_cnt) )//20250625判断是否出现总线错误 { can_error_flg = can_error_cnt; CAN_vInit(); can_error_cnt = 0; } }