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

📄 isr.c

📁 USB鼠标,单片机的,可以
💻 C
字号:
#include "..\..\Driver\inc\includes.h"

#include "mainloop.h"
#include "usb100.h"

extern byte_count byte_cnt;

extern void bus_reset(void);

extern void ep0_txdone(void);
extern void ep0_rxdone(void);

extern void ep1_txdone(void);
extern void ep1_rxdone(void);

extern void main_txdone(void);
extern void main_rxdone(void);

extern void dma_eot(void);

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

extern EPPFLAGS bEPPflags;

/* Control endpoint TX/RX buffers */
extern CONTROL_XFER ControlData;

/* ISR static vars */
unsigned char  GenEpBuf[EP1_PACKET_SIZE];
unsigned char idata EpBuf[EP2_PACKET_SIZE];
IO_REQUEST idata ioRequest;
unsigned char ioSize, ioCount;
unsigned long ClockTicks = 0;

extern BOOL bNoRAM;


//USB中断处理
usb_isr() interrupt 0
{
	DISABLE;
	bEPPflags.bits.bUSB_Busy = 1;
//	fn_usb_isr();
	ENABLE;
}

//USB中断服务子程序
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) 
		{
			bus_reset();//USB总线服务
			bEPPflags.bits.bus_reset = 1;
		}

		if(i_st & D12_INT_EOT)
		{
			dma_eot();//DMA传输结束
		}
		if(i_st & D12_INT_SUSPENDCHANGE)
		{
			bEPPflags.bits.suspend = 1;//挂起改变
	   	}

		if(i_st & D12_INT_ENDP0IN)		//从主机的角度看为输入
		{
			ep0_txdone();//端点0IN中断
		}
		if(i_st & D12_INT_ENDP0OUT)
		{
			ep0_rxdone();//端点0OUT中断
		}
		if(i_st & D12_INT_ENDP1IN)
		{
			ep1_txdone();//端点1IN中断
		}
		if(i_st & D12_INT_ENDP1OUT)
		{
			ep1_rxdone();//端点1OUT中断
		}
		if(i_st & D12_INT_ENDP2IN)
		{
			main_txdone();//端点2IN中断
		}
		if(i_st & D12_INT_ENDP2OUT)
		{
			main_rxdone();//端点2OUT中断
		}
	}

	bEPPflags.bits.in_isr = 0;
	bEPPflags.bits.bUSB_Busy = 0;
//	ENABLE;
}

	sbit D12SUSPD	  = P3^3;

//总线复位处理子程序
void bus_reset(void)
{
	D12SUSPD = 1;

	ComShowString(1,"收到总线复位信号");
}

//DMA结束处理
void dma_eot(void)
{
}


//端点0OUT中断
//主机发,设备接收数据后的处理。
void ep0_rxdone(void)
{
	unsigned char ep_last, i;

	ep_last = D12_ReadLastTransactionStatus(0); //清中断标志

	if (ep_last & D12_SETUPPACKET) 
	{
		//接收到SETUP包
		ControlData.wLength = 0;
		ControlData.wCount = 0;

		if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
			(unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) 
		{
			//SETUP包出错,返回
			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);

		//对控制端点的输入/输出进行应答
		D12_AcknowledgeEndpoint(0);		//使缓冲区有效。
		D12_AcknowledgeEndpoint(1);

		ControlData.wLength = ControlData.DeviceRequest.wLength;
		ControlData.wCount = 0;
//当主机设置包为读取数据时,将状态切换成发送状态。
		if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) 
		{
			//从主机传输数据
			bEPPflags.bits.setup_packet = 1;
			bEPPflags.bits.control_state = USB_TRANSMIT;		/* 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 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)	//ControlData.wLength由第1包设置.
 		{
			//数据接收完毕
			bEPPflags.bits.setup_packet = 1;     //接收设置包完毕,
			bEPPflags.bits.control_state = USB_IDLE;
		}
	}
	else 
	{
		bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
	}
}

//端点0IN处理MC发送,主机接收.
void ep0_txdone(void)
{
	short i = ControlData.wLength - ControlData.wCount;
	D12_ReadLastTransactionStatus(1); //清中断标志位

	if (bEPPflags.bits.control_state != USB_TRANSMIT) 
		return;//非发送状态,返回

	if( i >= EP0_PACKET_SIZE) 
	{
		//剩下数据大于16字节,发送16字节
		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) 
	{
		//发送剩下数据 ,数据个数为i个.
		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); //发送完毕,发送0字节
		bEPPflags.bits.control_state = USB_IDLE;
	}
}



//端点1OUT处理
void ep1_txdone(void)
{
	D12_ReadLastTransactionStatus(3); //清中断标志位
}

//端点1IN处理
void ep1_rxdone(void)
{
	unsigned char len;

	len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
	if(len != 0)
		bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
	D12_ReadLastTransactionStatus(2); //清中断标志位

}

//主端点OUT控制
void main_txdone(void)
{
//	unsigned char len,epstatus;


	D12_ReadLastTransactionStatus(5); //清中断标志位

	//可添加用户代码(进行检测端点号5IN令牌的操作)
	if(byte_cnt.word>0)
	{
		if(byte_cnt.word<64)
		{
			D12_WriteEndpoint(5, byte_cnt.byte.low, EpBuf);
			byte_cnt.word=0;
		}
		else
		{
			byte_cnt.word=byte_cnt.word-64;
			D12_WriteEndpoint(5, 64, EpBuf);
		}
	}
}

//主端点IN控制
void main_rxdone(void)
{
	unsigned char len;					//,epstatus;

	D12_ReadLastTransactionStatus(4); //清中断标志位
	//接收数据
	len = D12_ReadEndpoint(4, 64, EpBuf);
//	epstatus=D12_ReadEndpointStatus(4);
//	epstatus &= 0x60;
//	if (epstatus == 0x60)
//		len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据

}


⌨️ 快捷键说明

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