飞思卡尔MC9S12XEP芯片的CAN总线代码.docx
《飞思卡尔MC9S12XEP芯片的CAN总线代码.docx》由会员分享,可在线阅读,更多相关《飞思卡尔MC9S12XEP芯片的CAN总线代码.docx(42页珍藏版)》请在冰点文库上搜索。
飞思卡尔MC9S12XEP芯片的CAN总线代码
#defineCAN_GLOBALS
#include"can.h"
voidEEC1_Process(uint8_tOutPtr,uint8_tInPtr);
voidEEC2_Process(uint8_tOutPtr,uint8_tInPtr);
voidEEC3_Process(uint8_tOutPtr,uint8_tInPtr);
voidET1_Process(uint8_tOutPtr,uint8_tInPtr);
voidCCVS_Process(uint8_tOutPtr,uint8_tInPtr);
voidLFE_Process(uint8_tOutPtr,uint8_tInPtr);
voidAMB_Process(uint8_tOutPtr,uint8_tInPtr);
voidIC1_Process(uint8_tOutPtr,uint8_tInPtr);
voidVEP1_Process(uint8_tOutPtr,uint8_tInPtr);
voidEFL_P1_Process(uint8_tOutPtr,uint8_tInPtr);
voidLFC_Process(uint8_tOutPtr,uint8_tInPtr);
voidDigit2Ascii1(uint32_tDigit,uint8_tInPtr);//一位小数
voidDigit2Ascii0(uint32_tDigit,uint8_tInPtr);//数字转化为ASCII码0位小数
voidDigit2AsciiPos0(uint32_tDigit,uint8_tInPtr);//数字转化为ASCII码0位小数负数
uint8_t*Result;
HMI_Text_Dis_tPtrHMI_Text_DisPtr;
///----------------------------------------------------------------------------------------------------------
//Function:
//Param:
//Return:
//note
voidCANFilterInit(uint8_tCAN)
{
if(CAN{switch(CAN){caseCAN0:CAN0IDAR0=0xFF;CAN0IDAR1=0xFF;CAN0IDAR2=0xFF;CAN0IDAR3=0xFF;CAN0IDMR0=0xFF;CAN0IDMR1=0xFF;CAN0IDMR2=0xFF;CAN0IDMR3=0xFF;CAN0IDAR4=0xFF;CAN0IDAR5=0xFF;CAN0IDAR6=0xFF;CAN0IDAR7=0xFF;CAN0IDMR4=0xFF;CAN0IDMR5=0xFF;CAN0IDMR6=0xFF;CAN0IDMR7=0xFF;break;caseCAN1:CAN1IDAR0=0xFF;CAN1IDAR1=0xFF;CAN1IDAR2=0xFF;CAN1IDAR3=0xFF;CAN1IDMR0=0xFF;CAN1IDMR1=0xFF;CAN1IDMR2=0xFF;CAN1IDMR3=0xFF;CAN1IDAR4=0xFF;CAN1IDAR5=0xFF;CAN1IDAR6=0xFF;CAN1IDAR7=0xFF;CAN1IDMR4=0xFF;CAN1IDMR5=0xFF;CAN1IDMR6=0xFF;CAN1IDMR7=0xFF;break;}}}/*--------------------------------------------------------------------------------------------------------Function:Param:Return:note----------------------------------------------------------------------------------------------------------*/voidCANRxQueInit(void){CAN_RxQue.Front=0;CAN_RxQue.Rear=0;memset(&CAN_RxQue,0,sizeof(CAN_RxQue));}/*--------------------------------------------------------------------------------------------------------Function:CAN0CAN1初始化Param:Return:note----------------------------------------------------------------------------------------------------------*/CAN_EXTvoidCANInit(uint8_tCAN){if(CAN{switch(CAN){caseCAN0:CAN0CTL1_CANE=1;//使能CAN模块CAN0CTL1_LISTEN=0;//除能监听模式CAN0BTR0=CAN0BTR0_Val;//设置波特率CAN0BTR1=CAN0BTR1_Val;CANFilterInit(CAN0);//设置验收、屏蔽滤波器CAN0CTL0_INITRQ=0;//请求退出初始化while(CAN0CTL1_INITAK==1){//请求处理ing_asm(nop);}while(CAN0CTL0_SYNCH==0){_asm(nop);}CAN0RFLG=0xC3;//清除接收相关标志位CANRxQueInit();//CAN中断接收队列CAN0RIER_RXFIE=1;//接收中断允许break;caseCAN1:CAN1CTL1_CANE=1;//使能CAN模块CAN1CTL1_LISTEN=0;//除能监听模式CAN1BTR0=CAN1BTR0_Val;//设置波特率CAN1BTR1=CAN1BTR1_Val;CANFilterInit(CAN1);//设置验收、屏蔽滤波器CAN1CTL0_INITRQ=0;//请求退出初始化while(CAN1CTL1_INITAK==1){//请求处理ing_asm(nop);}while(CAN1CTL0_SYNCH==0){_asm(nop);}CAN1RFLG=0xC3;//清除接收相关标志位CANRxQueInit();//CAN中断接收队列CAN1RIER_RXFIE=1;//接收中断允许break;}}}/*----------------------------------------------------------------------------------------------------------Function:存储并显示把CAN_RxQue队列里的数据存放到FLASH中,某些数据再存到HMI_Text_Dis_Que队列里进行显示其中CAN_RxQue的ID转换为PGNTmp再转换为HMI_Text_Dis_Que显示的位置CAN_RxQue的数据即HMI_Text_Dis_Que的数据起始帧命令帧终止帧都已包含Param:Return:note----------------------------------------------------------------------------------------------------------*/CAN_EXTvoidCANRxQueToProcess(void){ID_tPtrIDPtr;uint32_tPGNTmp;while(CAN_RxQue.Front!=CAN_RxQue.Rear)//源队列未空,可出列{IDPtr=&(CAN_RxQue.PDUs[CAN_RxQue.Front].Bits.ID);//指向出列项ID域PGNTmp=0;PGNTmp|=(uint8_t)(IDPtr->Bits.DP|IDPtr->Bits.R<<1);//析取DP和RPGNTmp<<=8;PGNTmp|=(uint8_t)(IDPtr->Bits.PF0|IDPtr->Bits.PF1<<2|IDPtr->Bits.PF2<<5);//析取PFPGNTmp<<=8;PGNTmp|=(uint8_t)(IDPtr->Bits.PS0|IDPtr->Bits.PS1<<7);//析取PSif(PGNTmp==(uint16_t)PGN_FAULT_MEMORY){FAULT_flag=1;}else{FAULT_flag=0;}switch(PGNTmp){case(uint16_t)PGN_EEC1:EEC1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_EEC2:EEC2_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_EEC3:EEC3_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_AMB:AMB_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_CCVS:CCVS_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_ET1:ET1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_LFE:LFE_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_EFL_P1:EFL_P1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_IC1:IC1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_VEP1:VEP1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_LFC://时间太大目前只能计算两个字节的LFC_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_FAULT_MEMORY:FAULT_MEMORY_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear,0,0);//为了方便触摸屏看故障类型上下条时使用break;default:break;}CAN_RxQue.Front=(uint8_t)(CAN_RxQue.Front+1)%CAN_RXQUE_LEN;//出列一项}CANRxQueInit();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------voidEEC1_Process(uint8_tOutPtr,uint8_tInPtr){uint32_tengspeed;uint32_tactualengtorque;eec1=(EEC1_t*)CAN_RxQue.PDUs[OutPtr].Bits.DataField;engspeed=(((uint32_t)swab16(eec1->EngSpeed))*12)+(((uint32_t)swab16(eec1->EngSpeed))>>1);actualengtorque=((uint32_t)(eec1->ActualEngTorque))*100;if(HMI_Text_Dis_Que.Front!=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN){HMI_Text_DisPtr=HMI_Text_Dis_Que.HMI_Text_Dis+HMI_Text_Dis_Que.Rear;HMI_Text_DisPtr->Cmd_Start=HMI_CMD_START;HMI_Text_DisPtr->Cmd_Type=HMI_CMD_TEXTDIS_ASCII;HMI_Text_DisPtr->Start_Point.x=145;HMI_Text_DisPtr->Start_Point.y=150;Digit2Ascii0(engspeed,InPtr);HMI_Text_DisPtr->Cmd_End=HMI_CMD_END;HMI_Text_Dis_Que.Rear=(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN;}if(HMI_Text_Dis_Que.Front!=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN){HMI_Text_DisPtr=HMI_Text_Dis_Que.HMI_Text_Dis+HMI_Text_Dis_Que.Rear;HMI_Text_DisPtr->Cmd_Start=HMI_CMD_START;HMI_Text_DisPtr->Cmd_Type=HMI_CMD_TEXTDIS_ASCII;HMI_Text_DisPtr->Start_Point.x=590;HMI_Text_DisPtr->Start_Point.y=150;if(actualengtorque<12500){actualengtorque=12500-actualengtorque;Digit2AsciiPos0(actualengtorque,HMI_Text_Dis_Que.Rear);}else{actualengtorque=actualengtorque-12500;Digit2Ascii0(actualengtorque,HMI_Text_Dis_Que.Rear);}HMI_Text_DisPtr->Cmd_End=HMI_CMD_END;HMI_Text_Dis_Que.Rear=(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN;//进列一项}Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------voidEEC2_Process(uint8_tOutPtr,uint8_tInPtr){uint32_taccpedalpos1;eec2=(EEC2_t*)CAN_RxQue.PDUs[OutPtr].Bits.DataField;accpedalpos1=((uint32_t)(eec2->AccPedalPos1))*40;if(HMI_Text_Dis_Que.Front!=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN)//目的队列未满,可入列{HMI_Text_DisPtr=HMI_Text_Dis_Que.HMI_Text_Dis+HMI_Text_Dis_Que.Rear;//指向入列项HMI_Text_DisPtr->Cmd_Start=HMI_CMD_START;//写入命令头HMI_Text_DisPtr->Cmd_Type=HMI_CMD_TEXTDIS_ASCII;//写入命令种类HMI_Text_DisPtr->Start_Point.x=145;//文本显示位置x坐标HMI_Text_DisPtr->Start_Point.y=315;//文本显示位置y坐标Digit2Ascii0(accpedalpos1,InPtr);//%HMI_Text_DisPtr->Cmd_End=HMI_CMD_END;HMI_Text_Dis_Que.Rear=(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN;//进列一项}Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------voidEEC3_Process(uint8_tOutPtr,uint8_tInPtr){eec3=(EEC3_t*)CAN_RxQue.PDUs[OutPtr].Bits.DataField;Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------voidET1_Process(uint8_tOutPtr,uint8_tInPtr){uint32_tengcoolanttemp;et1=(ET1_t*)CAN_RxQue.PDUs[OutPtr].Bits.DataField;engcoolanttemp=((uint32_t)(et1->EngCoolantTemp))*100;if(HMI_Text_Dis_Que.Fro
switch(CAN)
caseCAN0:
CAN0IDAR0=0xFF;
CAN0IDAR1=0xFF;
CAN0IDAR2=0xFF;
CAN0IDAR3=0xFF;
CAN0IDMR0=0xFF;
CAN0IDMR1=0xFF;
CAN0IDMR2=0xFF;
CAN0IDMR3=0xFF;
CAN0IDAR4=0xFF;
CAN0IDAR5=0xFF;
CAN0IDAR6=0xFF;
CAN0IDAR7=0xFF;
CAN0IDMR4=0xFF;
CAN0IDMR5=0xFF;
CAN0IDMR6=0xFF;
CAN0IDMR7=0xFF;
break;
caseCAN1:
CAN1IDAR0=0xFF;
CAN1IDAR1=0xFF;
CAN1IDAR2=0xFF;
CAN1IDAR3=0xFF;
CAN1IDMR0=0xFF;
CAN1IDMR1=0xFF;
CAN1IDMR2=0xFF;
CAN1IDMR3=0xFF;
CAN1IDAR4=0xFF;
CAN1IDAR5=0xFF;
CAN1IDAR6=0xFF;
CAN1IDAR7=0xFF;
CAN1IDMR4=0xFF;
CAN1IDMR5=0xFF;
CAN1IDMR6=0xFF;
CAN1IDMR7=0xFF;
}
/*--------------------------------------------------------------------------------------------------------
Function:
Param:
Return:
note
----------------------------------------------------------------------------------------------------------*/
voidCANRxQueInit(void)
CAN_RxQue.Front=0;
CAN_RxQue.Rear=0;
memset(&CAN_RxQue,0,sizeof(CAN_RxQue));
CAN0CAN1初始化
CAN_EXTvoidCANInit(uint8_tCAN)
if(CAN{switch(CAN){caseCAN0:CAN0CTL1_CANE=1;//使能CAN模块CAN0CTL1_LISTEN=0;//除能监听模式CAN0BTR0=CAN0BTR0_Val;//设置波特率CAN0BTR1=CAN0BTR1_Val;CANFilterInit(CAN0);//设置验收、屏蔽滤波器CAN0CTL0_INITRQ=0;//请求退出初始化while(CAN0CTL1_INITAK==1){//请求处理ing_asm(nop);}while(CAN0CTL0_SYNCH==0){_asm(nop);}CAN0RFLG=0xC3;//清除接收相关标志位CANRxQueInit();//CAN中断接收队列CAN0RIER_RXFIE=1;//接收中断允许break;caseCAN1:CAN1CTL1_CANE=1;//使能CAN模块CAN1CTL1_LISTEN=0;//除能监听模式CAN1BTR0=CAN1BTR0_Val;//设置波特率CAN1BTR1=CAN1BTR1_Val;CANFilterInit(CAN1);//设置验收、屏蔽滤波器CAN1CTL0_INITRQ=0;//请求退出初始化while(CAN1CTL1_INITAK==1){//请求处理ing_asm(nop);}while(CAN1CTL0_SYNCH==0){_asm(nop);}CAN1RFLG=0xC3;//清除接收相关标志位CANRxQueInit();//CAN中断接收队列CAN1RIER_RXFIE=1;//接收中断允许break;}}}/*----------------------------------------------------------------------------------------------------------Function:存储并显示把CAN_RxQue队列里的数据存放到FLASH中,某些数据再存到HMI_Text_Dis_Que队列里进行显示其中CAN_RxQue的ID转换为PGNTmp再转换为HMI_Text_Dis_Que显示的位置CAN_RxQue的数据即HMI_Text_Dis_Que的数据起始帧命令帧终止帧都已包含Param:Return:note----------------------------------------------------------------------------------------------------------*/CAN_EXTvoidCANRxQueToProcess(void){ID_tPtrIDPtr;uint32_tPGNTmp;while(CAN_RxQue.Front!=CAN_RxQue.Rear)//源队列未空,可出列{IDPtr=&(CAN_RxQue.PDUs[CAN_RxQue.Front].Bits.ID);//指向出列项ID域PGNTmp=0;PGNTmp|=(uint8_t)(IDPtr->Bits.DP|IDPtr->Bits.R<<1);//析取DP和RPGNTmp<<=8;PGNTmp|=(uint8_t)(IDPtr->Bits.PF0|IDPtr->Bits.PF1<<2|IDPtr->Bits.PF2<<5);//析取PFPGNTmp<<=8;PGNTmp|=(uint8_t)(IDPtr->Bits.PS0|IDPtr->Bits.PS1<<7);//析取PSif(PGNTmp==(uint16_t)PGN_FAULT_MEMORY){FAULT_flag=1;}else{FAULT_flag=0;}switch(PGNTmp){case(uint16_t)PGN_EEC1:EEC1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_EEC2:EEC2_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_EEC3:EEC3_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_AMB:AMB_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_CCVS:CCVS_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_ET1:ET1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_LFE:LFE_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_EFL_P1:EFL_P1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_IC1:IC1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_VEP1:VEP1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_LFC://时间太大目前只能计算两个字节的LFC_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);break;case(uint16_t)PGN_FAULT_MEMORY:FAULT_MEMORY_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear,0,0);//为了方便触摸屏看故障类型上下条时使用break;default:break;}CAN_RxQue.Front=(uint8_t)(CAN_RxQue.Front+1)%CAN_RXQUE_LEN;//出列一项}CANRxQueInit();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------voidEEC1_Process(uint8_tOutPtr,uint8_tInPtr){uint32_tengspeed;uint32_tactualengtorque;eec1=(EEC1_t*)CAN_RxQue.PDUs[OutPtr].Bits.DataField;engspeed=(((uint32_t)swab16(eec1->EngSpeed))*12)+(((uint32_t)swab16(eec1->EngSpeed))>>1);actualengtorque=((uint32_t)(eec1->ActualEngTorque))*100;if(HMI_Text_Dis_Que.Front!=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN){HMI_Text_DisPtr=HMI_Text_Dis_Que.HMI_Text_Dis+HMI_Text_Dis_Que.Rear;HMI_Text_DisPtr->Cmd_Start=HMI_CMD_START;HMI_Text_DisPtr->Cmd_Type=HMI_CMD_TEXTDIS_ASCII;HMI_Text_DisPtr->Start_Point.x=145;HMI_Text_DisPtr->Start_Point.y=150;Digit2Ascii0(engspeed,InPtr);HMI_Text_DisPtr->Cmd_End=HMI_CMD_END;HMI_Text_Dis_Que.Rear=(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN;}if(HMI_Text_Dis_Que.Front!=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN){HMI_Text_DisPtr=HMI_Text_Dis_Que.HMI_Text_Dis+HMI_Text_Dis_Que.Rear;HMI_Text_DisPtr->Cmd_Start=HMI_CMD_START;HMI_Text_DisPtr->Cmd_Type=HMI_CMD_TEXTDIS_ASCII;HMI_Text_DisPtr->Start_Point.x=590;HMI_Text_DisPtr->Start_Point.y=150;if(actualengtorque<12500){actualengtorque=12500-actualengtorque;Digit2AsciiPos0(actualengtorque,HMI_Text_Dis_Que.Rear);}else{actualengtorque=actualengtorque-12500;Digit2Ascii0(actualengtorque,HMI_Text_Dis_Que.Rear);}HMI_Text_DisPtr->Cmd_End=HMI_CMD_END;HMI_Text_Dis_Que.Rear=(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN;//进列一项}Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------voidEEC2_Process(uint8_tOutPtr,uint8_tInPtr){uint32_taccpedalpos1;eec2=(EEC2_t*)CAN_RxQue.PDUs[OutPtr].Bits.DataField;accpedalpos1=((uint32_t)(eec2->AccPedalPos1))*40;if(HMI_Text_Dis_Que.Front!=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN)//目的队列未满,可入列{HMI_Text_DisPtr=HMI_Text_Dis_Que.HMI_Text_Dis+HMI_Text_Dis_Que.Rear;//指向入列项HMI_Text_DisPtr->Cmd_Start=HMI_CMD_START;//写入命令头HMI_Text_DisPtr->Cmd_Type=HMI_CMD_TEXTDIS_ASCII;//写入命令种类HMI_Text_DisPtr->Start_Point.x=145;//文本显示位置x坐标HMI_Text_DisPtr->Start_Point.y=315;//文本显示位置y坐标Digit2Ascii0(accpedalpos1,InPtr);//%HMI_Text_DisPtr->Cmd_End=HMI_CMD_END;HMI_Text_Dis_Que.Rear=(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN;//进列一项}Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------voidEEC3_Process(uint8_tOutPtr,uint8_tInPtr){eec3=(EEC3_t*)CAN_RxQue.PDUs[OutPtr].Bits.DataField;Record_Write();}///----------------------------------------------------------------------------------------------------------//Function://Param://Return://note///----------------------------------------------------------------------------------------------------------voidET1_Process(uint8_tOutPtr,uint8_tInPtr){uint32_tengcoolanttemp;et1=(ET1_t*)CAN_RxQue.PDUs[OutPtr].Bits.DataField;engcoolanttemp=((uint32_t)(et1->EngCoolantTemp))*100;if(HMI_Text_Dis_Que.Fro
CAN0CTL1_CANE=1;//使能CAN模块
CAN0CTL1_LISTEN=0;//除能监听模式
CAN0BTR0=CAN0BTR0_Val;//设置波特率
CAN0BTR1=CAN0BTR1_Val;
CANFilterInit(CAN0);//设置验收、屏蔽滤波器
CAN0CTL0_INITRQ=0;//请求退出初始化
while(CAN0CTL1_INITAK==1){//请求处理ing
_asm(nop);
while(CAN0CTL0_SYNCH==0){
CAN0RFLG=0xC3;//清除接收相关标志位
CANRxQueInit();//CAN中断接收队列
CAN0RIER_RXFIE=1;//接收中断允许
CAN1CTL1_CANE=1;//使能CAN模块
CAN1CTL1_LISTEN=0;//除能监听模式
CAN1BTR0=CAN1BTR0_Val;//设置波特率
CAN1BTR1=CAN1BTR1_Val;
CANFilterInit(CAN1);//设置验收、屏蔽滤波器
CAN1CTL0_INITRQ=0;//请求退出初始化
while(CAN1CTL1_INITAK==1){//请求处理ing
while(CAN1CTL0_SYNCH==0){
CAN1RFLG=0xC3;//清除接收相关标志位
CAN1RIER_RXFIE=1;//接收中断允许
/*----------------------------------------------------------------------------------------------------------
存储并显示把CAN_RxQue队列里的数据存放到FLASH中,某些数据再存到HMI_Text_Dis_Que队列里进行显示
其中CAN_RxQue的ID转换为PGNTmp再转换为HMI_Text_Dis_Que显示的位置
CAN_RxQue的数据即HMI_Text_Dis_Que的数据
起始帧命令帧终止帧都已包含
CAN_EXTvoidCANRxQueToProcess(void)
ID_tPtrIDPtr;
uint32_tPGNTmp;
while(CAN_RxQue.Front!
=CAN_RxQue.Rear)//源队列未空,可出列
IDPtr=&(CAN_RxQue.PDUs[CAN_RxQue.Front].Bits.ID);//指向出列项ID域
PGNTmp=0;
PGNTmp|=(uint8_t)(IDPtr->Bits.DP|IDPtr->Bits.R<<1);//析取DP和R
PGNTmp<<=8;
PGNTmp|=(uint8_t)(IDPtr->Bits.PF0|IDPtr->Bits.PF1<<2|IDPtr->Bits.PF2<<5);//析取PF
PGNTmp|=(uint8_t)(IDPtr->Bits.PS0|IDPtr->Bits.PS1<<7);//析取PS
if(PGNTmp==(uint16_t)PGN_FAULT_MEMORY)
FAULT_flag=1;
else
FAULT_flag=0;
switch(PGNTmp){
case(uint16_t)PGN_EEC1:
EEC1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);
case(uint16_t)PGN_EEC2:
EEC2_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);
case(uint16_t)PGN_EEC3:
EEC3_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);
case(uint16_t)PGN_AMB:
AMB_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);
case(uint16_t)PGN_CCVS:
CCVS_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);
case(uint16_t)PGN_ET1:
ET1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);
case(uint16_t)PGN_LFE:
LFE_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);
case(uint16_t)PGN_EFL_P1:
EFL_P1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);
case(uint16_t)PGN_IC1:
IC1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);
case(uint16_t)PGN_VEP1:
VEP1_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);
case(uint16_t)PGN_LFC:
//时间太大目前只能计算两个字节的
LFC_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear);
case(uint16_t)PGN_FAULT_MEMORY:
FAULT_MEMORY_Process(CAN_RxQue.Front,HMI_Text_Dis_Que.Rear,0,0);//为了方便触摸屏看故障类型上下条时使用
default:
CAN_RxQue.Front=(uint8_t)(CAN_RxQue.Front+1)%CAN_RXQUE_LEN;//出列一项
CANRxQueInit();
voidEEC1_Process(uint8_tOutPtr,uint8_tInPtr)
uint32_tengspeed;
uint32_tactualengtorque;
eec1=(EEC1_t*)CAN_RxQue.PDUs[OutPtr].Bits.DataField;
engspeed=(((uint32_t)swab16(eec1->EngSpeed))*12)+(((uint32_t)swab16(eec1->EngSpeed))>>1);
actualengtorque=((uint32_t)(eec1->ActualEngTorque))*100;
if(HMI_Text_Dis_Que.Front!
=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN)
HMI_Text_DisPtr=HMI_Text_Dis_Que.HMI_Text_Dis+HMI_Text_Dis_Que.Rear;
HMI_Text_DisPtr->Cmd_Start=HMI_CMD_START;
HMI_Text_DisPtr->Cmd_Type=HMI_CMD_TEXTDIS_ASCII;
HMI_Text_DisPtr->Start_Point.x=145;
HMI_Text_DisPtr->Start_Point.y=150;
Digit2Ascii0(engspeed,InPtr);
HMI_Text_DisPtr->Cmd_End=HMI_CMD_END;
HMI_Text_Dis_Que.Rear=(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN;
HMI_Text_DisPtr->Start_Point.x=590;
if(actualengtorque<12500)
actualengtorque=12500-actualengtorque;
Digit2AsciiPos0(actualengtorque,HMI_Text_Dis_Que.Rear);
actualengtorque=actualengtorque-12500;
Digit2Ascii0(actualengtorque,HMI_Text_Dis_Que.Rear);
HMI_Text_Dis_Que.Rear=(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN;//进列一项
Record_Write();
voidEEC2_Process(uint8_tOutPtr,uint8_tInPtr)
uint32_taccpedalpos1;
eec2=(EEC2_t*)CAN_RxQue.PDUs[OutPtr].Bits.DataField;
accpedalpos1=((uint32_t)(eec2->AccPedalPos1))*40;
=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN)//目的队列未满,可入列
HMI_Text_DisPtr=HMI_Text_Dis_Que.HMI_Text_Dis+HMI_Text_Dis_Que.Rear;//指向入列项
HMI_Text_DisPtr->Cmd_Start=HMI_CMD_START;//写入命令头
HMI_Text_DisPtr->Cmd_Type=HMI_CMD_TEXTDIS_ASCII;//写入命令种类
HMI_Text_DisPtr->Start_Point.x=145;//文本显示位置x坐标
HMI_Text_DisPtr->Start_Point.y=315;//文本显示位置y坐标
Digit2Ascii0(accpedalpos1,InPtr);//%
voidEEC3_Process(uint8_tOutPtr,uint8_tInPtr)
eec3=(EEC3_t*)CAN_RxQue.PDUs[OutPtr].Bits.DataField;
voidET1_Process(uint8_tOutPtr,uint8_tInPtr)
uint32_tengcoolanttemp;
et1=(ET1_t*)CAN_RxQue.PDUs[OutPtr].Bits.DataField;
engcoolanttemp=((uint32_t)(et1->EngCoolantTemp))*100;
if(HMI_Text_Dis_Que.Fro
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2