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

📄 int.c

📁 2个F040之间的CAN通讯
💻 C
字号:
#include "c8051f040.h"
#include "can.h"

extern unsigned char   DO_Address;
extern unsigned char  temp1,temp2;
extern unsigned char  DO_Control_Data_New0,DO_Control_Data_New1;


//xdata unsigned char ss[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
xdata unsigned char rr[8]={0,0,0,0,0,0,0,0};

//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
void SYSCLK_Init (void) 
{
  SFRPAGE = 0xF;
  OSCXCN |= 0x67;					   //Running at 22.1184MHz.	
  while (!((OSCXCN & 0x80) == 0x80));
  CLKSEL |= 0x01;
}
 
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
void PORT_Init (void) 
{
  SFRPAGE = 0xF;
XBR1 |= 0x00;
  XBR1 |= 0x04;              //INT0 Routed To Port Pin
  XBR2 |= 0x40;              //If crossbar is disabled, all ports are in input mode.  
  XBR3 |= 0x80;              //CTX pin's output mode is configured as push-pull.
//P0MDOUT = 0x00;
//P1MDIN =0xFF;
  P4MDOUT = 0x03;            //CANLED and ENABLE
  P5MDOUT = 0x00;            //OUTPUT CONTROL PORT
  P6MDOUT = 0x00;            //OUTPUT CONTROL PORT
}

//-----------------------------------------------------------------------------
// INT_Init
// Interrupts By Priority : INT0 > CAN0
//-----------------------------------------------------------------------------
void INT_Init (void) 
{
  IE   |= 0x03;              //INT0 Interrupt Enabled        
                             //Timer0 Interrupt Enabled
//  IE   |= 0x01;              //INT0 Interrupt Enabled
  EIE2 |= 0x20;              //CAN0 Interrupt Enabled
}


//-----------------------------------------------------------------------------
// CAN_Init
// CAN0CN  :  Automatic Retransmission is Disable. Error and Status Interrrupt 
//            is Disabled. Module Interrrup is eabled.
// BITREG  :  BaudRate is 1M/8(b/s).
// CAN0TST :  Tx1, Tx0, LBack and Silenct are all 0. Use Basic Mode.
//-----------------------------------------------------------------------------
void CAN_Init (void) 
{
  SFRPAGE = CAN0_PAGE;
  CAN0CN = 0xC3;
  CAN0ADR = 0x03;
  CAN0DATH = 0x5E;
  CAN0DATL = 0xC7;              /*0x5EC7的波特率:125kbps   0x5EC0的波特率1Mbps*/
  CAN0TST = 0x10;      //LBack  /*正常工作没有影响*/
}

void CAN_Start(void)
{
  SFRPAGE = CAN0_PAGE;
  CAN0CN = 0x02;		//
}

//-----------------------------------------------------------------------------
// CAN_Transmit_Init(unsigned char MsgNum , unsigned char id)
// wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=0,txrqet=0,dataA=1,dataB=1
// MsgVal=1, Xad=0,Dir=1:send
// not use the filter,UMask=0,RmtEn=0,eob=1, dlc =8
/* 发送初始化(对象号,ID号)*/
//-----------------------------------------------------------------------------
void CAN_Transmit_Init (unsigned char MsgNum , unsigned char id) 
{  
/*
  unsigned char id_tempL,id_tempH;
  id_tempL = id << 2;          //  id & 0x0F) << 2
  id_tempH = id >> 6;
  id_tempH = id_tempH || 0xA0;  // MsgVal=1, Dir =1
*/

  SFRPAGE = CAN0_PAGE;
  CAN0ADR = IF1CMDMSK;
  CAN0DATL = 0xb3;    //wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=0,txrqet=0,dataa=1,datab=1

//  CAN0ADR = IF1MSK1;
//  CAN0DATH = 0x00;
 // CAN0DATL = 0x00;
//  CAN0DATH = 0x00;					//!!bit 13  :not use
//  CAN0DATL = 0x00;           //IF1MSK

  CAN0ADR = IF1ARB1;
  CAN0DATH = 0x00;
  CAN0DATL = 0x00;
  CAN0DATH = 0xA0;      //
  CAN0DATL =  (id << 2 ) & 0x3C;    //0x80 | (((DO_Address & 0x0F) << 2)); //IF1ARB
                 //MsgVal=1, Xad=0,Dir=1:send 
  CAN0DATH = 0x00;           // not use the filter,UMask=0,RmtEn=0
  CAN0DATL = 0x88;           //IF1MSGC: eob=1, dlc =8

  CAN0DATH = 0x00;
  CAN0DATL = 0x00;			//data A1
  CAN0DATH = 0x00;
  CAN0DATL = 0x00;			//data A2						
  CAN0DATH = 0x00;
  CAN0DATL = 0x00;			//data B1
  CAN0DATH = 0x00;
  CAN0DATL = 0x00;          //data B2

  CAN0ADR = IF1CMDRQST;      
  CAN0DATL = MsgNum;           //
}

//-----------------------------------------------------------------------------
// CAN_Receive_Init(unsigned char MsgNum , unsigned char id)
// wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=0,txrqet=0,dataA=1,dataB=1
// MsgVal=1, Xad=0,Dir=0:receive
// not use the filter,UMask=0,RmtEn=0,eob=1, dlc =8,  RxEn=1
/* 接收初始化(对象号,ID号)*/
//-----------------------------------------------------------------------------
void CAN_Receive_Init (unsigned char MsgNum , unsigned char id) 
{
/*
  unsigned char id_tempL,id_tempH;
  id_tempL = id << 2;          //  id & 0x0F) << 2
  id_tempH = id >> 6;
  id_tempH = id_tempH || 0x80;  // MsgVal=1, Dir =0
*/

  SFRPAGE = CAN0_PAGE;
  CAN0ADR = IF2CMDMSK;
  CAN0DATL = 0xbb;    //wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=1,txrqet=0,dataa=1,datab=1

//  CAN0ADR = IF2MSK1;
//  CAN0DATH = 0x00;
//  CAN0DATL = 0x00;
//  CAN0DATH = 0x00;				//0x23;
//  CAN0DATL = 0xF4;           //IF2MSK  0xco;

  CAN0ADR = IF2ARB1;
  CAN0DATH = 0x00;
  CAN0DATL = 0x00;
  CAN0DATH = 0x80;
  CAN0DATL = (id << 2 ) & 0x3C;            //IF2ARB
                 //MsgVal=1, Xad=0,Dir=0:get 
  CAN0DATH = 0x04;           //not use the filter,RxEn=1
  CAN0DATL = 0x88;           //IF2MSGC,, eob=1, dlc =8

  CAN0DATH = 0x00;
  CAN0DATL = 0x00;			//data A1
  CAN0DATH = 0x00;
  CAN0DATL = 0x00;			//data A2						
  CAN0DATH = 0x00;
  CAN0DATL = 0x00;			//data B1
  CAN0DATH = 0x00;
  CAN0DATL = 0x00;          //data B2

  CAN0ADR = IF2CMDRQST;      
  CAN0DATL = MsgNum;           //
}

//-----------------------------------------------------------------------------
// Timer_Init
// Timer0 For CAN Error -- If there is no CAN information form the bus for
//                         10ms, CPU will close all the outputs.
//-----------------------------------------------------------------------------
void Timer_Init (void) {
  SFRPAGE = TIMER01_PAGE;
  TMOD |= 0x01;
  CKCON |= 0x02;
  TH0 = 0xFF;
  TL0 = 0xFF;
}


/*
//-----------------------------------------------------------------------------
// CAN_send(unsigned char MsgNum,unsigned char *p )  :update the data & start send
/* 发送数据帧(对象号)::发送命令*/
//-----------------------------------------------------------------------------
void CAN_Transmit(unsigned char MsgNum,unsigned char *p_data )
{
  unsigned char num;

  SFRPAGE = CAN0_PAGE;
  CAN0ADR = IF1CMDMSK;
  CAN0DATL = 0x87;    //wr/rd=1,mask=0,arb=0,control=0,,clrintpnd=0,txrqet=1,dataa=1,datab=1

  CAN0ADR = IF1DATA1;
  for(num=0;num<8;num++)
  {
  	CAN0DATH=p_data[num];
	num++;
	CAN0DATL=p_data[num];
  }
  
  CAN0ADR = IF1CMDRQST;      
  CAN0DATL = MsgNum;           //
}


//-----------------------------------------------------------------------------
// CAN_receive(unsigned char MsgNum,unsigned char *p )
/* 接收数据帧(对象号,数组地址)*/
//-----------------------------------------------------------------------------
void CAN_Receive (unsigned char MsgNum, unsigned char *p )
{
  unsigned char num;
 
  SFRPAGE = CAN0_PAGE;
  CAN0ADR = IF2CMDMSK;
  CAN0DATL = 0x0F;
  CAN0ADR = IF2CMDRQST;
  CAN0DATL = MsgNum;

  CAN0ADR = IF2DATA1;
  for(num=0;num<4;num++)
  {
  	*p++ = CAN0DATH;
	*p++ = CAN0DATL;
  }
}
*/

/*
//-----------------------------------------------------------------------------
// remote_rqst_int(unsigned char MsgNum , unsigned char id)
//wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=0,txrqet=0,dataa=1,datab=1
/* 远程帧请求初始化(对象号,ID),初始化远程帧,请求其他节电的数据*/
//-----------------------------------------------------------------------------
void CAN_RemoteRqst_Init(unsigned char MsgNum , unsigned char id)        //id=1
{

//  unsigned char id_tempL,id_tempH;
//  id_tempL = id << 2;          //  id & 0x0F) << 2
//  id_tempH = id >> 6;
//  id_tempH = id_tempH || 0x80;  // MsgVal=1, Dir =0

  SFRPAGE = CAN0_PAGE;
  CAN0ADR = IF1CMDMSK;
  CAN0DATL = 0xb3;    //wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=0,txrqet=0,dataa=1,datab=1
  //?? remote data??

  CAN0ADR = IF1ARB1;
  CAN0DATH = 0x00;
  CAN0DATL = 0x00;
  CAN0DATH = 0x80;  // MsgVal=1, Dir =0
  CAN0DATL = (id << 2 ) & 0x3C;           //IF2ARB
                 //MsgVal=1, Xad=0,Dir=0:receive

  CAN0DATH = 0x04;           //not use the filter,RxEn=1
  CAN0DATL = 0x88;           //IF2MSGC

  CAN0ADR = IF1CMDRQST;      
  CAN0DATL = MsgNum;         	
}
*/

/*
//-----------------------------------------------------------------------------
// remote_rqst(unsigned char MsgNum)
/* 发送远程帧(对象号)::发送请求其他节点数据的命令*/
//-----------------------------------------------------------------------------
/*
void CAN_RemoteRqst(unsigned char MsgNum)
{
  SFRPAGE = CAN0_PAGE;

  CAN0ADR = IF1CMDMSK;
  CAN0DATL = 0x87;    //wr/rd=1,mask=0,arb=0,control=0,,clrintpnd=0,txrqet=1,dataa=1,datab=1
  //?? remote data??

  CAN0ADR = IF1CMDRQST;      
  CAN0DATL = MsgNum;    
}
*/



//-----------------------------------------------------------------------------
// CAN_Remote_Send_Init(unsigned char MsgNum,unsigned char id )
/* 应答远程帧初始化(对象号,ID)::向发送请求数据的节点发送数据的初始化*/
//-----------------------------------------------------------------------------

void CAN_Remote_Send_Init(unsigned char MsgNum,unsigned char id )
{
SFRPAGE = CAN0_PAGE;
  CAN0ADR = IF1CMDMSK;
  CAN0DATL = 0xb3;    //wr/rd=1,mask=0,arb=1,control=1,,clrintpnd=0,txrqet=0,dataa=1,datab=1

  CAN0ADR = IF1ARB1;
  CAN0DATH = 0x00;
  CAN0DATL = 0x00;
  CAN0DATH = 0xA0;      //
  CAN0DATL =  (id << 2 ) & 0x3C;    //0x80 | (((DO_Address & 0x0F) << 2)); //IF1ARB
                 //MsgVal=1, Xad=0,Dir=1:send 
  CAN0DATH = 0x0a;           // not use the filter,UMask=0,RmtEn=1,TxIE=1
  CAN0DATL = 0x88;           //IF1MSGC: eob=1, dlc =8

  CAN0DATH = 0x00;
  CAN0DATL = 0x00;			//data A1
  CAN0DATH = 0x00;
  CAN0DATL = 0x00;			//data A2						
  CAN0DATH = 0x00;
  CAN0DATL = 0x00;			//data B1
  CAN0DATH = 0x00;
  CAN0DATL = 0x00;          //data B2

  CAN0ADR = IF1CMDRQST;      
  CAN0DATL = MsgNum;           //
}

//-----------------------------------------------------------------------------
// CAN_Remote_Updata(unsigned char MsgNum,unsigned char *p_data )
/* 应答远程帧数据更新(对象号,数组地址)::对应答远程帧数据的更新*/
//-----------------------------------------------------------------------------
void CAN_Remote_Updata(unsigned char MsgNum,unsigned char *p_data )
{
  unsigned char num;

  SFRPAGE = CAN0_PAGE;
  CAN0ADR = IF2CMDMSK;
  CAN0DATL = 0x08;    //wr/rd=0,mask=0,arb=0,control=0,,clrintpnd=1,txrqet=0,dataa=0,datab=0
  CAN0ADR = IF2CMDRQST;      
  CAN0DATL = MsgNum;           //

  CAN0ADR = IF1CMDMSK;
  CAN0DATL = 0x8b;    //wr/rd=1,mask=0,arb=0,control=0,,clrintpnd=1,txrqet=0,dataa=1,datab=1

  CAN0ADR = IF1DATA1;
  for(num=0;num<8;num++)
  {
  	CAN0DATH=p_data[num];
	num++;
	CAN0DATL=p_data[num];
  }
  
  CAN0ADR = IF1CMDRQST;      
  CAN0DATL = MsgNum;     
}

⌨️ 快捷键说明

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