飞思卡尔MC9S12XEP芯片的CAN总线代码.docx
- 文档编号:17680154
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:42
- 大小:21.79KB
飞思卡尔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和R PGNTmp<<=8; PGNTmp|=(uint8_t)(IDPtr->Bits.PF0|IDPtr->Bits.PF1<<2|IDPtr->Bits.PF2<<5);//析取PF PGNTmp<<=8; 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); 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 卡尔 MC9S12XEP 芯片 CAN 总线 代码