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

📄 isr.c

📁 基于AVR的USB单片机的源代码,其中部分代码被用在产品上.
💻 C
字号:
//===================================================================//
//					Augest, 25, 2002		The Last Modified Date
//                  Modified by Dai LiZHou, HIT (dailizhou@0451.com)
//===================================================================//
#include "AvrUsb.H"

//***********************************************************
// These functions is use for USB ISR routine
//***********************************************************
unsigned char buf[16];

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 AVRUSBFLAGS bAvrUsbFlags;
unsigned long  lClockTicks;
extern CONTROL_XFER ControlData;

#pragma interrupt_handler ISR_Timer0:8
void ISR_Timer0(void) 
{
	DISABLE_INTERRUPTS;
	lClockTicks ++;
	bAvrUsbFlags.bits.bTimer = 1;
	if(bAvrUsbFlags.bits.bLED == LED_FLASH)
	{
		if( PORTB&0x01 ) PORTB &= 0xFE;
		else             PORTB |= 0x01;
	}
	ENABLE_INTERRUPTS;
}

#pragma interrupt_handler ISR_INT0:2
void ISR_INT0(void)
{
	DISABLE_INTERRUPTS;
	ISRx_FN_USB();
	ENABLE_INTERRUPTS;
}

void ISRx_FN_USB(void)
{
	unsigned int nST;

	bAvrUsbFlags.bits.bIN_ISR = 1;
	nST = USBD12_ReadInterruptRegister();
	if(nST != 0)
    {
		if(nST & USBD12_INT_BUSRESET)
        {
			ISRx_Bus_Reset();
			bAvrUsbFlags.bits.bBus_Reset = 1;
		}
		if(nST & USBD12_INT_EOT) 			    ISRx_DMA_EOT();
		if(nST & USBD12_INT_SUSPENDCHANGE)		bAvrUsbFlags.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();
	}
	bAvrUsbFlags.bits.bIN_ISR = 0;
}

void ISRx_Bus_Reset(void)
{
}

// OUT Packet : Host to Device
void ISRx_EP0_RxDone(void)
{
	unsigned char ep_last, i;

	// Clear interrupt flag
	ep_last = USBD12_ReadLastTransactionStatus(0);
	
	if(ep_last & USBD12_SETUPPACKET)
	{
		ControlData.wLength = 0;
		ControlData.wCount = 0;

		if( USBD12_ReadEndpoint(0,
			(unsigned char *)(&(ControlData.DeviceRequest)), 
			sizeof(ControlData.DeviceRequest) ) != sizeof(DEVICE_REQUEST) )
		{
			USBD12_SetEndpointStatus(0, 1);
			USBD12_SetEndpointStatus(1, 1);
			bAvrUsbFlags.bits.bControl_State = USB_IDLE;
			return;
		}

		ControlData.DeviceRequest.wValue = ControlData.DeviceRequest.wValue;
		ControlData.DeviceRequest.wIndex = ControlData.DeviceRequest.wIndex;
		ControlData.DeviceRequest.wLength =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 )
		{
			bAvrUsbFlags.bits.bSetup_Packet = 1;
			bAvrUsbFlags.bits.bControl_State = USB_IDLE;		/* get command */
		}
		else
		{
			if (ControlData.DeviceRequest.wLength == 0)
			{
				bAvrUsbFlags.bits.bSetup_Packet = 1;
				bAvrUsbFlags.bits.bControl_State = USB_IDLE;		/* set command */
			}
			else
			{
				if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
				{
					bAvrUsbFlags.bits.bControl_State = USB_IDLE;
					USBD12_SetEndpointStatus(0, 1);
					USBD12_SetEndpointStatus(1, 1);
				}
				else
				{
					bAvrUsbFlags.bits.bControl_State = USB_RECEIVE;	/* set command with OUT token */
				}
			} // set command with data
		} // else set command
	} // if setup packet
	else if (bAvrUsbFlags.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)
		{
			bAvrUsbFlags.bits.bSetup_Packet = 1;
			bAvrUsbFlags.bits.bControl_State = USB_IDLE;
		}
	}
	else
	{
		bAvrUsbFlags.bits.bControl_State = USB_IDLE;
	}
}

// IN Packet: Device to Host
void ISRx_EP0_TxDone(void)
{
	short i = ControlData.wLength - ControlData.wCount;

	USBD12_ReadLastTransactionStatus(1); // Clear interrupt flag

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

	if(i >= EP0_PACKET_SIZE)
	{
		USBD12_WriteEndpointRom(1, ControlData.pData + ControlData.wCount, EP0_PACKET_SIZE);
		ControlData.wCount += EP0_PACKET_SIZE;

		bAvrUsbFlags.bits.bControl_State = USB_TRANSMIT;
	}
	else if(i != 0)
	{
		USBD12_WriteEndpointRom(1, ControlData.pData + ControlData.wCount, i);
		ControlData.wCount += i;

		bAvrUsbFlags.bits.bControl_State = USB_IDLE;
	}
	else if (i == 0)
	{
		USBD12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ???

		bAvrUsbFlags.bits.bControl_State = USB_IDLE;
	}
}

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

// OUT Packet
void ISRx_EP1_RxDone(void)
{
   unsigned short nLen;
   
   nLen=USBD12_ReadLastTransactionStatus(2);
   if( nLen&USBD12_SUCCESS )
   {
      nLen=USBD12_ReadEndpoint(2,buf,8);
   }
   bAvrUsbFlags.bits.bRead=1;
}

// IN Packet : Device to Host
void ISRx_EP1_TxDone(void)
{
   USBD12_ReadLastTransactionStatus(3);
}

// OUT Packet : Host to Device
void ISRx_Main_RxDone(void)
{
   unsigned short nLen;

   nLen=USBD12_ReadLastTransactionStatus(4);
   if( nLen&USBD12_SUCCESS )
   {
      nLen=USBD12_ReadEndpoint(4,buf,8);
   }
   bAvrUsbFlags.bits.bRead=1;
}

// IN Packet
void ISRx_Main_TxDone(void)
{
   USBD12_ReadLastTransactionStatus(5);
}


⌨️ 快捷键说明

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