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

📄 can_bus.c

📁 c8051f040上CAN总线的应用
💻 C
字号:

*****************************************************************************/
#include <c8051F040.h>                    
#include <SYSTEM.H>
#include <COMM1ISR.C>
#include <TIME3ISR.C>
#include <SYSTEM.C>
/****************************主程序*****************************/
void main (void) 
{
    	char SFRPAGE_SAVE = SFRPAGE;  
    	unsigned char i; 
    	WDTCN = 0xde;                       
    	WDTCN = 0xad;                            
    	SYSCLK_Init ();                    
    	PORT_Init ();                       
    	UART1_Init ();                      
    	UART0_Init ();					
    	Timer3_Init ();                     
    	Variable_Init();                    
    	PortSet();
    	Clear_Msg_Objects();      // Clear CAN RAM
    	Init_Msg_Object_TX (1);   // Initialize message obiect to transmit data
      Init_Msg_Object_RX (17);  // Initialize message object to receive data
      EIE2 = 0x20;              // Enable CAN interrupts in CIP-51  
      Start_CAN();              // Function call to start CAN
      EA = 1;                   // Global enable 8051 interrupts
      for(;;);
  
                         
}










////////////////////////////////////////////////////////////////////////////////
//Interrupt Service Routine
////////////////////////////////////////////////////////////////////////////////
void ISRname (void) interrupt 19
{
   unsigned char status,i;
   status = CAN0STA;
   if((status&0x10) != 0)
   {                            // RxOk is set, interrupt caused by reception
      CAN0STA = (CAN0STA&0xEF)|0x07;         // Reset RxOk, set LEC to NoChange
      /* read message number from CAN INTREG */
      CAN0ADR =NEWDAT2;
      i=CAN0DATL;
      if (i==1)
      {
         CAN0ADR =NEWDAT2;
         CAN0DATL=0;
         MkrecData();
         MksendData();
      }
      
    }
    
    
    if((status&0x08) != 0)
    {                                       // TxOk is set, interrupt caused by transmision
      CAN0STA = (CAN0STA&0xF7)|0x07;        // Reset TxOk, set LEC to NoChange
    }
    
    
    if(((status&0x07) != 0)&&((status&0x07) != 7))
    {                           // Error interrupt, LEC changed
      /* error handling ? */
      CAN0STA = CAN0STA|0x07;              // Set LEC to NoChange
    }
}
	 



/*****************************************************************
IN:CanRecData[255]
OUT:Command
COMMENT:根据CanRecData[255]中的数据把命令号保存到Command
******************************************************************/
void MkrecData(void)
{
	 char i,j=0;
   SFRPAGE =CAN0_PAGE; 
   
   
   CAN0ADR =IF2CMDMSK;
   CAN0DAT=0x003F;// Read arb,conrol,clear int,clear NewDat, get dataA/B
   CAN0ADR =IF2CMDRQST;
   CAN0DATL=17;     
   
   
   CAN0ADR =IF2DATA1;  /*指向数据场的第一个字节*/
   CanRecData[1]=CAN0DATH;/*读取8个字节的数据*/
   CanRecData[0]=CAN0DATL;
   CanRecData[3]=CAN0DATH;
   CanRecData[2]=CAN0DATL;
   CanRecData[5]=CAN0DATH;
   CanRecData[4]=CAN0DATL;
   CanRecData[7]=CAN0DATH;
   CanRecData[6]=CAN0DATL;
   
	 
	 
	 if(CanRecData[0]==0x02)
	 {
	 	Command=Idx_Yrddtc6;
	 }
	 
	 
	 if(CanRecData[0]==0x03)
	 {
	 	if(CanRecData[1]==0x14)
	   {
	 	   Command=Idx_clrdtc1;
	   }
	   else
	   {
	      if(CanRecData[2]==0xe6)
	      {
	 	      Command=Idx_Yrddtc1;
	      } 
	      
	      if(CanRecData[2]==0x02)
	      {
	 	      Command=Idx_Yrddtc2;
	      }  
	   }	  
	 }
	 
	 if(CanRecData[0]==0x04)
	 {
	 	Command=Idx_Yrddtc3;
	 }
	 
	 if(CanRecData[0]==0x30)
	 {
	 	MultiDtcFlag=0x01;
	 }

}

/*****************************************************************
IN:Command
OUT:Comm0SendData[255]
COMMENT:根据Command中的值把相应的命令存到CanRecData[255]
******************************************************************/
void MksendData(void)
{
		
	
	
	Curcommand=Command;
	Transmit_Message (1);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -