州周立功单片机发展有限公司Te:(020)3873097638730977Fax:38730925htpr/w outport(DI2 EVAL PORT O, val) last val= val #endif 中断服务程序一sR.c 这部分代码处理由 PDIUSBD2产生的中断。它将数据从 PDIUSBD12的内部FIFO取回到CPU存储 器并建立正确的事件标志以通知主循环程序进行处理。 ∥ File name:ISRC ∥98/11/25 Added 1/O mode Main endpoints access (WK) #include <stdio. h> #ifdef C51 #include <reg51.h> / special function register declarations * #else #include d12ci h" #include" 100. h" extern void bus reset(void) extern void ep0_ redone( void) extern void main rxdone( void); extern void d ot vO ∥ Public static data 11
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 11 outportb(D12_EVAL_PORT_O, val); last_val = val; } #endif 中断服务程序 ISR.C 这部分代码处理由 PDIUSBD12 产生的中断 它将数据从 PDIUSBD12 的内部 FIFO 取回到 CPU 存储 器并建立正确的事件标志以通知主循环程序进行处理 /* //************************************************************************* // File Name: ISR.C // 98/11/25 Added I/O mode Main endpoints access. (WK) //************************************************************************* */ #include <stdio.h> #include <string.h> #ifdef __C51__ #include <reg51.h> /* special function register declarations */ #else #include <dos.h> #endif #include "epphal.h" #include "d12ci.h" #include "mainloop.h" #include "usb100.h" 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 //*************************************************************************
州周立功单片机发展有限公司Te:(020)3873097638730977Fax:38730925htpr/w extern CONTROL XFER ControlData; ISR static vars unsigned char idata GenEpBufEPI_ PACKET SIZE IO REQUEST idata ioRequest; unsigned long ClockTicks=0; void interrupt (OldUsblsr)o unsigned long Clocklsr =0 extern unsigned long dmaBufter, extern unsigned long ioBuffer; //V2.1 extern unsigned short ioSize, ioCount; //V2. timer isrO interrupt I DISABLE- ClockTicks++. gs. bits timer=1: ENAB DISABLEr ClockTicks++ bEPPflags. bits timer=1; (OldTimerlsrNO ENABLE: #ifdef C51
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 12 */ EPPFLAGS bEPPflags; /* Control endpoint TX/RX buffers */ extern CONTROL_XFER ControlData; /* ISR static vars */ unsigned char idata GenEpBuf[EP1_PACKET_SIZE]; IO_REQUEST idata ioRequest; unsigned long ClockTicks = 0; #ifndef __C51__ void interrupt (*OldTimerIsr)(); void interrupt (*OldUsbIsr)(); unsigned long ClockIsr = 0; extern unsigned long dmaBuffer; extern unsigned long ioBuffer; // V2.1 extern unsigned short ioSize, ioCount; // V2.1 #endif #ifdef __C51__ timer_isr() interrupt 1 { DISABLE; ClockTicks++; bEPPflags.bits.timer = 1; ENABLE; } #else void interrupt timer_isr(void) { DISABLE; ClockTicks++; bEPPflags.bits.timer = 1; (*OldTimerIsr)(); ENABLE; } #endif #ifdef __C51__
州周立功单片机发展有限公司Te:(020)3873097638730977Fax:38730925htpr/w DIS ENABLE terrupt usb isr( void Clocklsr= Clock Ticks DI2Eval outport(Oxo, 0x80); outport(0x20, 0x20); DI2Eval outport(0x80, 0x80) unsigned int I st bEPPflags bits st=DI2_ ReadInterruptRegisterO ifi st I=0)4 if(i st DI2 INT BUSRESET)& bEPPflags bits bus reset= 1 else i f( st DI2 INT EOT dma eoto if(i st D12 INT SUSPENDCHANGE) bEPPflags bits suspend =1 if(i st DI2 INT ENDPOIN) p0 txdone(: f( st DI2 INT ENDPOOUT)
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 13 usb_isr() interrupt 0 { DISABLE; fn_usb_isr(); ENABLE; } #else void interrupt usb_isr(void) { ClockIsr = ClockTicks; D12Eval_outportb(0x0, 0x80); fn_usb_isr(); outportb(0x20, 0x20); D12Eval_outportb(0x80, 0x80); } #endif 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(); bEPPflags.bits.bus_reset = 1; } else { 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)
州周立功单片机发展有限公司Te:(020)3873097638730977Fax:38730925htpr/w redone( if(i st DI2 INT ENDPlIN) if(i st D12 INT ENDPIOUT) idoneo: if(i st& D12 INT ENDP2IN) if(i st D12 INT ENDP2OUT) bEPPflags bits in void bus reset( void) unsigned char ep last, i; ep last=D12 ReadLast Transaction Status(0); / Clear interrupt flag if(ep last D2 SETUPPACKET)i ControlData lEngth=0 ControlData wCount=0 if( D12_ Read Endpoint(o, (unsigned char")&(ControlData. DeviceRequest) sizeof( ControlData. DeviceRequest))I= sizeof(DE VICE REQUEST))i DI2 Set Endpointstatus(0, 1); bEPPflags,bitscontrol_state=USB_IDLE, ControlData. DeviceRequest wIndex= SWAP(ControlData. DeviceRequest. wIndex); ControlData. DeviceRequest lEngth=SWAP(ControlData Device Request. wLength);
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 14 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; } void bus_reset(void) { } void ep0_rxdone(void) { unsigned char 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, (unsigned char *)(&(ControlData.DeviceRequest)), sizeof(ControlData.DeviceRequest)) != sizeof(DEVICE_REQUEST) ) { D12_SetEndpointStatus(0, 1); D12_SetEndpointStatus(1, 1); bEPPflags.bits.control_state = USB_IDLE; return; } #ifdef __C51__ ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue); ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex); ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
州周立功单片机发展有限公司Te:(020)3873097638730977Fax:38730925htpr/w #endif // Acknowledge setup here to unlock in/out endp D12_ Acknowledge Endpoint( 1); ControlData lEngth= ControlData. DeviceRequest. lEngth, ControlData w Count=0 ControlData Device Request. bmRequest Type &(unsigned char)USB ENDPOINT DIRECTION MASK) bEPPflags bi up packe bEPPflags bits control state= USB IDLE; if( ControlData. DeviceRequest lEngth=0)& bEPPflags bits setup_packet=1 bEPPflags bits control state= USB IDLE. / set command· else i if( ControlData. DeviceRequest wLength MAX CONTROLDATA SIZE)( bEPPflags. bits control state= USB IDLE. DI2 Set tatus(, 1) D12 SetEndpointStatus(1, 1); else i bEPPflags bits control state USB RECEIVE; et command with OUT token ∥ else set command ∥ if setup packet else if (bEPPflags bits control state = USB RECEIVE)( DI2 Read Endpoint(o, Control Data. dataBuffer+ ControlData wCount, EPO PACKET SIZE) ControlData wCount +=i if il= EPO PACKET SIZE I ControlData wCount >=ControlData. wLength)i bEPPflags. bits, setup_packet bEPPflags bits control state= USB IDLE; 15
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com 15 #endif // Acknowledge setup here to unlock in/out endp 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_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, ControlData.dataBuffer + ControlData.wCount, EP0_PACKET_SIZE); ControlData.wCount += i; if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) { bEPPflags.bits.setup_packet = 1; bEPPflags.bits.control_state = USB_IDLE; } }