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

📄 isr.c

📁 DSP通过双口RAM和ISP1581实现下位机的USB固件程序
💻 C
字号:
#include "stdio.h"
#include "HAL.H"
//#include "USBD12.H"
#include "SMPro.H"
//#include "USB110.H"
#include "USB.H"
#include "VDOR.H"
#include "Isp1581.h"
#include "main.h"
#include "Isr.h"
#include "Iso.h"
//#include "Hal4sys.h"
#include <AT89X52.H>

/*
//*************************************************************************
//  Public static data
//*************************************************************************
*/

extern ZBOARDFLAGS bZBoardFlags;
extern CONTROL_XFER ControlData;
extern GLOBE_VARIABLE globe_variable;
extern IO_REQUEST idata ioRequest;
unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
/* ISR static vars */
unsigned long lClockTicks = 0;
unsigned char dmanum=0;

extern bit writeramflag;
extern unsigned char writeramlen;

/*
void ISR_Timer2(void) interrupt 5
{
}

void ISR_COMM(void) interrupt 4
{
}

void ISR_Timer1(void) interrupt 3
{
}

void ISR_INT1(void) interrupt 2
{
}
*/
void ISR_Timer0(void) interrupt 1
{
	DISABLE_INTERRUPTS;
	lClockTicks ++;
	bZBoardFlags.bits.bTimer = 1;
	ENABLE_INTERRUPTS;
}


void ISR_INT0(void) interrupt 0
{
	DISABLE_INTERRUPTS;
	ISRx_FN_USB();
	ENABLE_INTERRUPTS;
}
/*void ISR_timer1(void) interrupt 3
{
	DISABLE_INTERRUPTS;
	T1=0;
	T1=1;
    //MCU_LED0=!MCU_LED0;
    //dmanum+=1;
	//TF1=0;
	ENABLE_INTERRUPTS;
}*/
void ISRx_FN_USB()
{
	//unsigned int nST;
	USHORT   int_low, int_high;
	unsigned char nosetup;
	//bZBoardFlags.bits.bIN_ISR = 1;
	bZBoardFlags.bits.At_IRQL1 = 1;

	int_low = ISP1581_ReadInterruptRegisterLow();
	int_high = ISP1581_ReadInterruptRegisterHigh();
	if(int_low != 0 || int_high != 0)
    	{
		if(int_low & int_busreset)
		{
			ISP1581_IntClearl(int_busreset);
			if(int_low & int_hs_stat)
			{
				bZBoardFlags.bits.ConnectSpeed = HighSpeed;
				bZBoardFlags.bits.bBus_Reset = 1;
				int_low &= ~int_hs_stat;
				ISP1581_IntClearl(int_hs_stat);
				
			}
			else
			{
				bZBoardFlags.bits.ConnectSpeed = FullSpeed;
				bZBoardFlags.bits.bBus_Reset = 1;
				MCU_LED1 = 1;
			}
		}
		if(int_low & int_hs_stat)
		{
			ISP1581_IntClearl(int_hs_stat);
			if(bZBoardFlags.bits.ConnectSpeed == FullSpeed)
			{
				bZBoardFlags.bits.ConnectSpeed = HighSpeed;
				bZBoardFlags.bits.bBus_Reset = 1;
				MCU_LED1 = 0;
			}
		}
		else if(int_low & int_susp)
			{Isr_SuspendChange();}
		else if(int_low & int_resume)
			{Isr_Resume();}
		else if(int_low & int_dma)
			{Isr_DmaEot();}
		else if(int_low & (int_sof|int_psof))
			{Isr_SOF();}
		else {
				if(int_low & int_ep0set)
					{nosetup = 0x0;}
				else
					{nosetup = 0x1;}
				if(int_low & int_ep1rx)
					Isr_Ep01rxDone();
				if(int_low & int_ep1tx)
					Isr_Ep01txDone();
				if(int_low & int_ep2rx)
					Isr_Ep02rxDone();
				if(int_low & int_ep2tx)
					Isr_Ep02txDone();
				if(int_high & int_ep3rx)
					Isr_Ep03rxDone();
				if(int_high & int_ep3tx)
					Isr_Ep03txDone();
	// *************************** Control pipe *******************************
				if(int_low & int_ep0tx)
					Isr_Ep00TxDone(nosetup);

				if(int_low & int_ep0rx)     /*Keep Control Out of EP0 at Highest priority*/
					Isr_Ep00RxDone(nosetup);

				if(nosetup == 0)
					Isr_EP0Setup();
	//**************************** not used endpoints*************************
				if(int_high & int_ep4rx)
					Isr_Ep04rxDone();
				if(int_high & int_ep4tx)
					Isr_Ep04txDone();
			}

	}
	bZBoardFlags.bits.At_IRQL1 = 0;

}
///////////////////////////////////////////////////////////////////////////
void Isr_SuspendChange(void)
{
	ISP1581_IntClearl(int_susp);
	ISP1581_GoSuspend();
}

void Isr_Resume(void)
{
	ISP1581_UnlockDevice();
	ISP1581_SendResume();
	ISP1581_IntClearl(int_resume);
}

void Isr_DmaEot(void)
{
	unsigned short dmaeot_reason;// dma_width16, isp1581_dma_counter_remains;
	//unsigned int c;
	dmaeot_reason =	ISP1581_GetDMAInt();
	ISP1581_SetDMAInt(dmaeot_reason);//clear DMA interrupt ;
	ISP1581_IntClearl(int_dma);
	
	//CPLD_ctl(dmactl_stop);
	//ISP1581_SetDMACMD(dmacmd_reset);
	//ISP1581_SetDMAIntMask(0);
	//c = ISP1581_GetIntEnableLow();
	//ISP1581_SetIntEnableLow(c|bulkinendpointinterrupt|bulkoutendpointinterrupt);
	
	//清除中断标志
	MCU_LED1=!MCU_LED1;
	bZBoardFlags.bits.dma_state = DMA_IDLE;
}

//true iso
void Isr_SOF(void)
{
	ISP1581_IntClearl(int_sof|int_psof);
}

void Isr_EP0Setup(void)
{
	// Getting Setup Packet
	ISP1581_IntClearl(int_ep0set);
	SetupToken_Handler();
}
void Isr_Ep00RxDone(unsigned char nosetup)
{
	UCHAR       i;
	unsigned short len;
	
	//ISP1581_IntClearl(int_ep0rx);
	switch (bZBoardFlags.bits.DCP_state)
	{
	case USBFSM4DCP_DATAOUT:
		
		if(ControlData.wLength >= ControlData.wCount)
			len = ControlData.wLength - ControlData.wCount;
		else
			len = 0x0;
			
		i =ISP1581_ReadControlEndpoint(ControlData.dataBuffer + ControlData.wCount, len);
		ControlData.wCount += i;

		if(ControlData.wCount <= ControlData.wLength && i <= EP0_PACKET_SIZE)
		{
			bZBoardFlags.bits.CONTROL_HANDLE_DONE = 1;
			bZBoardFlags.bits.DCP_state = USBFSM4DCP_REQUESTPROC;
		}
		else	// too much data out than expected
		{
			if(nosetup)
			{
			ISP1581_StallEP0InControlWrite();
			bZBoardFlags.bits.DCP_state = USBFSM4DCP_STALL;
			}
		}
		ISP1581_IntClearl(int_ep0rx);
		break;
	case USBFSM4DCP_CONTROLREADHANDSHAKE:
		bZBoardFlags.bits.DCP_state = USBFSM4DCP_IDLE;
		ISP1581_IntClearl(int_ep0rx);
		break;
	case USBFSM4DCP_IDLE:
		bZBoardFlags.bits.DCP_state = USBFSM4DCP_IDLE;
		if(nosetup)
			{//MCU_LED0 = 0;
			ISP1581_IntClearl(int_ep0rx);}
		break;
	case USBFSM4DCP_STALL:
		if(nosetup)
			ISP1581_IntClearl(int_ep0rx);
		break;
	default:
	if(nosetup)
		{
		
		ISP1581_StallEP0InControlWrite();
		bZBoardFlags.bits.DCP_state = USBFSM4DCP_STALL;
		}
		break;
	}
}
void Isr_Ep00TxDone(unsigned char nosetup)
{
	short i;
	ISP1581_IntClearl(int_ep0tx);
	switch (bZBoardFlags.bits.DCP_state)
	{
	case USBFSM4DCP_CONTROLREADHANDSHAKE:
		ISP1581_ControlReadHandshake();
		bZBoardFlags.bits.DCP_state = USBFSM4DCP_CONTROLREADHANDSHAKE;
		break;
	case USBFSM4DCP_CONTROLWRITEHANDSHAKE:
		bZBoardFlags.bits.DCP_state = USBFSM4DCP_IDLE;
		break;
	case USBFSM4DCP_DATAIN:
		i = ControlData.wLength - ControlData.wCount;
		if( i >= EP0_PACKET_SIZE)
		{
			ISP1581_WriteControlEndpoint(ControlData.pData + ControlData.wCount, EP0_PACKET_SIZE);
			ControlData.wCount += EP0_PACKET_SIZE;
			bZBoardFlags.bits.DCP_state = USBFSM4DCP_DATAIN;
		}
		else if( i != 0)
		{
			ISP1581_WriteControlEndpoint(ControlData.pData + ControlData.wCount, i);
			ControlData.wCount += i;
			bZBoardFlags.bits.DCP_state = USBFSM4DCP_CONTROLREADHANDSHAKE;
		}
		else if (i == 0)
		{
			ISP1581_WriteControlEndpoint(0, 0);
			bZBoardFlags.bits.DCP_state = USBFSM4DCP_CONTROLREADHANDSHAKE;
		}
		break;
	case USBFSM4DCP_STALL:
		bZBoardFlags.bits.DCP_state = USBFSM4DCP_IDLE;
		break;
	case USBFSM4DCP_IDLE:
		//MCU_LED0=0;
		break;
	case USBFSM4DCP_REQUESTPROC:
		
		break;
	case USBFSM4DCP_SETUPPROC:
		
		break;
	case USBFSM4DCP_DATAOUT:
		
		break;
	default:
// do nothing, maybe just 1st nak for control in.
		if(nosetup)
		{
			//MCU_LED0=0;
			ISP1581_StallEP0InControlRead();
			bZBoardFlags.bits.DCP_state = USBFSM4DCP_STALL;
		}
		break;
	
	}
}

void Isr_Ep01rxDone(void)
{
	unsigned short len;
	ISP1581_IntClearl(int_ep1rx);
	len= ISP1581_ReadBulkEndpoint(EPINDEX4EP01OUT,GenEpBuf,EP1_PACKET_SIZE);
writeramflag=1; //7.25
	writeramlen=len;
	
}
void Isr_Ep01txDone(void)
{
	ISP1581_IntClearl(int_ep1tx);
}
void Isr_Ep02rxDone(void)
{
	unsigned short len;
	ISP1581_IntClearl(int_ep2rx);
	len= ISP1581_ReadBulkEndpoint(EPINDEX4EP02OUT,GenEpBuf,maxepsize_FS);

}
void Isr_Ep02txDone(void)
{
	ISP1581_IntClearl(int_ep2tx);
}
void Isr_Ep03rxDone(void)
{
	ISP1581_IntClearh(int_ep3rx);
}
void Isr_Ep03txDone(void)
{
	ISP1581_IntClearh(int_ep3tx);
}
void Isr_Ep04rxDone(void)
{
	unsigned short len;
	ISP1581_IntClearh(int_ep4rx);
	len= ISP1581_ReadBulkEndpoint(EPINDEX4EP04OUT,GenEpBuf,EP4_PACKET_SIZE);
	ioRequest.bCommand=GenEpBuf[0];
	bZBoardFlags.bits.bLED = 1;
	
}
void Isr_Ep04txDone(void)
{
	ISP1581_IntClearh(int_ep4tx);	
}


///////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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