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

📄 isr.c

📁 USB固件开发源程序,以单片机为核心,转贴的
💻 C
字号:
#include "reg52.h"               
#include "usb.h"
#include "string.h"
#include "stdio.h"

void bus_reset(void);

void ep0_txdone(void);//端点0发,0IN
void ep0_rxdone(void);//端点0收  0OUT
void ep1_txdone(void);//端点1发  1IN
void ep1_rxdone(void);//端点1收  1OUT
void main_txdone(void);//端点2发 2IN
void main_rxdone(void);//端点2收 2OUT

void dma_eot(void);

uchar xdata GenEpBuf[EP1_PACKET_SIZE]={0,0,0,0,0,0,0,0};  //8字节缓冲
uchar xdata EpBufIN[EP2_PACKET_SIZE];     //64字节缓冲,主端点发数据用.
uchar xdata EpBufOUT[EP2_PACKET_SIZE];		//同上,收数据用
//xdata IO_REQUEST ioRequest;                     //请求
//xdata uchar ioSize, ioCount;

xdata unsigned long ClockTicks = 0;

//uchar xdata MainEpBuf[256];             //数据缓冲


/*
void fn_usb_isr()
{
	unsigned int i_st;

	bEPPflags.bits.in_isr = 1;
	

	i_st = D12_ReadInterruptRegister();
	
	if(i_st != 0) {

		if(i_st & D12_INT_BUSRESET) {
			bEPPflags.bits.bus_reset = 1;
		}

		if(i_st & D12_INT_EOT)
			dma_eot();

		if(i_st & D12_INT_SUSPENDCHANGE)
			bEPPflags.bits.suspend = 1;

		
		if(i_st & D12_INT_ENDP0IN)
			ep0_txdone();
		if(i_st & D12_INT_ENDP0OUT)
			ep0_rxdone();
		if(i_st & D12_INT_ENDP1IN)
			ep1_txdone();
		if(i_st & D12_INT_ENDP1OUT)
			ep1_rxdone();
		if(i_st & D12_INT_ENDP2IN)
			main_txdone();
		if(i_st & D12_INT_ENDP2OUT)
			main_rxdone();
		
	}
	
	bEPPflags.bits.in_isr = 0;
	
}
*/
usb_isr() interrupt 2               //D12给51的中断
{
	unsigned int i_st;
	DISABLE;
//	fn_usb_isr();	
	bEPPflags.bits.in_isr = 1;
	i_st = D12_ReadInterruptRegister();
	
	if(i_st != 0) 
	{

		if(i_st & D12_INT_BUSRESET) 
		{
			bEPPflags.bits.bus_reset = 1;
		}

		if(i_st & D12_INT_EOT)
			dma_eot();

		if(i_st & D12_INT_SUSPENDCHANGE)
			bEPPflags.bits.suspend = 1;

		
		if(i_st & D12_INT_ENDP0IN)
			ep0_txdone();
		if(i_st & D12_INT_ENDP0OUT)
			ep0_rxdone();
		if(i_st & D12_INT_ENDP1IN)
			ep1_txdone();
		if(i_st & D12_INT_ENDP1OUT)
			ep1_rxdone();
		if(i_st & D12_INT_ENDP2IN)
			main_txdone();
		if(i_st & D12_INT_ENDP2OUT)
			main_rxdone();
		
	}
	
	bEPPflags.bits.in_isr = 0;
	ENABLE;
}
//void bus_reset(void)
//{
//}
void dma_eot(void)
{
}
//---------------------------------
void ep0_rxdone(void)                   //端点0接收,也是最复杂的部分,在这里,解出了全部的设备请求问题,并确立标志位
{										//在主循环中应答各个请求
	uchar ep_last, i;

	ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
	if (ep_last & D12_SETUPPACKET) 
	{

		ControlData.wLength = 0;
		ControlData.wCount = 0;
	
		if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
			(uchar *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) 
		{

			D12_SetEndpointStatus(0, 1);
			D12_SetEndpointStatus(1, 1);
			bEPPflags.bits.control_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
	//向控制输出端点发送应答建立命令以重新使能下一个建立阶段
		D12_AcknowledgeEndpoint(0);
		D12_AcknowledgeEndpoint(1);

		ControlData.wLength = ControlData.DeviceRequest.wLength;
		ControlData.wCount = 0;
	//需要证实控制传输是控制读还是写,如果是读:
	//如果控制传输是一个控制读类型那就是说器件需要在下一个数据阶段向
	//主机发回数据包.MCU需要设置一个标志以指示USB 设备现在正处于传输
	//模式即准备在主机发送请求时发送数据

		if (ControlData.DeviceRequest.bmRequestType & (uchar)USB_ENDPOINT_DIRECTION_MASK) 
		{
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.bits.control_state = USB_IDLE;		/* get command */
		}
	//如果是写
		else 
		{
			if (ControlData.DeviceRequest.wLength == 0) 
			{
				bEPPflags.bits.setup_packet = 1;
				bEPPflags.bits.control_state = USB_IDLE;		/* set command */
			}
			else 
			{
				if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) 
				{
					bEPPflags.bits.control_state = USB_IDLE;
					D12_SetEndpointStatus(0, 1);
					D12_SetEndpointStatus(1, 1);
				}
				else 
				{
					bEPPflags.bits.control_state = USB_RECEIVE;	/* set command with OUT token */
				}
			} // set command with data
		} // else set command
	} // if setup packet

	else if (bEPPflags.bits.control_state == USB_RECEIVE) 
	{
		i =	D12_ReadEndpoint(0, EP0_PACKET_SIZE,
			ControlData.dataBuffer + ControlData.wCount);

		ControlData.wCount += i;
		if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) 
		{
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.bits.control_state = USB_IDLE;
		}
	}

	else 
	{
		bEPPflags.bits.control_state = USB_IDLE;
	}

}

//----------------------------------
void ep0_txdone(void)      //EP0发送
{
	short i = ControlData.wLength - ControlData.wCount;
	char mistake;
	mistake=D12_ReadLastTransactionStatus(1); // Clear interrupt flag
	if (bEPPflags.bits.control_state != USB_TRANSMIT) 
		return;
	//-------------------------
	if( i >= EP0_PACKET_SIZE) 
	{
		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
		ControlData.wCount += EP0_PACKET_SIZE;

		bEPPflags.bits.control_state = USB_TRANSMIT;
	}
	else if( i != 0) 
	{
		D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
		ControlData.wCount += i;

		bEPPflags.bits.control_state = USB_IDLE;
	}
	else if (i == 0)
	{
		D12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ???

		bEPPflags.bits.control_state = USB_IDLE;
	}

}
//----------------------------------
void ep1_txdone(void)         
{
	uchar len;
	len=D12_ReadLastTransactionStatus(3); /* Clear interrupt flag *///因为这里用来做中断传输。。只需要清标志就可以

}

void ep1_rxdone(void)//ep1接收
{
	uchar len;

	len=D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */

	len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);

	if(len != 0)
		bEPPflags.bits.ep1_rxdone = 1;
}
//---------------------------------
void main_txdone(void)           //主端点发数据
{
	uchar len;

	len=D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */
}

void main_rxdone(void)    //主端点收数据
{
	uchar len;

	len=D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */
	DISABLE;
    usbDemo.main_len=D12_ReadEndpoint(4, 64, EpBufOUT);
	bEPPflags.bits.main_rxdone=1;
	ENABLE;
}

⌨️ 快捷键说明

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