📄 main.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 + -