飞思卡尔MC9S12XEP芯片的CAN总线代码.docx

上传人:b****2 文档编号:2558578 上传时间:2023-05-04 格式:DOCX 页数:42 大小:21.79KB
下载 相关 举报
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第1页
第1页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第2页
第2页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第3页
第3页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第4页
第4页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第5页
第5页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第6页
第6页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第7页
第7页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第8页
第8页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第9页
第9页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第10页
第10页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第11页
第11页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第12页
第12页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第13页
第13页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第14页
第14页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第15页
第15页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第16页
第16页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第17页
第17页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第18页
第18页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第19页
第19页 / 共42页
飞思卡尔MC9S12XEP芯片的CAN总线代码.docx_第20页
第20页 / 共42页
亲,该文档总共42页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

飞思卡尔MC9S12XEP芯片的CAN总线代码.docx

《飞思卡尔MC9S12XEP芯片的CAN总线代码.docx》由会员分享,可在线阅读,更多相关《飞思卡尔MC9S12XEP芯片的CAN总线代码.docx(42页珍藏版)》请在冰点文库上搜索。

飞思卡尔MC9S12XEP芯片的CAN总线代码.docx

飞思卡尔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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2