?? canbus.c
字號:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dp256.h> /* derivative information */
#include "DataType.h" /* data definition information*/
#include "Hd_Mcu_Cfg.h" /* hardware configuration and macros*/
#include "CAN_Cfg.h" /* CANBUS configuration and relative function declaration*/
extern unsigned int Ist; //stands for stack output current with resolution of 0.1A
extern unsigned int Vst; //stands for stack output voltage with resolution of 0.1V
extern unsigned int Pst; //stands for gross output power of stack W
extern unsigned int PHS; //stansd for hydrogen supply pressure, base 0 and resoultion is 1mbara
extern unsigned int PHin; //stansd for anode inlet pressure, base 0 and resoultion is 1mbara
extern unsigned int PWin; //stansd for coolant inlet pressure, base 0 and resoultion is 1mbara
extern unsigned int PAin; //stansd for cathode inlet pressure, base 0 and resoultion is 1mbara
extern unsigned int TAin; //stansd for cathode inlet tempature, base -40C and resoultion is 0.01
extern unsigned int THin; //stansd for anode inlet tempature, base -40C and resoultion is 0.01
extern unsigned int TWin; //stansd for coolant inlet tempature, base -40C and resoultion is 0.01
extern unsigned int TWout; //stansd for coolant outlet tempature, base -40C and resoultion is 0.01
//Data used for CAN trans and control
extern unsigned int Pset; //Pset value from VMS, resolution is 1W, which original resolution from CANBUS is 60W
extern unsigned int PLmt; //stands for net output power limit W
extern unsigned int PLmtPatch; //stands for compensate for output power limit W
extern unsigned int PPar; //stands for power consumed by auxiliaries W
extern unsigned int CVmax; //stands for maximal cell unit voltage 0.01V
extern unsigned int CVmin; //stands for minumal cell unit voltage 0.01V
extern unsigned int CMV1; //stands for first cell module voltage 0.01V
extern unsigned int CMV2; //stands for second cell module voltage 0.01V
extern unsigned int CMV3; //stands for third cell module voltage 0.01V
extern unsigned int CMV4; //stands for fourth cell module voltage 0.01V
//extern unsigned char DelayCMP; //Used for time counter for Ncp power up
extern unsigned char Ncp;
extern unsigned char frqR1;
extern unsigned char frqR2;
extern unsigned char modeCtrl;
extern unsigned char stepCtrl;
extern volatile ByteFlags TaskFlags;
extern volatile StateDef FCEStatus;
extern volatile FCEStateD StateDevice;
extern volatile ByteFlags SysFlags;
extern volatile ByteFlags ErrFlags;
extern unsigned int perCANFCETimer;
extern unsigned char CANFCETrigger; //stands for CANFCE trigger type
volatile CAN_Message MsgRdCANVMS[CANVMS_RXD],MsgSdCANVMS[CANVMS_TXD];
volatile CAN_Message MsgRdCANFCE[CANFCE_RXD],MsgSdCANFCE[CANFCE_TXD];
const CAN_ID CANVMS_Sd_ID[CANVMS_TXD] ={ID_FCE2VMSA,ID_FCE2VMSB,ID_FCE2VMSC,ID_FCE2VMSD,ID_FCE2VMSE,ID_FCE2VMSF,ID_DM1,ID_DM2,ID_DM3};
const CAN_ID CANVMS_Rd_ID[CANVMS_RXD] ={ID_VMSStatus,ID_VMS2FCEHMS,ID_DM0};
const CAN_ID CANFCE_Rd_ID[CANFCE_RXD]={ID_M1Msg0,ID_M2Msg0,ID_M3Msg0,ID_M4Msg0,ID_FCSCmd,ID_CaliSet};
const CAN_ID CANFCE_Sd_ID[CANFCE_TXD]={ID_FCEP,ID_StCaMsg,ID_StAnMsg,ID_StCTMsg,ID_StSTMsg};
const unsigned int cntCANFCELmt=500; //limit time counter for CANFCE wait
const unsigned int cntCANVMSLmt=500; //limit time counter for CANVMS wait
#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Interrupt section for this module. Placement will be in NON_BANKED area. */
#pragma TRAP_PROC
interrupt void CAN0_Rx_isr(void)
{
CAN_Message temp;
temp.ID.IDBYTES.ID0 = CAN0RXIDR0; //read ID
temp.ID.IDBYTES.ID1 = CAN0RXIDR1;
temp.ID.IDBYTES.ID2 = CAN0RXIDR2;
temp.ID.IDBYTES.ID3 = CAN0RXIDR3;
temp.data[0] = CAN0RXDSR0;
temp.data[1] = CAN0RXDSR1;
temp.data[2] = CAN0RXDSR2; //download data
temp.data[3] = CAN0RXDSR3;
temp.data[4] = CAN0RXDSR4;
temp.data[5] = CAN0RXDSR5;
temp.data[6] = CAN0RXDSR6;
temp.data[7] = CAN0RXDSR7;
CAN0RFLG_RXF = 1; //clear flag
CANVMS_DownLoad(temp);
}
interrupt void CAN1_Rx_isr(void)
{
CAN_Message temp;
temp.ID.IDBYTES.ID0 = CAN1RXIDR0; //read ID
temp.ID.IDBYTES.ID1 = CAN1RXIDR1;
temp.ID.IDBYTES.ID2 = CAN1RXIDR2;
temp.ID.IDBYTES.ID3 = CAN1RXIDR3;
temp.data[0] = CAN1RXDSR0;
temp.data[1] = CAN1RXDSR1;
temp.data[2] = CAN1RXDSR2; //download data
temp.data[3] = CAN1RXDSR3;
temp.data[4] = CAN1RXDSR4;
temp.data[5] = CAN1RXDSR5;
temp.data[6] = CAN1RXDSR6;
temp.data[7] = CAN1RXDSR7;
CAN1RFLG_RXF = 1; //clear flag
CANFCE_DownLoad(temp);
}
interrupt void CAN0_Tx_isr(void)
{
return;
}
interrupt void CAN1_Tx_isr(void)
{
return;
}
interrupt void CAN0_Wake_isr(void)
{
return;
}
interrupt void CAN1_Wake_isr(void)
{
return;
}
interrupt void CAN0_Err_isr(void)
{
CAN0Init();
}
interrupt void CAN1_Err_isr(void)
{
CAN1Init();
}
/************************************************************************/
#pragma CODE_SEG DEFAULT
void CANBUSInit(void)
{
CAN0Init();
CAN1Init();
CANMsgCfg();
}
void CANVMSTrans(void)
{
unsigned char tempIndex;
unsigned int CANVMSTimer;
for(tempIndex=0;tempIndex<CANVMS_TXD;tempIndex++)
{
CANVMSTimer=0;
while(!CAN0TFLG&&CANVMSTimer<cntCANVMSLmt)CANVMSTimer++; //wait for empty buffer
CAN0TBSEL = CAN0TFLG; //select avilable buffer
CAN0TXIDR0 = MsgSdCANVMS[tempIndex].ID.IDBYTES.ID0;
CAN0TXIDR1 = MsgSdCANVMS[tempIndex].ID.IDBYTES.ID1;
CAN0TXIDR2 = MsgSdCANVMS[tempIndex].ID.IDBYTES.ID2;
CAN0TXIDR3 = MsgSdCANVMS[tempIndex].ID.IDBYTES.ID3; //config ID
CAN0TXDSR0 = MsgSdCANVMS[tempIndex].data[0];
CAN0TXDSR1 = MsgSdCANVMS[tempIndex].data[1];
CAN0TXDSR2 = MsgSdCANVMS[tempIndex].data[2];
CAN0TXDSR3 = MsgSdCANVMS[tempIndex].data[3];
CAN0TXDSR4 = MsgSdCANVMS[tempIndex].data[4];
CAN0TXDSR5 = MsgSdCANVMS[tempIndex].data[5];
CAN0TXDSR6 = MsgSdCANVMS[tempIndex].data[6];
CAN0TXDSR7 = MsgSdCANVMS[tempIndex].data[7]; //upload data
CAN0TXDLR = MsgSdCANVMS[tempIndex].length; //set data length 8bytes
CAN0TXTBPR = CAN0TBSEL; //config proprity
CAN0TFLG = CAN0TBSEL;
}
}
void CANVMS_DownLoad(CAN_Message temp)
{ unsigned char index,dataindex;
CAN_ID i,j;
j=temp.ID;
for(index=0;index<CANVMS_RXD;index++)
{
i=MsgRdCANVMS[index].ID;
if((i.IDBYTES.ID0==j.IDBYTES.ID0)&&(i.IDBYTES.ID1==(j.IDBYTES.ID1&0xE0)))
{
for(dataindex=0;dataindex<8;dataindex++ )MsgRdCANVMS[index].data[dataindex]= temp.data[dataindex];
/*set flags according the msg ID*/
/*if a time base message receieved enable the 14ms wait for sending message*/
/*if a VMS command message receieved set a flag for main routine*/
if(index==VMSStatus){EnableCANVMS;}
else if(index==VMS2FCE)TaskVMSCmd=1;
break;
}
}
}
void CANFCETrans(void)
{
unsigned int CANFCETimer=0;
unsigned char tempIndex;
for(tempIndex=0;tempIndex<CANFCE_TXD;tempIndex++)
{
CANFCETimer=0;
while(!CAN1TFLG&&CANFCETimer<cntCANFCELmt)CANFCETimer++; //wait for empty buffer
CAN1TBSEL = CAN1TFLG; //select avilable buffer
CAN1TXIDR0 = MsgSdCANFCE[tempIndex].ID.IDBYTES.ID0;
CAN1TXIDR1 = MsgSdCANFCE[tempIndex].ID.IDBYTES.ID1;
CAN1TXIDR2 = MsgSdCANFCE[tempIndex].ID.IDBYTES.ID2;
CAN1TXIDR3 = MsgSdCANFCE[tempIndex].ID.IDBYTES.ID3; //config ID
CAN1TXDSR0 = MsgSdCANFCE[tempIndex].data[0];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -