⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 canbus.c

📁 新能源燃料电池小车系统
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -