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

📄 can.c

📁 CAN总线资料
💻 C
字号:

#include <stdlib.h>
#include <string.h>

     #define SJA1000add  (*(volatile unsigned char *) 0x8000000)	//CAN地址端口
     #define SJA1000dat0 (*(volatile unsigned char *) 0x8000001)	//第一片CAN数据端口 
     #define SJA1000dat1 (*(volatile unsigned char *) 0x8000002)	//第二片CAN数据端口(指拥有两路的CAN卡)
     #define SJA1000rst  (*(volatile unsigned char *) 0x8000008)	//目前没有实现该端口,对该地址操作无意义
     #define SJA_REG_BaseADD 0 //0x10000000
     #define REG_MODE  (SJA_REG_BaseADD + 0x00)    //模式寄存器
     #define REG_CMR  (SJA_REG_BaseADD + 0x01)     //命令
     #define REG_SR  (SJA_REG_BaseADD + 0x02)      //状态寄存器
     #define REG_IR  (SJA_REG_BaseADD + 0x03)      //中断寄存器
     #define REG_IR_ABLE  (SJA_REG_BaseADD + 0x04)  //中断使能  //05保留
     #define REG_BTR0  (SJA_REG_BaseADD + 0x06)     //总线时序0
     #define REG_BTR1  (SJA_REG_BaseADD + 0x07)      //总线时序1
     #define REG_OCR  (SJA_REG_BaseADD + 0x08)       //输出控制
     #define REG_TEST  (SJA_REG_BaseADD + 0x09)      //检测寄存器
     #define REG_ALC  (SJA_REG_BaseADD + 0x0b) //0a保留  仲裁丢失捕捉
     #define REG_ECC  (SJA_REG_BaseADD + 0x0c)       //错误代码捕捉
     #define REG_EMLR  (SJA_REG_BaseADD + 0x0d)       //错误报警限额
     #define REG_RXERR  (SJA_REG_BaseADD + 0x0e)      //接收错误计数器
     #define REG_TXERR  (SJA_REG_BaseADD + 0x0f)      //发送错误计数器

     #define REG_ACR0  (SJA_REG_BaseADD + 0x10)     //复位模式下,验收代码0 ~ 3
     #define REG_ACR1  (SJA_REG_BaseADD + 0x11)
     #define REG_ACR2  (SJA_REG_BaseADD + 0x12)
     #define REG_ACR3  (SJA_REG_BaseADD + 0x13)
     #define REG_AMR0  (SJA_REG_BaseADD + 0x14)     //复位模式下,验收屏蔽0 ~ 3
     #define REG_AMR1  (SJA_REG_BaseADD + 0x15)
     #define REG_AMR2  (SJA_REG_BaseADD + 0x16)
     #define REG_AMR3  (SJA_REG_BaseADD + 0x17)

     #define REG_RxBuffer0  (SJA_REG_BaseADD + 0x10)    //操作模式下,接收标识0 ~ 4
     #define REG_RxBuffer1  (SJA_REG_BaseADD + 0x11)
     #define REG_RxBuffer2  (SJA_REG_BaseADD + 0x12)
     #define REG_RxBuffer3  (SJA_REG_BaseADD + 0x13)
     #define REG_RxBuffer4  (SJA_REG_BaseADD + 0x14)

     #define REG_TxBuffer0  (SJA_REG_BaseADD + 0x10)  //操作模式下,发送标识0 ~ 4
     #define REG_TxBuffer1  (SJA_REG_BaseADD + 0x11)
     #define REG_TxBuffer2  (SJA_REG_BaseADD + 0x12)
     #define REG_TxBuffer3  (SJA_REG_BaseADD + 0x13)
     #define REG_TxBuffer4  (SJA_REG_BaseADD + 0x14)

     #define REG_DataBuffer1  (SJA_REG_BaseADD + 0x15)   //操作模式下,数据缓冲1 ~ 8
     #define REG_DataBuffer2  (SJA_REG_BaseADD + 0x16)
     #define REG_DataBuffer3  (SJA_REG_BaseADD + 0x17)
     #define REG_DataBuffer4  (SJA_REG_BaseADD + 0x18)
     #define REG_DataBuffer5  (SJA_REG_BaseADD + 0x19)
     #define REG_DataBuffer6  (SJA_REG_BaseADD + 0x1a)
     #define REG_DataBuffer7  (SJA_REG_BaseADD + 0x1b)
     #define REG_DataBuffer8  (SJA_REG_BaseADD + 0x1c)


     #define REG_RBSA  (SJA_REG_BaseADD + 0x1e)   //RX缓冲区起始地址
     #define REG_CDR  (SJA_REG_BaseADD + 0x1f)    //时钟分频器
     #define REG_Receive_Counter  (SJA_REG_BaseADD + 0x1d)  //RX抱文计数器



     char delay_f;
     char SJA_Sendf;

     unsigned char Rx_Buffer[20];

//------------------------------
extern void Delay(int time);
void SJA_Init(void);
void SJA_Send(void);
void SJA_Receive(void);
void CANtest (void);
void SJA1000write(unsigned char add,unsigned char data);
void SJA1000write1(unsigned char add,unsigned char data);
unsigned char SJA1000read(unsigned char add);
unsigned char SJA1000read1(unsigned char add);

//-----------------------------------



void SJA1000write(unsigned char add,unsigned char data)
{	
	SJA1000add=add;
	Delay(1);
	SJA1000dat0=data;
}

/*void SJA1000write1(unsigned char add,unsigned char data)
{	
	SJA1000add=add;
	SJA1000dat1=data;
}
*/


unsigned char SJA1000read(unsigned char add)
{	unsigned char i;
	SJA1000add=add;
	Delay(1);
	i=SJA1000dat0;
	Delay(1);
	return i;
}

/*unsigned char SJA1000read1(unsigned char add)
{	unsigned char i;
	SJA1000add=add;
	i=SJA1000dat1;
	return i;
}
*/



/*------------------------------------------------
The main C function.  Program execution starts
here after stack initialization.
------------------------------------------------*/
void CANtest (void) 
{unsigned char i;
/*  TMOD=0x21;

  //t0  initialize
  TH0 =0xee;                               //5ms
  TL0 =0x00;
  TR0 =1;
  ET0 =1;
  delay=500;
  EX0=1;
  IT0=0;
  EA=1;                  //open interrupt*/
  
  SJA_Init();

  
  while (1) {
     
    SJA_Send();
//    Uart_Printf(\n"senndOK!"\n);
	i=SJA1000read(REG_IR);
	if(i&0x01)
  {
  SJA_Receive();
  }
    Delay(100);

  }
}

//-------------------------------------------------

     void SJA_Init(void)
     {
      //unsigned char i,j;
      SJA1000rst=1;
      Delay(1000);
      SJA1000rst=0;
      Delay(1000);
      SJA1000rst=1;
      Delay(1000);
      

	  
	  SJA1000write(REG_MODE,0x09);
      //REG_MODE=0x09;                       //00001001;单验收,复位模式
      SJA1000write(REG_CDR,0xc8);
      //REG_CDR=0xc8;                        //选择PeliCAN模式,关闭时钟输出
      SJA1000write(REG_IR_ABLE,0xff);
      //REG_IR_ABLE=0xff;                    //00001101,接收中断允许
      SJA1000write(REG_AMR0,0xff);
      //REG_AMR0 = 0xff;                     //验收屏蔽
      SJA1000write(REG_AMR1,0xff);
      //REG_AMR1 = 0xff;
      SJA1000write(REG_AMR2,0xff);
      //REG_AMR2 = 0xff;
      SJA1000write(REG_AMR3,0xff);
      //REG_AMR3 = 0xff;
      SJA1000write(REG_ACR0,0xff);
      //REG_ACR0 = 0xff;                     //验收代码
      SJA1000write(REG_ACR1,0xff);
      //REG_ACR1 = 0xff;
      SJA1000write(REG_ACR2,0xff);
      //REG_ACR2 = 0xff;
      SJA1000write(REG_ACR3,0xff);
      //REG_ACR3 = 0xff;
      SJA1000write(REG_BTR0,0x1f);
      //REG_BTR0 = 0x1f;
      SJA1000write(REG_BTR1,0xff);
      //REG_BTR1 = 0xff;                     //2.5k 4M
      SJA1000write(REG_OCR,0x1a);
      //REG_OCR  =0x1a;                      //
      SJA1000write(REG_RBSA,0);
      //REG_RBSA =0;
      SJA1000write(REG_RXERR,0);
      //REG_RXERR=0;
      SJA1000write(REG_TXERR,0);
      //REG_TXERR=0;
      SJA1000write(REG_ECC,0);
      //REG_ECC  =0;
      SJA1000write(REG_MODE,0x08);
      //REG_MODE=0x08;                       //00001001;单验收
      SJA1000write(REG_CMR,0x10);
      //REG_CMR =0x10;
     }

//--------------------------------
  void SJA_Send(void)
   {
    unsigned char i;
    do
     {
     	i=SJA1000read(REG_SR);
     	i=i&0x10;
     }
    while(i==0x10);
    
    do
     {
     i=SJA1000read(REG_SR);
     i=i&0x08;
     }
    while(i==0);
    
    do
     {
     i=SJA1000read(REG_SR);
     i=i&0x04;
     }
    while(i==0);
    
    
    SJA1000write(REG_TxBuffer0,0x88);
//    REG_TxBuffer0=0x88;
    //REG_TxBuffer1=0xff;
    SJA1000write(REG_TxBuffer1,0xff);
	SJA1000write(REG_TxBuffer2,0xff);
//    REG_TxBuffer2=0xff;
	SJA1000write(REG_TxBuffer3,0xff);
//    REG_TxBuffer3=0xff;
	SJA1000write(REG_TxBuffer4,0xf8);
//    REG_TxBuffer4=0xf8;
	SJA1000write(REG_DataBuffer1,Rx_Buffer[5]);
//    REG_DataBuffer1=Rx_Buffer[5];
	SJA1000write(REG_DataBuffer2,Rx_Buffer[6]);
	// REG_DataBuffer2=Rx_Buffer[6];
	SJA1000write(REG_DataBuffer3,Rx_Buffer[7]);
    //REG_DataBuffer3=Rx_Buffer[7];
    SJA1000write(REG_DataBuffer4,Rx_Buffer[8]);
    //REG_DataBuffer4=Rx_Buffer[8];
    SJA1000write(REG_DataBuffer5,Rx_Buffer[9]);
    //REG_DataBuffer5=Rx_Buffer[9];
    SJA1000write(REG_DataBuffer6,Rx_Buffer[10]);
    //REG_DataBuffer6=Rx_Buffer[10];
    SJA1000write(REG_DataBuffer7,Rx_Buffer[11]);
    //REG_DataBuffer7=Rx_Buffer[11];
    SJA1000write(REG_DataBuffer8,Rx_Buffer[12]);
    //REG_DataBuffer8=Rx_Buffer[12];
    SJA1000write(REG_CMR,0x01);
    //REG_CMR =0x01;
   }
//--------------------------------
void SJA_Receive(void)
 {
  unsigned char i,j;
  i=SJA1000read(REG_SR);
  //i=REG_SR;
  i&=0xc3;
  if(i==0)  goto Rend;
  else
   {
    if(i&0x80)
     {
      i=SJA1000read(REG_IR);
      SJA1000write(REG_MODE,0x08);
      //REG_MODE=0x08;
      goto Rend;
     }
    else
     {
     j=SJA1000read(REG_IR);
     if(j&0x08)
      {
      SJA1000write(REG_CMR,0x0c);
      //REG_CMR=0x0c;
      goto Rend;
      }
     else
      {
      if(j&0x01)
       {
       i=SJA1000read(REG_RxBuffer0);
       if(i&0x40)
        {
         SJA1000write(REG_CMR,0x02);
         //REG_CMR=0x02;
//
         goto Recout;
        }
       else
        {
        j=SJA1000read(REG_RxBuffer0);
        Rx_Buffer[0]=j;
        j&=0x0f;
        j+=4;
        Rx_Buffer[1]=SJA1000read(REG_RxBuffer1);//REG_RxBuffer1;
        Rx_Buffer[2]=SJA1000read(REG_RxBuffer2);//REG_RxBuffer2;
        Rx_Buffer[3]=SJA1000read(REG_RxBuffer3);//REG_RxBuffer3;
        Rx_Buffer[4]=SJA1000read(REG_RxBuffer4);//REG_RxBuffer3;
        Rx_Buffer[5]=SJA1000read(REG_DataBuffer1);//REG_DataBuffer1;
        Rx_Buffer[6]=SJA1000read(REG_DataBuffer2);//REG_DataBuffer2;
        Rx_Buffer[7]=SJA1000read(REG_DataBuffer3);//REG_DataBuffer3;
        Rx_Buffer[8]=SJA1000read(REG_DataBuffer4);//REG_DataBuffer4;
        Rx_Buffer[9]=SJA1000read(REG_DataBuffer5);//REG_DataBuffer5;
        Rx_Buffer[10]=SJA1000read(REG_DataBuffer6);//REG_DataBuffer6;
        Rx_Buffer[11]=SJA1000read(REG_DataBuffer7);//REG_DataBuffer7;
        Rx_Buffer[12]=SJA1000read(REG_DataBuffer8);//REG_DataBuffer8;
        SJA1000write(REG_CMR,0x04);
        //REG_CMR=0x04;
//        for(i=0;i<j;i++)
//         {
//          Rx_Buffer[i+1]=j;
//         }
        }
       }
      else
       {
       goto Recout;
       }
      }
     }
   }
  Recout:
  
       i=SJA1000read(REG_ALC);
       i=SJA1000read(REG_ECC);
  Rend: Delay(1);
 }

⌨️ 快捷键说明

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