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