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

📄 main.c

📁 CAN总线调试通过的程序
💻 C
字号:
#define  _GLOBAL_SJA1000_PELI_
#include "PELI.H"
#include "reg52.h"
#include "REG.h"
#include "IO.h"

sbit RST_SJA1000 = P1^6; //SJA1000硬件复位

//#ifdef _GLOBAL_SJA1000_PELI_
//extern unsigned char xdata CAN_SJA_BaseAdr; //定义SJA1000的片选基址
//extern unsigned char xdata *SJA_CS_Point;
//#else
//unsigned char xdata CAN_SJA_BaseAdr _at_ 0x7F00; //定义SJA1000的片选基址
//unsigned char xdata *SJA_CS_Point; //指针指向空
//#endif

unsigned char CAN_Baudrate_Filter_Buffer[9]={3,0,0,0,0,0xff,0xff,0xff,0xff};//3为发送的波特率(40kbs)    存放设置波特率和滤波器的数据
//    从机地址为0x02   其中的8为CANPC规定的
unsigned char Send_CAN_Info_ID[1]={0x82};    
//    0x31~~~0x38是要发送的数据  CANPC规定发送必须为ASCII 格式  与CANPC通讯用   0x01为CANPC地址
unsigned char Send_CAN_Data[8]={0x01,0x31,0x33,0x34,0x35,0x36,0x37,0x38};//存放数据帧的数据

unsigned char ss[1]={0x08} ;

/****************************************************
                    单片机初始化
****************************************************/
void  InitCPU(void)
{
  EA         =1;
  IT0        =1;
  EX0        =1;
  PX0        =1;
}

/*---------------------------------------------------------------------------------------------------
** 函数原型:	void	Delay_ms(unsigned char j)
** 功能描述:	该函数用于不精确的延时。在12M,6CLK下,大约延时j*1ms
** 参数说明:	0-255
** 返回值:    无
/*------------------------------------------------------------------------------------------------*/
void	Delay_ms(unsigned char j)
{
  	unsigned char m,n;
  	for(n=0;n<=j;n++)
	{
		for(m=0;m<=250;m++)
	 	{
	   	   ;
	 	}
	}
}

/**************************************************

函数功能:初始化 SJA1000

**************************************************/
SJA1000_Config_Normal()
{
	unsigned char BTR0;
	unsigned char BTR1;
        unsigned char tuichu;
        unsigned char mode;
        unsigned char n;
	BTR0=0x00;
	BTR1=0x14;                                       //设置为1M波特率通信
  SJA_CS_Point=&CAN_SJA_BaseAdr;
 // WriteSJAReg(REG_CAN_MOD,0x00);

  SJAEntryResetMode_BCan();                        //进入复位模式
  mode = SJAEntryResetMode_BCan();
  while(mode != 0);            //SJAEntryResetMode()=0则成功进入复位模式
  n =  ReadSJAReg(REG_CR);
// WriteSJAReg(REG_CAN_MOD,0x01);              //配置模式寄存器,选择双滤波、自发自收模式
 // WriteSJAReg(REG_CAN_CR,0x06);
  WriteSJAReg(REG_CDR,0x48); 	      //配置时钟分频寄存器,选择PeliCAN模式
  n =  ReadSJAReg(REG_CDR);

//  mode = ReadSJAReg(REG_CAN_MOD);
//  WriteSJARegBlock(16,&CAN_Baudrate_Filter_Buffer[1],8); //配置验收代码/屏蔽寄存器
  WriteSJAReg(REG_ACR,0x00);
  WriteSJAReg(REG_AMR,0xff);
//  WriteSJAReg(REG_CAN_BTR0,BTR0);		         //配置总线定时器0x00

//  WriteSJAReg(REG_CAN_BTR1,BTR1);		         //配置总线定时器0x14
//  n = ReadSJAReg(REG_CAN_BTR1);
  SJASetBandRateStandard(CAN_Baudrate_Filter_Buffer[0]);
  WriteSJAReg(REG_OCR,0x1a);			 //配置输出管脚,推挽输出
//  P1=0;
  SJAQuitResetMode_BCan();
  tuichu=SJAQuitResetMode_BCan();         //退出复位模式,进入工作模式
  while(tuichu!=0);      //SJAQuitResetMode()=0退出复位模式,进入工作模式
//   WriteSJAReg(REG_CAN_MOD,0x00);
   mode = ReadSJAReg(REG_CR);

}

main()
{
    unsigned char i;
    unsigned char temp_data ;
    unsigned char canstatus;
    unsigned char fuwei;
    unsigned char Receive_CAN[11];
    unsigned char Receive_CAN_ID[5];
    unsigned char Receive_CAN_Data[8];
//    P2=0;
    InitCPU();
//    for(i=0;i<128;i++)
//             {
//               WriteSJARegBlock((0+i),huanchong,1);
//             }

        Delay_ms(100);
        P1=0;
        Delay_ms(100);
        P1=1;
        Delay_ms(100);


	SJA_CS_Point=&CAN_SJA_BaseAdr;
//      SJATestInterface(0xaa);
//	Sja1000HardwareRst();                         //SJA1000硬件复位

        if(SJATestInterface(0xaa)==0)
         {
	   SJA1000_Config_Normal();        // SJA1000 进入正常模式配置
         }
//        fuwei = ReadSJAReg(REG_CAN_MOD);
	WriteSJAReg(REG_CR,0x0E);		      //使能SJA1000发送中断位
//	WriteSJARegBlock(16,Send_CAN_Info_ID,5);      //扩展帧,向发送缓冲区写入5个数据
//	WriteSJARegBlock(21,Send_CAN_Data,8);         //扩展帧,向发送缓冲区写入8个数据
	while(1)
	 {
   //      	canstatus = ReadSJAReg(REG_CAN_IER);

   //         if( (canstatus& 0x01)==0x01)
   //          {
   //             ReadSJARegBlock(16,Receive_CAN,13);
   //          }
 //             i=ReadSJAReg(REG_CAN_IR);
 //             while(ReadSJAReg(REG_CAN_IR)!=0x03)
 //             {
 //                 i=ReadSJAReg(REG_CAN_IR);
 //             }
/*******************************************************************************************************
                                      发送数据
*******************************************************************************************************/
              temp_data =ReadSJAReg(REG_SR);

             while((temp_data & 0x04) != 0x04)  //有接收数据 SR.0=1 =>RXFIFO存在完整有效报文
               {
                 temp_data =ReadSJAReg(REG_SR);
 //                 ReadSJARegBlock(20,Receive_CAN,11); //读出接收寄存器中的数据
               }

              WriteSJARegBlock(10,Send_CAN_Info_ID,1);
              WriteSJARegBlock(11,ss,1);
              WriteSJARegBlock(12,Send_CAN_Data,8);
              WriteSJAReg(REG_CMR,0x01);
/*************************************************************************************************

                       接收数据
*************************************************************************************************/        
               temp_data =ReadSJAReg(REG_SR);
               if((temp_data & 0x01) == 0x01)  //有接收数据 SR.0=1 =>RXFIFO存在完整有效报文
               {
     //            temp_data =ReadSJAReg(REG_SR);
                ReadSJARegBlock(20,Receive_CAN,11); //读出接收寄存器中的数据
              }
              
       //      ReadSJARegBlock(20,Receive_CAN,11);
     
 /*
            if((canstatus& 0x44) == 0x44)        //Error
              {
                  WriteSJAReg(REG_CAN_CMR,0x04);   //释放接收缓存
                  SJAEntryResetMode();
                  WriteSJAReg(REG_CAN_RXERR,0x00);
                  WriteSJAReg(REG_CAN_TXERR,0x00);
                  SJAQuitResetMode();
                  return;
              }

	   if((canstatus&0x0c) == 0x0c)                //判断是否可以发送
	   {
             i =  ReadSJAReg(REG_CAN_IR);


             WriteSJARegBlock(16,Send_CAN_Info_ID,5);  //扩展帧,向发送缓冲区写入5个数据

             WriteSJARegBlock(21,Send_CAN_Data,8);     //扩展帧,向发送缓冲区写入8个数据



//           WriteSJAReg(REG_CAN_CMR,0x04);            //释放接受缓冲器

             WriteSJAReg(REG_CAN_CMR,0x12);            //使能发送请求,发送数据
 //          WriteSJAReg(REG_CAN_CMR,0x01);
 //            WriteSJAReg(REG_CAN_CMR,0x02);

              i =  ReadSJAReg(REG_CAN_IR);
              temp_data =ReadSJAReg(REG_CAN_SR);
               if((temp_data & 0x01) == 0x01) //有接收数据 SR.0=1 =>RXFIFO存在完整有效报文
                {
                   ReadSJARegBlock(16,Receive_CAN,13);       //读出接收寄存器中的数据
                }

//             WriteSJAReg(REG_CAN_CMR,0x03);

 //               i =  ReadSJAReg(REG_CAN_IR);
//                if((ReadSJAReg(REG_CAN_IR)==0x01))    //查询接收/发送中断位
//                 {

//                     ReadSJARegBlock(16,Receive_CAN,13);       //读出接收寄存器中的数据
//                 }
                 else
                 {
                    WriteSJAReg(REG_CAN_CMR,0x04);   //释放接收缓冲区
                 }
           }
    */
   //        else
    //       {
    //         Delay_ms(200);
    //       }
    }
}

⌨️ 快捷键说明

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