www.pudn.com > usb_softpack.zip > Isr.c


/* 
   //************************************************************************* 
   // 
   //                  		ZLGMCU 
   //				www.zlgmcu.com 
   // File Name:	ISR.C 
   // Revision:		V0.2(2002-04-08) 
   // Use library:  	USB51S.LIB 
   // Note:		USB51S.LIB不带DMA控制功能 
   //************************************************************************* 
   */ 
 
#include  
#include  
#include                 /* special function register declarations   */ 
#include "isr.h" 
#include "mainloop.h" 
 
/* 
//************************************************************************* 
//  Public static data 
//************************************************************************* 
*/ 
 
EPPFLAGS bEPPflags; 
CONTROL_XFER ControlData; 
 
/* ISR static vars */ 
unsigned char idata GenEpBuf[EP1_PACKET_SIZE]; 
unsigned char idata EpBuf[EP2_PACKET_SIZE]; 
IO_REQUEST idata ioRequest; 
 
//厂商请求入口地址 
code void (*VendorDeviceRequest[])(void) = 
{ 
	reserved, 
	reserved, 
	reserved, 
	reserved, 
	reserved, 
	reserved, 
	reserved, 
	reserved, 
	reserved, 
	reserved, 
	reserved, 
	reserved, 
	reserved, 
	reserved, 
	reserved, 
	reserved 
}; 
 
//USB总线重新连接(先断开,再连接)子程序 
void reconnect_USB(void) 
{ 
	unsigned long clk_cnt; 
	MCU_LED0 = 0;//亮LED显示(实际应用中可去掉) 
	MCU_LED1 = 0;//(实际应用中可去掉) 
 
	D12SUSPD = 0; 
	disconnect_USB(); 
	for (clk_cnt=0;clk_cnt<=0x9000;clk_cnt++) {} 
	connect_USB(); 
 
	MCU_LED0 = 1;//灭LED显示(实际应用中可去掉) 
	MCU_LED1 = 1;//(实际应用中可去掉) 
} 
 
//断开USB总线连接 
void disconnect_USB(void) 
{ 
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M); 
} 
 
//连接到USB总线 
void connect_USB(void) 
{ 
	DISABLE; 
	bEPPflags.value = 0; 
	ENABLE; 
	D12_SetDMA(0x0);//设置D12工作模式 
	D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M); 
} 
 
//总线复位中断服务子程序 
void bus_reset(void) 
{ 
//可添加用户代码(进行检测到总线复位的操作) 
} 
 
//DMA操作结束中断服务子程序 
void dma_eot(void) 
{ 
//可添加用户代码(进行检测DMA操作结束的操作) 
} 
 
//端点1输出中断操作 
void ep1_txdone(void) 
{ 
	D12_ReadLastTransactionStatus(3);//复位中断寄存器 
	//可添加用户代码(进行检测端点号3IN令牌的操作) 
} 
 
//端点1输入中断操作 
void ep1_rxdone(void) 
{ 
	unsigned char len; 
	D12_ReadLastTransactionStatus(2);//复位中断寄存器 
	len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取端点1接收数据 
	if (len != 0) 
		bEPPflags.bits.ep1_rxdone = 1;//标志端点1接收到数据 
} 
 
//端点2输出中断操作 
void ep2_txdone(void) 
{ 
	D12_ReadLastTransactionStatus(5);//复位中断寄存器 
	//可添加用户代码(进行检测端点号5IN令牌的操作) 
} 
 
//端点1输入中断操作 
void ep2_rxdone(void) 
{ 
	unsigned char len; 
	D12_ReadLastTransactionStatus(4);//复位中断寄存器 
	len = D12_ReadEndpoint(4, 64, EpBuf);//读取端点2接收数据 
	if (len != 0) 
		bEPPflags.bits.ep2_rxdone = 1;//标志端点1接收到数据 
}