飞思卡尔MC9S12XEP芯片的CAN总线代码Word下载.docx
- 文档编号:4747181
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:42
- 大小:21.79KB
飞思卡尔MC9S12XEP芯片的CAN总线代码Word下载.docx
《飞思卡尔MC9S12XEP芯片的CAN总线代码Word下载.docx》由会员分享,可在线阅读,更多相关《飞思卡尔MC9S12XEP芯片的CAN总线代码Word下载.docx(42页珍藏版)》请在冰点文库上搜索。
//Function:
//Param:
//Return:
//note
voidCANFilterInit(uint8_tCAN)
{
if(CAN<
CANS)
{
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)
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;
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;
Bits.PF0|IDPtr->
Bits.PF1<
2|IDPtr->
Bits.PF2<
5);
//析取PF
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);
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))>
>
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;
Cmd_Type=HMI_CMD_TEXTDIS_ASCII;
HMI_Text_DisPtr->
Start_Point.x=145;
Start_Point.y=150;
Digit2Ascii0(engspeed,InPtr);
Cmd_End=HMI_CMD_END;
HMI_Text_Dis_Que.Rear=(uint8_t)(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN;
=(HMI_Text_Dis_Que.Rear+1)%HMI_TEXTDIS_QUELEN)
Start_Point.x=590;
if(actualengtorque<
12500)
{
actualengtorque=12500-actualengtorque;
Digit2AsciiPos0(actualengtorque,HMI_Text_Dis_Que.Rear);
}
else
actualengtorque=actualengtorque-12500;
Digit2Ascii0(actualengtorque,HMI_Text_Dis_Que.Rear);
//进列一项
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->
//文本显示位置x坐标
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 卡尔 MC9S12XEP 芯片 CAN 总线 代码
![提示](https://static.bingdoc.com/images/bang_tan.gif)