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

📄 system.c

📁 c8051f040上CAN总线的应用
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
		Save5bps |=0x10;
	}
	DelayTime(200);
	if(RXD0==1)
	{
		Save5bps |=0x20;
	}
	DelayTime(200);
	if(RXD0==1)
	{
		Save5bps |=0x40;
	}
	DelayTime(200);
	if(RXD0==1)
	{
		Save5bps |=0x80;
	}
	return Save5bps;	
}*/ 

/*************************************************
IN:
OUT:
COMMENT:单字节累加和校验
*************************************************/
/*void SingleCheck(void)
{
	unsigned char i;
	unsigned char j;
	unsigned char sum=0;
	if(Comm0SendData[0]!=0x80)
	{
		i=Comm0SendData[0]-0x7c;
	}
	else
	{
		i=Comm0SendData[3]+5;
	}
	for(j=0;j<i-1;j++)
	{
		sum+=Comm0SendData[j];
	}
	Comm0SendData[i-1]=sum;
}*/


/*************************************************
IN:
OUT:
COMMENT:单字节累加和校验
*************************************************/
/*void DoubleCheck(void)
{
	unsigned char i;
	unsigned short j;
	unsigned char sum=0;
	if(Comm0SendData[0]!=0x80)
	{
		i=Comm0SendData[0]-0x7c;
	}
	else
	{
		i=Comm0SendData[3]+5;
	}
	for(j=0;j<i-3;j++)
	{
		sum+=Comm0SendData[j];
	}
	Comm0SendData[i-1]=sum/256;
	Comm0SendData[i-2]=sum%256;
}*/

/********************CAN 波特率设置**************************/
//In:波特率以K为单位
//Out:BITREG(位定时寄存器)
void SetBaudRate(unsigned int baudrate)
{
  CAN0ADR  = BITREG;  // Point to Bit Timing register
  switch(baudrate)
  {
  	
    case 500:
    {
    	CAN0DAT  = 0x7CC0;	
    }
    break;
    
    
    case 1000:
    {
       CAN0DAT = 0x1780;	
    }
    break;
  }    
}

//Clear Message Objects
void Clear_Msg_Objects (void)
{
  unsigned char i;
  SFRPAGE  = CAN0_PAGE;
  CAN0ADR  = IF1CMDMSK;    // Point to Command MSK Register 1
  CAN0DATL = 0xFF;         // Set direction to WRITE all IF registers to Msg Obj
  for (i=1;i<33;i++)
    {
      CAN0ADR=IF1ARB2;     //指向IF1仲裁寄存器2
      CAN0DAT=0X0000;      //清除MsgVal位
      CAN0DAT=0X0000;     //清除消息控制寄存器

      CAN0ADR = IF1CMDRQST; // Write blank (reset) IF registers to each msg obj
      CAN0DATL = i;
    }
}

//Initialize Message Object for RX
void Init_Msg_Object_RX (char MsgNum)
{
  /*SFRPAGE  = CAN0_PAGE;
  CAN0ADR  = IF1CMDMSK;  // Point to Command MSK 1
  CAN0DAT  = 0x00B8;     // Set to WRITE, and alter all Msg Obj except ID MSK
                         // and data bits
  CAN0ADR  = IF1ARB1;    // Point to arbitration1 register
  CAN0DAT  = 0x0000;     // Set arbitration1 ID to "0"
  CAN0DAT  = 0x8000;     // Arb2 high byte:Set MsgVal bit, no extended ID,
                         // Dir = RECEIVE
  CAN0DAT  = 0x0480;     // Msg Cntrl: set RXIE, remote frame function disabled
  CAN0ADR  = IF1CMDRQST; // Point to Command Request reg.
  CAN0DATL = MsgNum;     // Select Msg Obj passed into function parameter list
                         // --initiates write to Msg Obj*/
  // 3-6 CAN clock cycles to move IF register contents to the Msg Obj in CAN RAM
   SFRPAGE = CAN0_PAGE;
   CAN0ADR = IF2CMDMSK;       /*指向命令屏蔽寄存器2*/
   CAN0DAT = 0x00B8;          //00000000 10111000 Set to WRITE, and alter all Msg Obj except ID MSK         
   //CAN0DAT = 0x00F8;                           // and data bits
                              
                              
   switch(MsgNum)
   {
      case 17:               /*第17个对象用来接收数据ID=07E0*/
	    {
          
          
          CAN0ADR = IF2MSK1;   
          CAN0DAT = 0x0000;  //00000000 00000000 
          CAN0DAT = 0xAF80;  //010 *11111100000* 00
          
          CAN0ADR = IF2ARB1;                    
          CAN0DAT = 0x0000;  //00000000 00000000                     
          CAN0DAT = 0x9F80;  //100 *11111100000* 00 
	    };
	    break;	           
   }
    
   CAN0ADR = IF2MSGC;   /*设置报文控制寄存器:使用屏蔽UMask、中断允许RxIE、EOB、DLC=8*/      
   CAN0DAT = 0x1488;    //                      0001            0100       1000 1000           
   
   CAN0ADR = IF2CMDRQST;                 
   CAN0DATL = MsgNum;
}

//Initialize Message Object for TX
void Init_Msg_Object_TX (char MsgNum)
{
  /*SFRPAGE = CAN0_PAGE;
  CAN0ADR = IF1CMDMSK;  // Point to Command MSK 1
  CAN0DAT = 0x00B2;     // Set to WRITE, & alter all Msg Obj except ID MSK bits
  
  CAN0ADR = IF1ARB1;    // Point to arbitration1 register
  CAN0DAT = 0x0000;     // Set arbitration1 ID to highest priority
  CAN0DAT = 0xA000;     // Autoincrement to Arb2 high byte:
                        // Set MsgVal bit, no extended ID, Dir = WRITE
  CAN0DAT = 0x0081;     // Msg Cntrl: DLC = 1, remote frame function not enabled
  CAN0ADR = IF1CMDRQST; // Point to Command Request reg.
  CAN0DAT = MsgNum;     // Select Msg Obj passed into function parameter list
                        // --initiates write to Msg Obj
  // 3-6 CAN clock cycles to move IF reg contents to the Msg Obj in CAN RAM.*/

  SFRPAGE=CAN0_PAGE;
  CAN0ADR=IF1CMDMSK;   /*指向IF1命令屏蔽寄存器*/
  CAN0DAT=0x00B8;      /*设置为写操作,除了ID的MSK和数据位不能改变,其它都可以变化*/
                       //000000 10111000
 
  
  CAN0ADR=IF1MSGC;       //设置报文控制寄存器:DLC=8,远程帧允许,中断允许
  CAN0DAT=0X2288;        //0010 0010 0000 1000    BYTE.13=1 允许中断
                         //                       BYTE.9=1  在接收到一远程帧时TxRqst被置1  
                         //                       BYTE.3~0  发送8个字节
  CAN0ADR=IF1CMDRQST;    /*指向命令请求寄存器*/
  CAN0DATH=0X00;         /*向此寄存器中写入目标对象编号,对此对象进行设置*/ 
  CAN0DATL=MsgNum;
}  
  

//Start CAN
void Start_CAN (void)
{
  
  SFRPAGE  = CAN0_PAGE;
  CAN0CN  |= 0x41;       // Configuration Change Enable CCE and INIT  
  SetBaudRate(500); 
  CAN0ADR =NEWDAT2;
  CAN0DATL=0;
  CAN0CN  |= 0x06;       // Global Int. Enable IE and SIE
  CAN0CN  &= ~0x41;      // Clear CCE and INIT bits, starts CAN state machine

}


void Transmit_Message (char MsgNum)
{
   unsigned char i,j;
   i=0;
   j=(MsgNum-1)<<3;
    
   SFRPAGE  = CAN0_PAGE;  // IF1 already set up for TX
   CAN0ADR  = IF1CMDMSK;  // Point to Command Mask 1
   CAN0DAT  = 0x0087;     // Config to WRITE to CAN RAM, write data bytes,
                          // set TXrqst/NewDat, Clr IntPnd  
   CAN0ADR=IF1ARB2;  
                 
   CAN0DATH |= 0x80; 
   CAN0ADR=IF1DATA1;                   	     
	 /*for(i=0;i<4;i++)
	 {
		  CAN0DATH=CanSendData[j]; 
		  CAN0DATL=CanSendData[j+1];      
      j+=2;
   }*/
   CAN0DATH=CanSendData[1];
   CAN0DATL=CanSendData[0];
   CAN0DATH=CanSendData[3];
   CAN0DATL=CanSendData[2];
   CAN0DATH=CanSendData[5];
   CAN0DATL=CanSendData[4];
   CAN0DATH=CanSendData[7];
   CAN0DATL=CanSendData[6];
   
   
   
   CAN0ADR=IF1CMDRQST;            
   CAN0DAT=MsgNum;               
}

⌨️ 快捷键说明

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