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接收到数据 }