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

📄 __isr.c

📁 C语言版的USB单片机固件源代码
💻 C
字号:
//===================================================================//
//     Project Name : ZBoard
//      Module Name : Master Firmware Program
//     Product Type : License
//      OS/Dev Tool : AT89C52, uVision 2
//  Original Author : Ray Yang
//     Organization : YBWork.com
//    Original Date : July, 25, 2001
//             Addr : Room 402, No. 131, Meilong No. 9
//              TEL : 86-21-54630718
//            EMail : rayyang2000@yahoo.com
//          Website : http://www.ybwork.com
//		  Copyright : Copyright (L) YBWork.com, 2001
//         Comments : 
//                    
//					<< History >> 
//					July, 25, 2001		The first release
//===================================================================//

#include "HAL.H"
#include "USBD12.H"
#include "ZBoard.H"
#include "USB110.H"
#include "USB.H"
#include "VDOR.H"

/*
//***********************************************************
// These functions is use for USB ISR routine
//***********************************************************
*/

void ISRx_Bus_Reset(void);

void ISRx_EP0_TxDone(void);
void ISRx_EP0_RxDone(void);

void ISRx_EP1_TxDone(void);
void ISRx_EP1_RxDone(void);

void ISRx_Main_TxDone(void);
void ISRx_Main_RxDone(void);

void ISRx_DMA_EOT(void);

void ISRx_FN_USB(void);

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

extern ZBOARDFLAGS bZBoardFlags;
unsigned char nCount = 0;
/* Control endpoint TX/RX buffers */
extern CONTROL_XFER ControlData;
extern CODE_DATA idata CodeData;

/* General Buffer*/
unsigned char idata GenBuf[GENBUF_LENGH];

/* ISR static vars */
unsigned long lClockTicks = 0;

// This variable is used for debugging
unsigned char nFlashPhase = 0;

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;
	nCount ++;
	if(bZBoardFlags.bits.bLED == LED_FLASH)
		IO_LED ^= 1;
	ENABLE_INTERRUPTS;
}


void ISR_INT0(void) interrupt 0
{
	DISABLE_INTERRUPTS;
	ISRx_FN_USB();
	ENABLE_INTERRUPTS;
}

void ISRx_FN_USB()
{
	unsigned int nST;

	bZBoardFlags.bits.bIN_ISR = 1;

	nST = USBD12_ReadInterruptRegister();

#ifdef _DEBUG
	printf("USBD12_ReadInterruptRegister() = 0x%02x\n", nST);
#endif

	if(nST != 0)
    	{
		if(nST & USBD12_INT_BUSRESET)
        	{
			ISRx_Bus_Reset();
			bZBoardFlags.bits.bBus_Reset = 1;
		}

		if(nST & USBD12_INT_EOT)
			ISRx_DMA_EOT();

		if(nST & USBD12_INT_SUSPENDCHANGE)
		{
			bZBoardFlags.bits.bSuspend = 1;
		}

		if(nST & USBD12_INT_ENDP0IN)
			ISRx_EP0_TxDone();
		if(nST & USBD12_INT_ENDP0OUT)
			ISRx_EP0_RxDone();
		if(nST & USBD12_INT_ENDP1IN)
			ISRx_EP1_TxDone();
		if(nST & USBD12_INT_ENDP1OUT)
			ISRx_EP1_RxDone();
		if(nST & USBD12_INT_ENDP2IN)
			ISRx_Main_TxDone();
		if(nST & USBD12_INT_ENDP2OUT)
			ISRx_Main_RxDone();
	}

	bZBoardFlags.bits.bIN_ISR = 0;

}

void ISRx_Bus_Reset(void)
{

}

// OUT Packet
void ISRx_EP0_RxDone(void)
{

	unsigned char ep_last, i;

	ep_last = USBD12_ReadLastTransactionStatus(0); // Clear interrupt flag

	if(ep_last & USBD12_SETUPPACKET)
	{
		ControlData.wLength = 0;
		ControlData.wCount = 0;

		if( USBD12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
			(unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) )
		{

			USBD12_SetEndpointStatus(0, 1);
			USBD12_SetEndpointStatus(1, 1);
			bZBoardFlags.bits.bControl_State = USB_IDLE;
			
			return;
		}

		ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
		ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
		ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);

		// Acknowledge setup here to unlock in/out endp
		USBD12_AcknowledgeEndpoint(0);
		USBD12_AcknowledgeEndpoint(1);

		ControlData.wLength = ControlData.DeviceRequest.wLength;
		ControlData.wCount = 0;

		if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
		{
			bZBoardFlags.bits.bSetup_Packet = 1;
			bZBoardFlags.bits.bControl_State = USB_IDLE;		/* get command */
		}
		else
		{
			if (ControlData.DeviceRequest.wLength == 0)
			{
				bZBoardFlags.bits.bSetup_Packet = 1;
				bZBoardFlags.bits.bControl_State = USB_IDLE;		/* set command */
			}
			else
			{
				if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
				{
					bZBoardFlags.bits.bControl_State = USB_IDLE;
					USBD12_SetEndpointStatus(0, 1);
					USBD12_SetEndpointStatus(1, 1);
				}
				else
				{
					bZBoardFlags.bits.bControl_State = USB_RECEIVE;	/* set command with OUT token */
				}
			} // set command with data
		} // else set command
	} // if setup packet
	else if (bZBoardFlags.bits.bControl_State == USB_RECEIVE)
	{
		i =	USBD12_ReadEndpoint(0, ControlData.dataBuffer + ControlData.wCount,
			EP0_PACKET_SIZE);

		ControlData.wCount += i;
		if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
		{
			bZBoardFlags.bits.bSetup_Packet = 1;
			bZBoardFlags.bits.bControl_State = USB_IDLE;
		}
	}
	else
	{
		bZBoardFlags.bits.bControl_State = USB_IDLE;
	}
}

// IN Packet
void ISRx_EP0_TxDone(void)
{
#ifdef _DEBUG
	int j;
#endif
	short i = ControlData.wLength - ControlData.wCount;

	USBD12_ReadLastTransactionStatus(1); // Clear interrupt flag

	if(bZBoardFlags.bits.bControl_State != USB_TRANSMIT)
		return;

	if(i >= EP0_PACKET_SIZE)
	{
#ifdef _DEBUG
		printf("EP0Tx {");
		for(j=0; j<EP0_PACKET_SIZE; j++)
		{
			printf("%bx ", *(ControlData.pData + ControlData.wCount + j));
		}
		printf("}\n");
#endif
		USBD12_WriteEndpoint(1, ControlData.pData + ControlData.wCount, EP0_PACKET_SIZE);
		ControlData.wCount += EP0_PACKET_SIZE;

		bZBoardFlags.bits.bControl_State = USB_TRANSMIT;
	}
	else if(i != 0)
	{
#ifdef _DEBUG
		printf("EP0Tx {");
		for(j=0; j<i; j++)
		{
			printf("%bx ", *(ControlData.pData + ControlData.wCount + j));
		}
		printf("}\n");
#endif
		USBD12_WriteEndpoint(1, ControlData.pData + ControlData.wCount, i);
		ControlData.wCount += i;

		bZBoardFlags.bits.bControl_State = USB_IDLE;
	}
	else if (i == 0)
	{
#ifdef _DEBUG
		printf("EP0Tx { }\n");
#endif
		USBD12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ???

		bZBoardFlags.bits.bControl_State = USB_IDLE;
	}
}

// End of DMA transfer
void ISRx_DMA_EOT(void)
{
}

// OUT Packet
void ISRx_EP1_RxDone(void)
{
}

// IN Packet
void ISRx_EP1_TxDone(void)
{
}

// OUT Packet
void ISRx_Main_RxDone(void)
{
	unsigned short nLen;

	nLen = USBD12_ReadLastTransactionStatus(4); /* Clear interrupt flag */
	if(!(nLen & USBD12_SUCCESS))
		return;

	nLen = CodeData.wCodeLength - CodeData.wCodeCount;
	nFlashPhase ++;
	if(nLen != 0)
	{
//READ_DATA:
		nLen = USBD12_ReadEndpoint(4, CodeData.pCodeData, sizeof(GenBuf));
//		nLen = USBD12_ReadMainEP(/*CodeData.pCodeData*/);
#ifdef _DEBUG
		printf("EP2 ISR nLen = 0x%02x\n", nLen);
#endif

		CodeData.wCodeCount += nLen;
		CodeData.pCodeData += nLen;
		if(CodeData.pCodeData > (GenBuf + sizeof(GenBuf) / 2))
			CodeData.pCodeData = GenBuf;
//		if(CodeData.pCodeData > (GenBuf + sizeof(GenBuf)))
//			CodeData.pCodeData = GenBuf + (CodeData.pCodeData - (GenBuf + sizeof(GenBuf)));

		if(CodeData.wCodeCount && (CodeData.wCodeCount % 128 == 0))
		{
#ifdef _DEBUG
			printf("FlashWrite\n");
#endif
			FlashWrite(GenBuf, CodeData.wCodeAddress, sizeof(GenBuf));
			CodeData.wCodeAddress += sizeof(GenBuf);
		}

/*
		if(((CodeData.wCodeLength - CodeData.wCodeCount) <= 64) &&
			(CodeData.wCodeLength - CodeData.wCodeCount) &&
			nLen)
		{
			goto READ_DATA;
		}
*/
	}
	else
		nLen = USBD12_ReadEndpoint(4, CodeData.pCodeData, sizeof(GenBuf));
}

// IN Packet
void ISRx_Main_TxDone(void)
{
	unsigned short nLen;

	USBD12_ReadLastTransactionStatus(5); /* Clear interrupt flag */

	nLen = CodeData.wCodeLength - CodeData.wCodeCount;
	if(nLen != 0)
	{
		if(nLen > EP2_TX_FIFO_SIZE)
			nLen = EP2_TX_FIFO_SIZE;

		FlashRead(CodeData.wCodeAddress, CodeData.pCodeData, nLen);
		nLen = USBD12_WriteEndpoint(5, CodeData.pCodeData, nLen);

		CodeData.pCodeData += nLen;
		if(CodeData.pCodeData > (GenBuf + sizeof(GenBuf) / 2))
			CodeData.pCodeData = GenBuf;
		CodeData.wCodeCount += nLen;
		CodeData.wCodeAddress += nLen;
	}
}

⌨️ 快捷键说明

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