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

📄 main.c

📁 DSP通过双口RAM和ISP1581实现下位机的USB固件程序
💻 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 + -