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

📄 main.c

📁 CAN总线控制器SJA1000的设置和初始化代码
💻 C
字号:
/**********************************************Copyright (c)**********************************************
**                           		   广州周立功单片机发展有限公司						                **
**                                            研    究    所							                **
**                                              CAN-BUS 组 									            **
**																				                        **
**                             		       http://www.zlgmcu.com       						            **
**                																                        **
**-----------------------------------------------文件信息-----------------------------------------------**
**文   件   名: CAN-DP51PRO(V1.10)									       								**
**创   建   人: St_again															   					**
**最后修改日期: 2004-2-2																				**
**文件功能描述: 提供一个基于DP-51PRO的CAN实验程序								   						**
**其        他:	本文件源码编写格式符合周立功单片机程序编写规范。			   	  						**
**																				   						**
**---------------------------------------------历史版本信息---------------------------------------------**
** 创建人: 																		   						**
** 版  本: 																		   						**
** 日 期: 																		  						**
** 描 述: 																		   						**
**																				   						**
**---------------------------------------------当前版本修订---------------------------------------------**
** 修改人: 																		   						**
** 日 期:																		   						**
** 描 述:																		   						**
**																				   						**
**------------------------------------------------------------------------------------------------------*/

#include <REG52.H>
#include "VIIC_C51.h"													//I2C程序库头文件
#include "Sja1000_peli.h"												//CAN程序库头文件

#define uchar unsigned char 
#define ZLG7290 0x70 
sbit RESET_PIN=P1^0;

uchar Display_Buffer[5]={0x0d,0x15,0x15,0x10};							//显示GOOD
uchar CAN_Baudrate_Filter_Buffer[9]={14,0,0,0,0,0xff,0xff,0xff,0xff};	//存放设置波特率和滤波器的数据
uchar Send_CAN_Info_ID[5]={0x88,0x00,0x00,0x00,0x00};					//存放信息帧的数据,符合CAN2.0B
uchar Send_Data_For_Self[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};	//存放数据帧的数据
uchar ScanNum[1];														//定义数码管扫描位数

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

/*--------------------------------------------------------------------------------------------------------
** 函数原型:	unsigned char ZLG7290_SendCmd(unsigned char Data1,unsigned char Data2)
** 功能描述:	发送命令(对子地址7、8)
** 参数说明:	DATA1:		命令1
**       		DATA2:		命令2                                             
** 返回值:    	0 			失败
**        		1			成功
/*------------------------------------------------------------------------------------------------------*/
unsigned char ZLG7290_SendCmd(unsigned char Data1,unsigned char Data2)
{
	unsigned char Data[2];
	Data[0]=Data1;
	Data[1]=Data2;
	ISendStr(ZLG7290,0x07,Data,2);
	Delay_ms(10);
	return 1;
}  

/*--------------------------------------------------------------------------------------------------------
** 函数原型:	void	ZLG7290_SendDisBuf(unsigned char *disp_buf,unsigned char num)
** 功能描述:	向显示缓冲区发送数据
** 参数说明:	*disp_buf      	要发送数据的起始地址
**				num  			发送个数                                                      
** 返回值:    	无
/*------------------------------------------------------------------------------------------------------*/
void ZLG7290_SendDisBuf(unsigned char *disp_buf,unsigned char num)
{
	unsigned char i;
	for(i=0;i<num;i++)
	{	
		ZLG7290_SendCmd(0x60+i,*disp_buf);
		disp_buf++;
	}
}

/*--------------------------------------------------------------------------------------------------------
** 函数原型:	void 	SJA1000_Config_Self(void)
** 功能描述:	对SJA1000的在自发自收模式下的初始化配置
** 参数说明:	无                                                         
** 返回值:    	无
/*------------------------------------------------------------------------------------------------------*/
void SJA1000_Config_Self(void)
{ 
	SJAEntryResetMode();												//进入复位模式
  	WriteSJAReg(REG_CAN_CDR,0xc8);										//选择PeliCAN模式
  	SetBitMask(REG_CAN_MOD,AFM_BIT);									//选择单滤波模式
	SetBitMask(REG_CAN_MOD,STM_BIT);									//选择自检测模式
  	WriteSJARegBlock(16,&CAN_Baudrate_Filter_Buffer[1],8);				//设置验收代码/屏蔽寄存器
  	WriteSJAReg(REG_CAN_OCR,0x1a);										//设置输出管脚
  	SJASetBaudrateStandard(CAN_Baudrate_Filter_Buffer[0]);				//设置总线定时器,确定波特率
  	SJAQuitResetMode();													//退出复位模式
}

/*--------------------------------------------------------------------------------------------------------
** 函数原型:	unsigned char 	Send_Sja1000_Self(void)
** 功能描述:	把键盘数据传送到SJA1000的接收缓冲区,并进行自发自收的测试
** 参数说明:	无                                                         
** 返回值:    	0 			失败
**        		1			成功
/*------------------------------------------------------------------------------------------------------*/
unsigned char Send_Sja1000_Self(void)
{ 
	uchar i;
	SJA1000_Config_Self();
	WriteSJAReg(REG_CAN_IER,0x03);               						//使能接收发送中断标志位
	Delay_ms(100);
	for(i=0;i<2;i++)   											     
	{	    
		if((ReadSJAReg(REG_CAN_SR)&0x0c)==0x0c)							//判断是否可以发送	     
		{	     
    		WriteSJARegBlock(16,Send_CAN_Info_ID,5);					//扩展帧,向发送缓冲区写入5个数据
			WriteSJARegBlock(21,Send_Data_For_Self,8);					//扩展帧,向发送缓冲区写入8个数据
			SetBitMask(REG_CAN_CMR,SRR_BIT);							//使能自发送请求标志位
			return(1);													//返回发送成功标志
		}				     
		else			                            
        {								      
			Delay_ms(200);												//延时200ms	   
	   	}
	return(0);															//返回发送失败标志
	}
}

/*--------------------------------------------------------------------------------------------------------
** 函数原型:	void	main(void)
** 功能描述:	主函数
** 参数说明:	无                                          
** 返回值:    	无
/*------------------------------------------------------------------------------------------------------*/
void main()
{
	RESET_PIN=0;														//将SJA1000的复位线与P1.0相连接
	Delay_ms(1);
	RESET_PIN=1;														//控制P1.0来实现SJA1000的复位
	SJA_CS_Point=&CAN_SJA_BaseAdr;										//确定SJA1000的基址
	ScanNum[0]=0;														//不显示
	Display_Buffer[0]=0x1f;	
	ZLG7290_SendDisBuf(Display_Buffer,0);
	ISendStr(ZLG7290,0x0d,ScanNum,1);
	Delay_ms(100);
	if(Send_Sja1000_Self())
	{	
		Delay_ms(200);
		if((ReadSJAReg(REG_CAN_IR)==0x03))	
		{
			WriteSJAReg(REG_CAN_CMR,4);									//释放接收缓冲区
			ScanNum[0]=3;												//扫描4位
			Display_Buffer[0]=0x0d;										//显示Good
			Display_Buffer[1]=0x15;
			Display_Buffer[2]=0x15;
			Display_Buffer[3]=0x10;
			ISendStr(ZLG7290,0x0d,ScanNum,1);
			ZLG7290_SendDisBuf(Display_Buffer,4);
		}
		else
		{
			ScanNum[0]=4;												//扫描5位
			Display_Buffer[0]=0x18;										//显示Error
			Display_Buffer[1]=0x15;
			Display_Buffer[2]=0x18;
			Display_Buffer[3]=0x18;
			Display_Buffer[4]=0x0e;
			ISendStr(ZLG7290,0x0d,ScanNum,1);
			ZLG7290_SendDisBuf(Display_Buffer,5);
		}
	}	
	else
	{
		ScanNum[0]=4;													//扫描5位
		Display_Buffer[0]=0x18;											//显示Error
		Display_Buffer[1]=0x15;
		Display_Buffer[2]=0x18;
		Display_Buffer[3]=0x18;
		Display_Buffer[4]=0x0e;
		ISendStr(ZLG7290,0x0d,ScanNum,1);
		ZLG7290_SendDisBuf(Display_Buffer,5);	
	}
	while(1)
	{	
		;			
	}
}

⌨️ 快捷键说明

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