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

📄 isr.c

📁 C8051FTest.rar 是C8051F系列处理器的基本测试程序
💻 C
字号:
#include <c8051f120.h>
#include <d12interface.h>
#include <usb.h>

CONTROL_XFER ControlData;

#define D12_SETUPPACKET_MASK	0x20

u8 Ep2OutLen;	//len of ep2 out data
bool Ep2SendBufferFul = false;	//ep2 send buffer has data to send

/* ep0 out interrupt */
void ep0_out()
{
	u8 ret, i;
 	ret = D12_ReadLastTransactionStatus(D12_EPCTLOUT);
	if (ret & D12_SETUPPACKET_MASK)
	{//setup packet
		ControlData.wLength = 0;
		ControlData.wCount = 0;
		if( D12_ReadEndpointBuffer(0, (u8 *)(&(ControlData.DevRequest)),
			sizeof(ControlData.DevRequest)) != sizeof(DEVICE_REQUEST) ) 
		{
			//wrong setup packet, set ep0 to stall
			D12_SetEndpointStatus(0, 1);
			D12_SetEndpointStatus(1, 1);
			bEppflags.flags.control_state = USB_IDLE;
			return;
		}

		//u16 data must be swap because d12 & c51 has different byte order
		ControlData.DevRequest.wValue = SWAP(ControlData.DevRequest.wValue);
		ControlData.DevRequest.wIndex = SWAP(ControlData.DevRequest.wIndex);
		ControlData.DevRequest.wLength = SWAP(ControlData.DevRequest.wLength);

		// Acknowledge setup here to unlock in/out endp
		D12_AcknowledgeEndpoint(0);
		D12_AcknowledgeEndpoint(1);
		ControlData.wLength = ControlData.DevRequest.wLength;
		ControlData.wCount = 0;
		if (ControlData.DevRequest.bmRequestType & USB_ENDPOINT_DIRECTION_MASK)
		{//device send data to pc
			bEppflags.flags.setup_packet = 1;
			bEppflags.flags.control_state = USB_TRANSMIT; //USB_IDLE;/* get command */
			//control_handler();
		}
		else 
		{
			if (ControlData.DevRequest.wLength == 0) 
			{
				bEppflags.flags.setup_packet = 1;
				bEppflags.flags.control_state = USB_IDLE; /* set command */
			}
			else 
			{
				if(ControlData.DevRequest.wLength > MAX_CONTROLDATA_SIZE) 
				{
					bEppflags.flags.control_state = USB_IDLE;
					D12_SetEndpointStatus(0, 1);
					D12_SetEndpointStatus(1, 1);
				}
				else
				{
					bEppflags.flags.control_state = USB_RECEIVE; /* set command with OUT
				token */
				}
			} // set command with data
		} // else set command
		// if setup packet
	}
	else if (bEppflags.flags.control_state == USB_RECEIVE) 
	{
		i = D12_ReadEndpointBuffer(0,
			ControlData.buffer + ControlData.wCount,	
			EP0_PACKET_SIZE);
		ControlData.wCount += i;
		if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) 
		{
			//data received over
			bEppflags.flags.setup_packet = 1;
			bEppflags.flags.control_state = USB_IDLE;
		}
	}
	else
	{
		bEppflags.flags.control_state = USB_IDLE;
	}
}


void ep0_in()
{
	short i = ControlData.wLength - ControlData.wCount;
	D12_ReadLastTransactionStatus(1); // Clear interrupt flag
	if (bEppflags.flags.control_state != USB_TRANSMIT)
		return;
	if( i >= EP0_PACKET_SIZE) {
		D12_WriteEndpointBuffer(1, ControlData.pData + ControlData.wCount, EP0_PACKET_SIZE);
		ControlData.wCount += EP0_PACKET_SIZE;
		bEppflags.flags.control_state = USB_TRANSMIT;
	}
	else if( i != 0) {
		D12_WriteEndpointBuffer(1, ControlData.pData + ControlData.wCount, i);
		ControlData.wCount += i;
		bEppflags.flags.control_state = USB_IDLE;
	}
	else if (i == 0){
		D12_WriteEndpointBuffer(1, 0, 0); // Send zero packet at the end ???
		bEppflags.flags.control_state = USB_IDLE;
	}
}


//ep1 in
void ep1_in(void)
{
	D12_ReadLastTransactionStatus(3); // Clear interrupt flag 
}

//ep1 out
void ep1_out(void)
{
	u8 len;
	D12_ReadLastTransactionStatus(2); // Clear interrupt flag 
	len = D12_ReadEndpointBuffer(2, Ep1Buf, EP1_PACKET_SIZE);
	if(len != 0)
		bEppflags.flags.ep1_out = 1;
}

//ep2 (main ep) in
void main_in()
{
	D12_ReadLastTransactionStatus(5);
	Ep2SendBufferFul = false;
}

//ep2 (main ep) out
void main_out()
{
	u8	epstatus;

	DISABLE_INTERRUPT;

	D12_ReadLastTransactionStatus(4);
	epstatus = D12_ReadEndpointStatus(4);
	epstatus &= 0x60;
	Ep2OutLen = D12_ReadEndpointBuffer(4, Ep2Buf, EP2_PACKET_SIZE);
	if (epstatus == 0x60)
		Ep2OutLen += D12_ReadEndpointBuffer(4, Ep2Buf+EP2_PACKET_SIZE, EP2_PACKET_SIZE);	//read double buf data
	if (Ep2OutLen != 0)
		bEppflags.flags.ep2_out = 1;
	else
		ENABLE_INTERRUPT;
}

/* external interrupt handle rounter */
void D12Int_Handler() interrupt 0
{
	u16 ret;

	bEppflags.flags.in_isr = 1;

	ret = D12_ReadInterruptRegister();
 	
	if (ret & 0x1) //control ep out
	{
		ep0_out();
	}
	if (ret & 0x2)	//control ep in
	{
		ep0_in();
	}	
	if (ret & 0x4)	//ep1 out
	{
		ep1_out();
	}	
	if (ret & 0x8)	//ep1 in
	{
		ep1_in();
	}	

	if (ret & 0x10)	//ep2 out
	{
		main_out();
	}	
	if (ret & 0x20)	//ep2 in
	{
		main_in();
	}
  
	if (ret & 0x40)	//system reset
	{
		bEppflags.flags.bus_reset = 1;
	}
	if (ret & 0x80)
	{
		bEppflags.flags.suspend = 1;	
	}

	bEppflags.flags.in_isr = 0;

}

⌨️ 快捷键说明

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