?? dspusbtem.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 + -