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

📄 can.c

📁 采用sja1000开发can总线的源代码
💻 C
字号:
#define BASE_CAN 0x4000
#define CON_REG	 (unsigned char xdata*)(BASE_CAN)/*mode*/
#define CMD_REG	 (unsigned char xdata*)(BASE_CAN+1)
#define STS_REG	 (unsigned char xdata*)(BASE_CAN+2)
#define INT_REG	 (unsigned char xdata*)(BASE_CAN+3)
#define IE_REG   (unsigned char xdata*)(BASE_CAN+4)
#define ACC0_REG (unsigned char xdata*)(BASE_CAN+16)
#define ACC1_REG (unsigned char xdata*)(BASE_CAN+17)
#define ACC2_REG (unsigned char xdata*)(BASE_CAN+18)
#define ACC3_REG (unsigned char xdata*)(BASE_CAN+19)
#define ACM0_REG (unsigned char xdata*)(BASE_CAN+20)
#define ACM1_REG (unsigned char xdata*)(BASE_CAN+21)
#define ACM2_REG (unsigned char xdata*)(BASE_CAN+22)
#define ACM3_REG (unsigned char xdata*)(BASE_CAN+23)
#define BTR0_REG (unsigned char xdata*)(BASE_CAN+6)
#define BTR1_REG (unsigned char xdata*)(BASE_CAN+7)
#define OUT_REG  (unsigned char xdata*)(BASE_CAN+8)
#define TEST_REG (unsigned char xdata*)(BASE_CAN+9)
#define ALC_REG  (unsigned char xdata*)(BASE_CAN+11)
#define ECC_REG  (unsigned char xdata*)(BASE_CAN+12)
#define EWL_REG  (unsigned char xdata*)(BASE_CAN+13)
#define REC_REG  (unsigned char xdata*)(BASE_CAN+14)
#define TEC_REG  (unsigned char xdata*)(BASE_CAN+15)
#define RX_FRAME  (unsigned char xdata*)(BASE_CAN+16)
#define TX_FRAME  (unsigned char xdata*)(BASE_CAN+16)
#define RxMC_REG  (unsigned char xdata*)(BASE_CAN+29)
#define RBSA_REG  (unsigned char xdata*)(BASE_CAN+30)

#define CLK_REG	 (unsigned char xdata*)(BASE_CAN+31)
#define RX_REG   (unsigned char xdata*)(BASE_CAN+16)
#define TX_REG   (unsigned char xdata*)(BASE_CAN+16)


#include "REG51.h"
#include </C51/string.h>
#include </C51/intrins.h>
#include "can.h"
#include "sio.h"



MSG_BUF can_in;
MSG_BUF can_out;

unsigned char bdata sts;
sbit rdy=sts^0;
sbit ovr=sts^1;
sbit tbs=sts^2;
sbit tcs=sts^3;
sbit rs=sts^4;
sbit ts=sts^5;
sbit es=sts^6;
sbit bs=sts^7;

unsigned char bdata int_;
sbit int_ri=int_^0;
sbit int_ti=int_^1;
sbit int_ei=int_^2;
sbit int_oi=int_^3;
sbit int_wi=int_^4;

static void can_isr (void) interrupt 0 using 3
{
unsigned char  i,len;
unsigned int id;
EA=0;
//sts=*(STS_REG);
int_=*(INT_REG);
if(int_ri)
	{
		i=(*(RX_REG))&0x0f;
		len=i<8?i:8;
		id=*(RX_REG+1);
		id<<=8;
		id|=*(RX_REG+2);
		id>>=5;
		can_in.ID=id;
 		can_in.LEN=i;
	        for (i=0; i < len; i++)
    	        (can_in.BUF[i]) = *(RX_REG+i+3); // copy bytes 
		clr_rxbuf();
//                SBUF = can_in.BUF[0];
                SBUF = can_in.ID;
	}
EA=1;
}

void can_init (void)
{
   EA = 0;
   *(CON_REG)  = 0x01;
   *(CLK_REG)  = 0x88;//PeliCAN mode clock off
   *(ACC0_REG)  = 0x0;
   *(ACC1_REG)  = 0x70;
   *(ACC2_REG)  = 0x0;
   *(ACC3_REG)  = 0x70;
   *(ACM0_REG)  = 0xBF;
   *(ACM1_REG)  = 0xFF;
   *(ACM2_REG)  = 0xBF;
   *(ACM3_REG)  = 0xFF;
   *(IE_REG)    = 0x01;
   *(BTR0_REG) = 0x1;
   *(BTR1_REG) = 0x1C;
   *(OUT_REG)  = 0xAA;
   *(RBSA_REG) = 0x0;
   *(CON_REG)  = 0x00;
   IT0 = 0;
   EX0 = 1;
   PX0 = 1;
   EA  = 1;
//   while ((*(STS_REG)) & 0x80);//wait until controller is active
}

void clr_rxbuf()
{
  *(CMD_REG)=0x04;
}

//void clr_ovr()
//{
//()*(CMD_REG)=0x08;
//}

//void go_sleep()
//{
//()*(CMD_REG)=0x10;
//}

//void req_tx()
//{
//()*(CMD_REG)=0x01;
//}

//void stop_tx()
//{
//()*(CMD_REG)=0x02;
//}

//unsigned char check_busoff_state (void)
//{
// Check status register for bus-off state 
//   if ((*(STS_REG)) & 0x80)
//      return (0xFF);	            // CAN controller is in bus-off 
//   else
//      return (0);                   // CAN controller active 
//}

//a example ,can_rxbuf---->rs232c txbuf

//char can_getmsg (void)
//{

//}   



//unsigned char can_rbuflen (void)
//{
//}



void transmit_message ( MSG_BUF *pTransmitBuf )
{
unsigned long Identifier;                   // CAN message identifier 
unsigned char  Length;                       // lenght of data frame 
unsigned char  i;                            // local loop counter 

// Prepare length code and identifier.                                 
   Length     = pTransmitBuf->LEN<8 ?pTransmitBuf->LEN :8;
   Identifier = (pTransmitBuf->ID << 5);

// Wait until write access to CAN controller buffer is allowed          
   while ( !((*(STS_REG)) & 0x04) );

// Write message to transmit buffer                                     

  
   *(TX_REG) = (unsigned char)Length;
   *(TX_REG+2)= (unsigned char)Identifier;       // write identifier 
   *(TX_REG+1)= (unsigned char)(Identifier >> 8);       // write identifier 
   for (i=0; i < Length; i++)       // write data bytes 
      *(TX_REG+3+i) = *(unsigned char *)(pTransmitBuf->BUF+i); // copy data byte  

// Init a transmission request.                                         
   *(CMD_REG)  = 0x01;
}

⌨️ 快捷键说明

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