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

📄 main.c

📁 TIDSP2407的CAN总线例程
💻 C
字号:
/*
+------------------------------------------------------------------------------+
	软件名称	:PreheaterDSP1
	版 本 号	:V0.01
	项    目	:Preheater
	作    者	:桂  林
	开始日期	:2002-11-01
	最后更改日期:03-3-18 14:57
+------------------------------------------------------------------------------+
	软件功能描述:
		Preheater预热器中的DSP1(F2407),主要负责在系统上电时,初始
	化系统参数表,并启动DSP0(5402)正常工作;在正常工作时,响应LCD/
	PC/CAN_BUS/Profibus来的请求,并回发数据。
+------------------------------------------------------------------------------+
	文件清单:
		序号	文件名			功能描述				备注
		1		main.h			DSP1头文件
		2		main.c			DSP1主程序
		3		sci.c			PC通信程序
		4		spi.c			SPI通信程序
		5		timer10ms.c		timer 10ms中断程序
		6		can.c			can通信文件
		7		adc.c			adc转换程序
		8		speedin.c		速度输入程序
		9		global_var.h	全局变量头文件
		10		ex.h			全局变量头文件
		11		dataio.h		DSP0输入输出表
+------------------------------------------------------------------------------+
	编程环境及工具:
		PC		: 赛扬566
		CC2000  : 4.1
+------------------------------------------------------------------------------+
	更改记录:
				1.
+------------------------------------------------------------------------------+
*/
/*============================================================================*/
#include "main.h"
#include "global_var.h"            
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
void main(void)
{       
	U16 i=0,j=0,k=0,*p16;

	f2407_init();
	x5643_init(1);
	for(i=0;i<10;i++){LED1;delay_ms(30);LED0;delay_ms(30);RstWatchdog;};
	if(hpidownload())// dsp error
	{
		for(i=0;i<30;i++){LED1;delay_ms(50);LED0;delay_ms(50);RstWatchdog;};
	};
    EnableINT;   
    // 进入主循环
    for(;;)
    {
    	RstWatchdog;
    	// PC ---------------------------------------------
    	if(GVAR.GA.PC_ASK && GVAR.GC.PC_ENABLE)
    	{
    		DisableINT_SCI;

    		EnableINT_SCI;
    	};
    	// CAN --------------------------------------------
    	if(GVAR.GA.CAN_ASK && GVAR.GC.CAN_ENABLE)
    	{
    		DisableINT_CAN;

    		EnableINT_CAN;
    	};
    	// LCD --------------------------------------------
    	if(GVAR.GA.LCD_ASK && GVAR.GC.LCD_ENABLE)
    	{
    		DisableINT_XINT1;
    		GVAR.GA.LCD_ASK = 0;
			switch(GVAR.GAB.LCD[1])
			{
				case READ_IN_CMD:
					{
						p16 = (U16 *)&GVAR.dsp0in;
						for(i=0;i<GVAR.GAB.LCD[3];i++)
						{
							GVAR.GAB.LCD[4+i] = (*p16>>8);	//高8位
							GVAR.GAB.LCD[5+i] = *p16;		//低8位
							p16++;
						};
						GVAR.GAB.LCD[0] = 2*GVAR.GAB.LCD[3] + 3;
						p16 = (U16 *)GVAR.GAB.LCD[1];
						st16_lcd_tx(GVAR.GAB.LCD[0],p16);
						break;
					}
				case READ_OUT_CMD:
					{
						p16 = (U16 *)&GVAR.dsp0out;
						for(i=0;i<GVAR.GAB.LCD[3];i++)
						{
							GVAR.GAB.LCD[4+i] = (*p16>>8);	//高8位
							GVAR.GAB.LCD[5+i] = *p16;		//低8位
							p16++;
						};
						GVAR.GAB.LCD[0] = 2*GVAR.GAB.LCD[3] + 3;
						p16 = (U16 *)GVAR.GAB.LCD[1];
						st16_lcd_tx(GVAR.GAB.LCD[0],p16);
						break;
					}
				case WRITE_IN_CMD:
					{
						p16 = (U16 *)&GVAR.dsp0in;
						for(i=0;i<GVAR.GAB.LCD[3];i++)
						{
							*p16  = GVAR.GAB.LCD[4+i]<<8;	//高8位
							*p16 |= GVAR.GAB.LCD[5+i];		//低8位
							p16++;
						};
						break;
					}
				case XREAD_CMD:
					{
						break;
					}
				case XWRITE_CMD:
					{
						break;
					}
				default:break;
			};// end switch
    		EnableINT_XINT1;
    	};
    	// PROFIBUS ---------------------------------------
    	if(GVAR.GA.PROFIBUS_ASK && GVAR.GC.PROFIBUS_ENABLE)
    	{
    		DisableINT_XINT2;

    		EnableINT_XINT2;
    	};
    };//end for
    //结束主循环
	
}

/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
/*
+------------------------------------------------------------------------------+
	函 数 名  	: f2407_init()
	功能描述	: f2407的初始化
	函数原形	: void f2407_init()
	参数说明	: 
	支持资源	: 
	作    者	: 桂林
	最后更改日期: 2002-11-01
+------------------------------------------------------------------------------+
*/
void f2407_init()//f2407的初始化
{
	//关F2407自带的watchdog
	WDCR  	= 0x006f;
	//IO空间访问等待
	WSGR	= 0x0600|(1<<6);
	DisableINT;
	//配置晶振
	SCSR1	= 0x00fd;//40Mhz
	
	//SCSR2	= 0x000b;//MC,Flash
	SCSR2	= 0x0007;//MP,XRAM
	delay_ms(10);//10ms
	//配置IO口线
	MCRA	= 0x0007;//IOPB7..0 + IOPA7..3 + XINT1 + SCIRXD + SCITXD
	MCRB	= 0xfffc;//XINT2 + CANRX + CANTX + SPI + IOPC1..0
	MCRC	= 0x2081;//IOPF6 + TCLKINB + IOPF4..0 + CAP4 + IOPE6..1 + CLKOUT
	PEDATDIR = 0x7e00;//IOPE6..1=输出0,测试用
	SET_BIT(PADATDIR , 11);//IOPA3->output(ST16C2552_MR)
	SET_BIT(PBDATDIR , 10);//IOPB2->output(x5643_CS)
	SET_BIT(PBDATDIR , 11);//IOPB3->output(5402_RESET)
	//配置中断
	IMR		= 0x000b;//enable int1,int2,int4
	IFR		= 0xffff;

	timer10ms_init();
	spi_init(0);
	x5643_init(0);//watchdog_num=0/1(关开)
	sci_init(384);//speed=(12,24,48,96,192,384,1152;8-N-1)
	st16_init();//都配置为375k,8-N-1
	hpi_init();
	speedin_init();
	adc_init();
	can_init(Preheater,125);
	//can 2.0a标准,can_speed=(500,250,125)
	//EnableINT;
}
/*
+------------------------------------------------------------------------------+
	函 数 名  	: delay_ms
	功能描述	: 延时函数
	函数原形	: void delay_ms(U16 x)
	参数说明	: x:延时值ms
	支持资源	:
	作    者	: 桂林
	最后更改日期: 2002-11-01
+------------------------------------------------------------------------------+
*/
void delay_ms(U16 x)
{
	U16 tempi,tempj;
	for(tempi=0;tempi<x;tempi++)
		for(tempj=0;tempj<4000;tempj++);
}
/*
+------------------------------------------------------------------------------+
	函 数 名  	: delay_15us
	功能描述	: 延时函数
	函数原形	: void delay_15us(U16 x)
	参数说明	: x:延时值ms
	支持资源	:
	作    者	: 桂林
	最后更改日期: 2002-11-01
+------------------------------------------------------------------------------+
*/
void delay_15us(U16 x)
{
	U16 tempi,tempj;
	for(tempi=0;tempi<x;tempi++)
		for(tempj=0;tempj<59;tempj++);
}
//=============================================================================

/*
+------------------------------------------------------------------------------+
	函 数 名  	: test
	功能描述	: 测试函数
	函数原形	: U16 test()
	参数说明	: 
	支持资源	:
	作    者	: 桂林
	最后更改日期: 2003-03-17
+------------------------------------------------------------------------------+
*/
U16 test()//出错号
{
    U16 tempi=0,tempj=0,temperror=0,*p16;
    
	for(;;)
	{
		RstWatchdog;
		EnableINT;
		LED1;delay_ms(450);
		LED0;delay_ms(450);
	 
	    if(hpitest()) SET_BIT(temperror,0);//dsp error
	    
		for(tempi=0;tempi<100;tempi++)
		{
			x5643_write8(tempi,tempi);
			tempj=0;
			tempj=x5643_read8(tempi);
			if(tempj!=tempi) SET_BIT(temperror,1);//x5643 error
	    };
		
		GVAR.cantxbuf.ID=PINTCANID;
		GVAR.cantxbuf.LEN=8;
		GVAR.cantxbuf.BUF[0]=(0<<8 | 1);
		GVAR.cantxbuf.BUF[1]=(2<<8 | 3);
		GVAR.cantxbuf.BUF[2]=(4<<8 | 5);
		GVAR.cantxbuf.BUF[3]=(6<<8 | 7);
		can_tx(&GVAR.cantxbuf);
		
		*p16=0x55;
		st16_lcd_tx(1,p16);
		st16_pro_tx(1,p16);
	};	
	
	return(temperror);
}

⌨️ 快捷键说明

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