📄 main.c
字号:
#include "HAL.H"
//#include "USBD12.H"
#include "SMPro.H"
//#include "USB110.H"
#include "USB.H"
#include "CHAP9.H"
#include "VDOR.H"
#include "Isp1581.h"
#include "main.h"
//#include "Hal4sys.h"
#include "Iso.h"
#include "dportram.h"
GLOBE_VARIABLE globe_variable;
///////////////////////////////////
// Data definition
extern unsigned long lClockTicks;
ZBOARDFLAGS bdata bZBoardFlags;
extern CONTROL_XFER ControlData;
//extern CODE_DATA idata CodeData;
IO_REQUEST idata ioRequest;
//bit uart_flag=0;
//unsigned char uart_received=0;
//extern unsigned int dackpulse;
//extern bit dmadackbit;
bit writeramflag=0;
unsigned char writeramlen=0;
extern unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
extern unsigned char idata last_key;
/*unsigned char xdata value1 _at_ 0x0000;
unsigned char xdata value2 _at_ 0x0100;
unsigned char xdata value3 _at_ 0x0200;
unsigned char xdata value4 _at_ 0x0300;
unsigned char xdata value5 _at_ 0x0400;
unsigned char xdata value6 _at_ 0x0500;
unsigned char xdata value7 _at_ 0x0600;
unsigned char xdata value8 _at_ 0x0700;
unsigned char xdata value9 _at_ 0x0800;
unsigned char xdata value10 _at_ 0x0900;
unsigned char xdata value11 _at_ 0x0a00;
unsigned char xdata value12 _at_ 0x0b00;
unsigned char xdata value13 _at_ 0x0c00;
unsigned char xdata value14 _at_ 0x0d00;
unsigned char xdata value15 _at_ 0x0e00;
unsigned char xdata value16 _at_ 0x0f00;
*/
void Init_Timer0(void)
{
TMOD &= 0xF0; /* clear Timer 0 */
TMOD |= 0x1;
TL0 = 0x0; /* value set by user */
TH0 = 0x0; /* value set by user */
ET0 = 1; /* IE.1*/
TR0 = 1; /* TCON.4 start timer */
// PT0 = 1;
}
/*void Init_Timer1(void)
{
TMOD &= 0x0f; //* clear Timer 0
TMOD |= 0x020;
TL1 = 0xf3; //* value set by user
TH1 = 0xf3; //* value set by user
ET1 = 0; //* IE.1
TR1 = 1; //* TCON.4 start timer
}
void Init_uart(void)
{
SCON=0X50;
PCON=0X00;
ES=1; //*Enable uart interrupt
}
*/
void Init_Port()
{
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
}
/*void UARTSEND(char num) //
{
EA=0;
SBUF=num;
while(TI==0);
TI=0;
EA=1;
}
/*void UART(void) interrupt 4
{
EA=0;
if(RI==1)
{uart_flag=1;
uart_received=SBUF;
UARTSEND(uart_received);
RI=0;
EA=1;
}
else
{TI=0;
EA=1;
}
}
*/
/*void init_fifo()
{
unsigned int i=0;
for(i=0;i<64;i++)
{
value1=0;
value2=0;
value3=0;
value4=0;
value5=0;
value6=0;
value7=0;
value8=0;
value9=0;
value10=0;
value11=0;
value12=0;
value13=0;
value14=0;
value15=0;
value16=0;
}
}*/
/*T0=1;
for (i=0;i<1024;i++)
{
T0=0;
T0=1;
}*/
/*------------------------------------------------
The main C function. Program execution starts
here after stack initialization.
------------------------------------------------*/
void main (void)
{
//unsigned int zloop1,zloop2;
//unsigned char rloop;
unsigned short temp2;
////////////////////////////////////////////////
bZBoardFlags.bits.At_IRQL1 =1;
////////////////////////////////////////////////
Init_Timer0();
Init_Port();
init_ram();
//Init_Timer1();//5.21
//Init_uart();
// UARTSEND(0X55);
EA=1;
T1=1;//FIFO's w\ and r\ must remain high during reset
WR=1;
// init_fifo();
temp2=ISP1581_ReadChipID(); //1581
////////////////////////////////////////
last_key=0x3;
LED_STATUS=1;
MCU_LED0 = 0;
MCU_LED1 = 0;
/////////////////////////////////////////////////////
bZBoardFlags.bits.At_IRQL1 =0;
/////////////////////////////////////////////////////
ISP1581_ResetDevice();
EX0=1;
Device_Initiate();
ENABLE_INTERRUPTS;
/* Main program loop */
while(TRUE)
{
if (bZBoardFlags.bits.bTimer){
DISABLE_INTERRUPTS;
bZBoardFlags.bits.bTimer = 0;
ENABLE_INTERRUPTS;
if(bZBoardFlags.bits.bConfiguration)
check_key_LED();
}
/***********************************************************************************************************/
/***********************************************************************************************************/
//write zhe received data to d-port ram
//7.25
/***********************************************************************************************************/
if (writeramflag==1)
{
writeramflag=0;
//for(rloop=0;rloop<writeramlen;rloop++)
//GenEpBuf[rloop]+=1;
WriteRam(writeramlen,GenEpBuf);
}
/* if(dmadackbit==1)
{
dmadackbit=0;
for(zloop2=0;zloop2<dackpulse;zloop2+=zlooponce)
{
while(dmagate==0);
for(zloop1=0;zloop1<zlooponce;zloop1++)
{
if(dmagate==1)
{
T1=0;
T1=1;
}
else
zloop1--;
}
}
} */
if (bZBoardFlags.bits.bBus_Reset)
{
DISABLE_INTERRUPTS;
bZBoardFlags.bits.bBus_Reset = 0;
ENABLE_INTERRUPTS;
Isr_BusReset();
} // if bus reset
if (bZBoardFlags.bits.DCP_state == USBFSM4DCP_REQUESTPROC && bZBoardFlags.bits.CONTROL_HANDLE_DONE == 1 )
{
RaiseIRQL();
bZBoardFlags.bits.CONTROL_HANDLE_DONE = 0;
DeviceRequest_Handler();
LowerIRQL();
} /* if setup_packet for DeviceRequest*/
if (bZBoardFlags.bits.setup_dma == 1 && (bZBoardFlags.bits.dma_state == DMA_IDLE))
{
RaiseIRQL();
bZBoardFlags.bits.setup_dma = 0;
// UARTSEND(0X55);
// setup_dma(); //7.25
LowerIRQL();
} // if setup_dma
if (bZBoardFlags.bits.DCP_state == USBFSM4DCP_CONTROLOUTDONE)
{
Chap9_ControlWriteHandshake();
}
if (bZBoardFlags.bits.ISO_CONFIG)
{
bZBoardFlags.bits.ISO_CONFIG = 0;
// ISO_CONFIG();
}
} // Main Loop
}
/////////////////////////////////////////////////
void ISP1581_Initiate(void)
{
//adress reg: 0x00
ISP1581_SetAddressEnable(0x0, 0x01); // set address to 0 and enable it.
ISP1581_SetTestMode(0); // clear test mode
ISP1581_SetMode(/* mode_clkaon*/mode_glintena|mode_softct);
// |mode_wkupcs
// |mode_pwroff
// |mode_softct
// |mode_clkaon
// );
ISP1581_SetIntConfig(0x0
|intcfg_cdbgmod_as // control interrupt on ack and stall
|intcfg_ddbgmodin_a // IN data interrupt on ack only
|intcfg_ddbgmodout_asy // OUT data on ack and stall and nyet intertupt
//|intcfg_polh); // level interrupt and active high
// |intcfg_edgetrig
);
ISP1581_SetIntEnableLow(int_busreset|int_susp|int_resume
|int_hs_stat|int_dma|int_ep0set
|int_ep0rx|int_ep0tx
|int_ep1rx|int_ep1tx
|int_ep2rx|int_ep2tx);
ISP1581_SetIntEnableHigh(int_ep3rx|int_ep3tx
|int_ep4rx|int_ep4tx
|int_ep5rx|int_ep5tx
|int_ep6rx|int_ep6tx
|int_ep7rx|int_ep7tx);
ISP1581_ConfigEndpoint(); // default config as a full speed device
//-------------xxg-----------------
// dma config: 0x38
ISP1581_SetDMAConfig(dmacfg_width16|dmacfg_modediorw/*|dmacfg_modediorack*/|dmacfg_burst0);
// dma hardware:0x3c
ISP1581_SetDMAHDCfg(dmahd_dreqpolh/*|dmahd_dackpolh*/|dmahd_eotpolh/*|dmahd_readpolh|dmahd_writepolh*/);
}
void ISP1581_ConfigEndpoint(void)
{
// disable all endpoint firsr;
ISP1581_SetEndpointConfig(EPINDEX4EP01OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP01IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP02OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP02IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP03OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP03IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP04OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP04IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP05OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP05IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP06OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP06IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP07OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP07IN, 0);
switch(bZBoardFlags.bits.ConnectSpeed)
{
case FullSpeed:
{
ISP1581_SetEPMAXSize(EPINDEX4EP01OUT, EP1_PACKET_SIZE);
ISP1581_SetEPMAXSize(EPINDEX4EP01IN, EP1_PACKET_SIZE);
globe_variable.maxepsize_bulk = maxepsize_FS;
ISP1581_SetEPMAXSize(EPINDEX4EP02OUT, globe_variable.maxepsize_bulk);
ISP1581_SetEPMAXSize(EPINDEX4EP02IN, globe_variable.maxepsize_bulk);
//ISP1581_SetEPMAXSize(EPINDEX4EP03OUT, maxepsize_256);
//ISP1581_SetEPMAXSize(EPINDEX4EP03IN, maxepsize_256);
ISP1581_SetEPMAXSize(EPINDEX4EP04OUT, maxepsize_16);
ISP1581_SetEPMAXSize(EPINDEX4EP04IN, maxepsize_16);
break;
}
case HighSpeed:
{
ISP1581_SetEPMAXSize(EPINDEX4EP01OUT, maxepsize_512);
ISP1581_SetEPMAXSize(EPINDEX4EP01IN, maxepsize_512);
globe_variable.maxepsize_bulk = maxepsize_HS;
ISP1581_SetEPMAXSize(EPINDEX4EP02OUT, globe_variable.maxepsize_bulk);
ISP1581_SetEPMAXSize(EPINDEX4EP02IN, globe_variable.maxepsize_bulk);
//ISP1581_SetEPMAXSize(EPINDEX4EP03OUT, maxepsize_256);
//ISP1581_SetEPMAXSize(EPINDEX4EP03IN, maxepsize_256);
ISP1581_SetEPMAXSize(EPINDEX4EP04OUT, maxepsize_512);
ISP1581_SetEPMAXSize(EPINDEX4EP04IN, maxepsize_16);
break;
}
default:
{
globe_variable.maxepsize_bulk = maxepsize_FS;
break;
}
}
ISP1581_SetEPMAXSize(EPINDEX4EP03OUT, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP03IN, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP05OUT, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP05IN, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP06OUT, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP06IN, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP07OUT, maxepsize_0);
ISP1581_SetEPMAXSize(EPINDEX4EP07IN, maxepsize_0);
ISP1581_SetEndpointConfig(EPINDEX4EP01OUT, eptype_bulk|eptype_enable);
ISP1581_SetEndpointConfig(EPINDEX4EP01IN, eptype_bulk|eptype_enable);//|eptype_doublebuf);//|eptype_noempkt);
ISP1581_SetEndpointConfig(EPINDEX4EP02OUT, eptype_bulk|eptype_enable|eptype_doublebuf);
ISP1581_SetEndpointConfig(EPINDEX4EP02IN, eptype_bulk|eptype_enable|eptype_doublebuf|eptype_noempkt);
ISP1581_SetEndpointConfig(EPINDEX4EP03OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP03IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP04OUT, eptype_bulk|eptype_enable);
ISP1581_SetEndpointConfig(EPINDEX4EP04IN, eptype_int|eptype_enable);
ISP1581_SetEndpointConfig(EPINDEX4EP05OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP05IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP06OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP06IN, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP07OUT, 0);
ISP1581_SetEndpointConfig(EPINDEX4EP07IN, 0);
ISP1581_ClearBuffer(EPINDEX4EP01OUT);
ISP1581_ClearBuffer(EPINDEX4EP01IN);
ISP1581_ClearBuffer(EPINDEX4EP02OUT);
ISP1581_ClearBuffer(EPINDEX4EP02IN);
ISP1581_ClearBuffer(EPINDEX4EP03OUT);
ISP1581_ClearBuffer(EPINDEX4EP03IN);
ISP1581_ClearBuffer(EPINDEX4EP04OUT);
ISP1581_ClearBuffer(EPINDEX4EP04IN);
}
void Isr_BusReset(void)
{
bZBoardFlags.bits.DCP_state = USBFSM4DCP_IDLE;
bZBoardFlags.bits.dma_state = DMA_IDLE;
ioRequest.bAddressH = 0;
ioRequest.uAddressL = 0;
ioRequest.uSize = 0;
globe_variable.ioINSize = 0;
globe_variable.ioINCount = 0;
globe_variable.ioOUTSize = 0;
globe_variable.ioOUTCount = 0;
bZBoardFlags.bits.CONTROL_HANDLE_DONE = 0;
bZBoardFlags.bits.ISO_CONFIG = 0;
ISP1581_SetDMAInt(0xffff);//c);
ISP1581_IntClearl(0xffff);
ISP1581_IntClearh(0xffff);
ISP1581_Initiate();
}
void Device_Initiate(void)
{
unsigned long clk_cnt;
MCU_LED0 = 0;
MCU_LED1 = 0;
disconnect_USB();
ENABLE_INTERRUPTS;
clk_cnt = lClockTicks;
while(lClockTicks < clk_cnt + 20);
DISABLE_INTERRUPTS;
bZBoardFlags.bits.DCP_state = USBFSM4DCP_IDLE;
bZBoardFlags.bits.ConnectSpeed = FullSpeed;
bZBoardFlags.bits.dma_state = DMA_IDLE;
bZBoardFlags.bits.CONTROL_HANDLE_DONE = 0;
bZBoardFlags.bits.ISO_CONFIG = 0;
ISP1581_SetDMAInt(0xffff);//c);
ISP1581_IntClearl(0xffff);
ISP1581_IntClearh(0xffff);
ioRequest.bAddressH = 0;
ioRequest.uAddressL = 0;
ioRequest.uSize = 0;
globe_variable.ioINSize = 0;
globe_variable.ioINCount = 0;
globe_variable.ioOUTSize = 0;
globe_variable.ioOUTCount = 0;
globe_variable.isoINSize = 0;
globe_variable.isoINCount = 0;
globe_variable.isoOUTSize = 0;
globe_variable.isoOUTCount = 0;
MCU_LED0 = 1;
MCU_LED1 = 1;
connect_USB();
return;
}
void disconnect_USB(void)
{
ISP1581_SetTestMode(testmode_forcefs);
//You may need some delay here if MPU is very fast.
ISP1581_SetMode(/* mode_clkaon*/mode_glintena);
// |mode_wkupcs);
// |mode_softct);
}
void connect_USB(void)
{
bZBoardFlags.bits.DCP_state = USBFSM4DCP_IDLE;
ISP1581_Initiate();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -