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

📄 dspusbtem.c

📁 基于dsp2407a的探测系统程序(兼容usb和串口通讯)
💻 C
字号:
#include	"lf2407regs.h"
#include 	<stdio.h>
#include	<ioports.h>
#include	"initialint.h"   
#include	"define.h"
//#include	"math.h"
#include	"sci.h"  
#include	"cap.h"
//#include	"D12HAL.h" 
#include	"d12_hard.h" 
#include	"usb_type.h"  
#include	"isr.h"  
#include	"USB_Protocol.h" 

//#define DISABLE() asm(" setc INTM")
//#define ENABLE()	asm(" clrc INTM")
const uchar UsbPort2NoData[64]={'N','N','N'};
static int scitime=0,scicurnum=0; 
static int int1time=0;
int reTxper,reT3cmp,reT4cmp; 
int reForepart,reCapdot,reAddition,reCurCapDot,reCurAddNum;
char reSamprate;
int  OffTimeBuf=0;
uint Idle=0;
uint SystemIdle=0;
int  SetSymbol=0;
int TimeDispIdle=0;
int CurDispIdle=0;
int TimeCapLimit=0;
int UsbOrSci=0;
/*****usb 数据接收寄存器变量******/
int UsbReDataNum=0;
uchar UsbPort1InBuf[16];
uchar UsbPort2InReady=0;



/*uint copy_arry[1000];*/ 

volatile uint temp=0;
/*void scisend(uchar data);  */
void inline initialkey();  
void interrupt usb_sever(); 
void usbserve();
void TemSystemseSever(void);
void OffTimeSever(void);
void CurSever(void);
/*void inline initialsci();*/ 
/*uint keyvalue(uint keycode);
uint keyscan(void); 
*/
/*  屏蔽中断程序  */ 
void inline disable() 
{
	asm(" setc INTM");
/*    asm(" setc SXM");     *//*符号位扩展*/
	
}
void inline enable()
{
asm(" clrc INTM");

}  

/* 系统初始化子程序  */ 
void inline initial()
{   
	volatile uint i=0;
	asm(" setc	SXM");				/* 符号位扩展有效 */ 
	asm(" clrc	OVM");				/* 累加器中结果正常溢出   */ 
	asm(" clrc	CNF");				/* B0被配置为数据存储空间    */ 
	*SCSR1=0x024d;          	 /* 
								0x024d for 40M
								0x064d for 20M 	
								0x0e4d  for 10M; 
								CLKIN=20M,
								CLKOUT=CLKIN/2=10M   */ 
	*WDCR=0x0E8;				/* 不使能看门狗,因为SCSR2中的WDOVERRIDE */ 
		     					/* 即WD保护位复位后的缺省值为1,故可以用 */ 
		     					/* 软件禁止看门狗  */  
	*IMR=0x31;					/* 禁止所有中断  */ 
	*IFR=0x0FFFF;				/* 清除全部中断标志,"写1清0"    */ 
	WSGR=0x0e92;				/*0x0924 for 4 wite time
								/*0x0492 for 2 wite time;		
								/* 禁止所有的等待状态 */ 
/*	*SCICTL1=0X11;             /*使能接受中断,sleep=0,禁止接受错误中断,不使用sci唤醒*/
/*	*SCICTL2=0X02;             /*使能接收中断*/ 
	*XINT1CR=0X8003;		   /*使能外部中断1,下降沿触发,低优先级(int6)*/
    *XINT2CR=0X8001;		   /*使能外部中断2,下降沿触发,高优先级(int1)*/

}
/* EVB模块的PWM初始化程序           */ 
void  pwminitial()
{
	*MCRC=*MCRC|0X0C00;			/*IOPF3,2配置位基本功能*/ 
	*PEDATDIR=*PEDATDIR|0X7e00; /*配置PE口方向 1<->6配置为输出*/
	*PEDATDIR=*PEDATDIR&0XFF81; /*配置PE口上拉 1<->6配置为下拉*/
	*PEDATDIR=*PEDATDIR|0X0078;
	*PFDATDIR=*PFDATDIR|0X0001;
	/* 对T3PWM/T4PWM编程操作,输出对称波形,供发射机使用的驱动波形*/
    *GPTCONB=*GPTCONB|0X0049;    /*T3强制为高,T4强制为低*/
	/*T4控制寄存器:不受仿真影响,连续增/减计数,128分频,使能定时比较器*/
    *T3CON=*T3CON|0X8F02;   /*T3初始化定时器控制寄存器:*/
    *T4CON=*T4CON|0X8F83;   /*T4初始化定时器控制寄存器,忽略本身定时器和周期比较器*/
    *T3CNT=0X0000;         /*赋予初始值 */
    *T4CNT=0X0000;
    *T3PER=0X030E;      /*时钟是20M,128分频,连续增/减计数模式,周期数为*/
    *T4PER=0X030E;
    *T3CMP=0X00C3;
    *T4CMP=0X024A;
	*COMCONB=0X8200;			/* 使能比较操作  */ 
}

/* 主程序  */ 
main( )
{   
    uint k=0,temp;
    uchar ch;
	disable();						/* 总中断禁止  */ 
	initial();  					/* 系统初始化  */ 
	initialsci();
	pwminitial();					/* PWM输出初始化*/  
	/*initial the golab register*/
	led.value		=	LedReset; 
	WriteLed;
	start.value		=	StartReset;
	WriteStart;
	protect.value	=	ProtectReset;
	WriteProtect; 
	/*initial the golab register*/
	clrsuspend;
	clrd12reset;
	delay();
	delay();
	delay(); 
	setd12reset;  
	enable();  
	setshoot(Mode1,Fre25fre,Fre25t3cmp,Fre25t4cmp); 
	IrPowerOff; 
	StopShoot;
	*T3CON=*T3CON|0x0040;		/* 启动定时器3 */ 
	state.states.offtimeend=0;
	settimecap();
	TimeCapLimit=0;
	ControlData.wLengthh=0;
	ControlData.wCounth=0;
	UsbPort1InBuf[0]='I';
	UsbPort1InBuf[15]='E';
	for(k=1;k<15;k++)
	{
	UsbPort1InBuf[k]=0;
	}
	reconnect_USB();
	while(1)
{ 
        TemSystemseSever();
		Idle++; 
        OffTimeSever();
		CurSever();
		if(Idle==0x8000)
		{ 
			CurDispIdle++;
		}
		if(Idle==0xffff)
		{
			TimeDispIdle++;
			SystemIdle++;
		}
        if(SystemIdle>=3)
        {
        SystemIdle=0; 
        if(UsbOrSci==1)
        {
        UsbPort1InBuf[1]=OffTimeBuf>>8;
        UsbPort1InBuf[2]=OffTimeBuf&0x00ff;
        for(k=0;k<7;k++)
        {
        UsbPort1InBuf[k*2+3]=dispcurbuf[k+2]>>8;
        UsbPort1InBuf[k*2+4]=dispcurbuf[k+2]&0x00ff;
        }  //for(k=0;k<7;k++)
        } //        if(UsbOrSci==1)
        } //        if(SystemIdle>=3)
		     
		if(((*PFDATDIR)&0x0001)!=0x0001)
			usb_sever(); 
			usbserve();
   }     
   }

/*键盘接口初始化程序*/ 
void inline initialkey()
{
	*MCRA=*MCRA&0X00FF;
    return;
}


void interrupt int1_sever()
{
    int1time++;
    *XINT1CR=*XINT1CR|0X8000;
	*IFR=0X0020;
	enable();
	return;
}  

void TemSystemseSever(void)
{
if(re_change==ref_chan)
  {
  
  temp=recdata[10];
  switch(temp)
  {
  case op_setall:
				  re_change=ref_ncha; 
				  ShootMode=recdata[0];
				  reTxper=recdata[1];
				  reTxper=(reTxper<<8)+recdata[2]; 
				  reT3cmp=recdata[3];
				  reT3cmp=(reT3cmp<<8)+recdata[4];
				  reT4cmp=recdata[5];
				  reT4cmp=(reT4cmp<<8)+recdata[6];
				  setshoot(recdata[0],reTxper,reT3cmp,reT4cmp); 
				  D12_WriteEndpoint(3,16,UsbPort1InBuf);//test d12 in interupt
				  D12_WriteEndpoint(5, 64,UsbPort2NoData);
				  setmatch(recdata[7]);
				  SetSymbol=1;
				  break;
  case op_poweron:re_change=ref_ncha;
  				  IrPowerOn;
       			  break;
  case op_poweroff:re_change=ref_ncha;
  				  IrPowerOff;
       			  break;
  case op_shoot:  re_change=ref_ncha; 
  				  StartShoot;
       			  break;
  case op_hold:	  re_change=ref_ncha;
  				  StopShoot;
  	   			  break;
  case op_reset:  re_change=ref_ncha;
				  break;				  
  case op_sysstate:
				  re_change=ref_ncha;
				  break;
  case op_capset:
  				  
				  re_change=ref_ncha; 
  				  reForepart=recdata[0];
				  reForepart=(reForepart<<8)+recdata[1]; 
				  reCapdot=recdata[2];
				  reCapdot=(reCapdot<<8)+recdata[3];
				  reAddition=recdata[4];
				  reAddition=(reAddition<<8)+recdata[5];
				  reSamprate=recdata[6];
  				  state.states.temcapend=0; 
  				  settemcap(reSamprate,reCapdot,reForepart);
				  readstate(); 
				  while(!state.states.temcapend)
					{
					readstate();  
					}
					ReadTemCapData(reCapdot,TemData);
					if(UsbOrSci==0)
					SendTemData(reCapdot,TemData);
					if(UsbOrSci==1) 
					{ 
					TxDataNum(reCapdot);
					UsbTemOrCur=UsbTem;
					UsbPort2InReady=1;
					} 
					WinkTemcLed;
					state.states.temcapend=0;
				  break;
  case op_capstart:
  				  re_change=ref_ncha;
  				  state.states.temcapend=0; 
  				  settemcap(reSamprate,reCapdot,reForepart);
				  readstate(); 
				  while(!state.states.temcapend)
					{
					readstate();  
					}
					ReadTemCapData(reCapdot,TemData);
					if(UsbOrSci==0)
					SendTemData(reCapdot,TemData);
					if(UsbOrSci==1)
					{
					TxDataNum(reCapdot);
					UsbTemOrCur=UsbTem;
					UsbPort2InReady=1;
					} 
					WinkTemcLed;
					state.states.temcapend=0;
                    break; 
  case op_curcap:
  					re_change=ref_ncha;   
  					reCurCapDot=recdata[0];
				  	reCurCapDot=(reCurCapDot<<8)+recdata[1]; 
				  	reCurAddNum=recdata[2];
				  	reCurAddNum=(reCurAddNum<<8)+recdata[3];
				  	state.states.curcapend=0;
  					setcurcap(reCurCapDot,CapCurMode); //CapEdgeMode  CapCurMode
  					readstate(); 
				  	while(!state.states.curcapend)
					{
					readstate();  
					}
  					readcurcapdata(reCurCapDot,curbuf);
  					if(UsbOrSci==0)
  					SendCurData(reCurCapDot,curbuf);
  					if(UsbOrSci==1)
  					{
  					TxDataNum(reCurCapDot);
  					UsbTemOrCur=UsbCur;
  					UsbPort2InReady=1; 
  					}
  					state.states.curcapend=0;
  					WinkCurcLed;
  					break;                  
  default:		  
  			   re_change=ref_ncha;	  
               ;             
		  
  }

   }  
}
void OffTimeSever(void)
{

		if(state.states.offtimeend==1)
		{
			OffTimeBuf=readcaptime();
			state.states.offtimeend=0;
			TimeCapLimit=0;
		 
		}
//		if(TimeDispIdle>5&&SetSymbol!=0)                              
        if(TimeDispIdle>2)
		{ 
			TimeDispIdle=0;
			TimeCapLimit++;
			settimecap();
			if(UsbOrSci==0)
			SendTimeDispData(2,OffTimeBuf); 
		}
		if(TimeCapLimit>2)
		{
			OffTimeBuf=0; 
			if(UsbOrSci==0)
			SendTimeDispData(2,OffTimeBuf);
			TimeCapLimit=0;
		}
		 
} 

void CurSever(void)
{
if(CurDispIdle>5&&SetSymbol!=0)
		{
			CurDispIdle=0;
			setcurdisp(30,CapCurMode); //CapEdgeMode  CapCurMode
			readstate(); 
			while(!state.states.curcapend)
			{
			readstate();  
			}
			readcurcapdata(30,dispcurbuf);
			if(UsbOrSci==0)
			SendCurDispData(30,dispcurbuf);
			state.states.curcapend=0;
			WinkCurcLed;
		}
}

void interrupt usb_sever()
{   
	DISABLE; 
  fn_usb_isr();
    *XINT2CR=*XINT2CR|0X8000;
	*IFR=*IFR;
//    int1time++;
 /*0x0001*/
	ENABLE;
}

void	interrupt sci_intsever()
{
    DISABLE;
	scitime++;
	scicurnum=*SCIRXBUF;  
    *IFR=0X0010;
    SciDispose(scicurnum);  
    ENABLE;
	return;						/* 中断直接返回    */ 
}

/* 该中断服务程序主要是为了防止干扰,不做任何其它操作*/ 
void	interrupt nothing()
{
    int k;
    k=1;   
    *IFR=*IFR;
	return;						/* 中断直接返回    */ 
} 
void usbserve(void)
{       
		int i;
		if (bEPPflags.bits.bus_reset) {
			DISABLE;
			bEPPflags.bits.bus_reset = 0;
			ENABLE;
			setd12reset;
		} // if bus reset

		if (bEPPflags.bits.suspend) {
			DISABLE;
			bEPPflags.bits.suspend= 0;
			ENABLE;

		} // if suspend change

		if (bEPPflags.bits.setup_packet){
			DISABLE;
			bEPPflags.bits.setup_packet = 0;
			ENABLE;
			control_handler();
			setsuspend;
		} // if setup_packet
		if(bEPPflags.bits.setup_dma != 0) {
			DISABLE;
			bEPPflags.bits.setup_dma --;
			ENABLE;
			setup_dma();
			} // if setup_dma
		if(bEPPflags.bits.ep1_rxdone) {
			DISABLE;
			bEPPflags.bits.ep1_rxdone = 0;
			ENABLE; 
			for(i=0;i<3;i++) 
			{
				if(GenEpBuf[i]!=0xAA)
				return;
			}
			for(i=0;i<13;i++)
			recdata[i]=GenEpBuf[i+3];
			UsbOrSci=1;
			re_change=ref_chan;
			}	

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

}

⌨️ 快捷键说明

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