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

📄 usb.txt

📁 全套USB开发源码!有需要的快
💻 TXT
📖 第 1 页 / 共 3 页
字号:
                    /* supporting upgrade to 16F877 */

    USB_Init();
    printf("PDIUSBD11 Ready for connection\n\r");
    while(1) 
 if (!RB0) D11GetIRQ(); /* If IRQ is Low, PDIUSBD11 has an Interrupt Condition */
    
}    

void USB_Init(void)
{
    unsigned char Buffer[2];

    /* Disable Hub Function in PDIUSBD11 */
    Buffer[0] = 0x00;
    D11CmdDataWrite(D11_SET_HUB_ADDRESS, Buffer, 1);

    /* Set Address to zero (default) and enable function */
    Buffer[0] = 0x80;
    D11CmdDataWrite(D11_SET_ADDRESS_ENABLE, Buffer, 1);

    /* Enable function generic endpoints */
    Buffer[0] = 0x02;
    D11CmdDataWrite(D11_SET_ENDPOINT_ENABLE, Buffer, 1);

    /* Set Mode - Enable SoftConnect */
    Buffer[0] = 0x97; /* Embedded Function, SoftConnect, Clk Run, No LazyClk, Remote Wakeup */
    Buffer[1] = 0x0B; /* CLKOut = 4MHz */
    D11CmdDataWrite(D11_SET_MODE, Buffer, 2);
}

void D11GetIRQ(void)
{
    unsigned short Irq;
    unsigned char Buffer[8];
    unsigned char count;
    unsigned char bytes;

    /* Read Interrupt Register to determine source of interrupt */

    D11CmdDataRead(D11_READ_INTERRUPT_REGISTER, (unsigned char *)&Irq, 2);

        // if (Irq) printf("Irq = 0x%X: ",Irq); 

        if (Irq & D11_INT_BUS_RESET) {
            printf("Bus Reset\n\r");
            USB_Init();
        }

        if (Irq & D11_INT_EP0_OUT) {
            printf("EP0_Out: ");
            Process_EP0_OUT_Interrupt();
        }

        if (Irq & D11_INT_EP0_IN) {
            printf("EP0_In: \n\r");
            if (CtlTransferInProgress == PROGRESS_ADDRESS) {
                D11CmdDataWrite(D11_SET_ADDRESS_ENABLE,&DeviceAddress,1);
                D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP0_IN, Buffer, 1);
                CtlTransferInProgress = PROGRESS_IDLE;
                }
            else {
                D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP0_IN, Buffer, 1);
                WriteBufferToEndPoint();
                }
        }

        if (Irq & D11_INT_EP1_OUT) {
            printf("EP1_OUT\n\r");
            D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP1_OUT, Buffer, 1);
            bytes = D11ReadEndpoint(D11_ENDPOINT_EP1_OUT, Buffer);
            for (count = 0; count < bytes; count++) {
               circularbuffer[inpointer++] = Buffer[count];
               if (inpointer >= MAX_BUFFER_SIZE) inpointer = 0;
              }
            loadfromcircularbuffer(); //Kick Start
        }
     
        if (Irq & D11_INT_EP1_IN) {
            printf("EP1_IN\n\r");
            D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP1_IN, Buffer, 1);
            loadfromcircularbuffer();
        }

        if (Irq & D11_INT_EP2_OUT) {
            printf("EP2_OUT\n\r");
            D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP2_OUT, Buffer, 1);
            Buffer[0] = 0x01; /* Stall Endpoint */
            D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + D11_ENDPOINT_EP2_OUT, Buffer, 1); 
        }

        if (Irq & D11_INT_EP2_IN) {
            printf("EP2_IN\n\r");
            D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP2_IN, Buffer, 1);
            Buffer[0] = 0x01; /* Stall Endpoint */
            D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + D11_ENDPOINT_EP2_IN, Buffer, 1); 
        }

        if (Irq & D11_INT_EP3_OUT) {
            printf("EP3_OUT\n\r");
            D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP3_OUT, Buffer, 1);
            Buffer[0] = 0x01; /* Stall Endpoint */
            D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + D11_ENDPOINT_EP3_OUT, Buffer, 1); 
        }

        if (Irq & D11_INT_EP3_IN) {
            printf("EP3_IN\n\r");
            D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP3_IN, Buffer, 1);
            Buffer[0] = 0x01; /* Stall Endpoint */
            D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + D11_ENDPOINT_EP3_IN, Buffer, 1); 
        }
}

void Process_EP0_OUT_Interrupt(void)
{
    unsigned long a;
    unsigned char Buffer[2];
    USB_SETUP_REQUEST SetupPacket;

    /* Check if packet received is Setup or Data - Also clears IRQ */
    D11CmdDataRead(D11_READ_LAST_TRANSACTION + D11_ENDPOINT_EP0_OUT, (char *)&SetupPacket, 1);

    if (SetupPacket.bmRequestType & D11_LAST_TRAN_SETUP) {

        /* This is a setup Packet - Read Packet */
        D11ReadEndpoint(D11_ENDPOINT_EP0_OUT, (char *)&SetupPacket);

        /* Acknowlegde Setup Packet to EP0_OUT & Clear Buffer*/
        D11CmdDataWrite(D11_ACK_SETUP, NULL, 0);
        D11CmdDataWrite(D11_CLEAR_BUFFER, NULL, 0);

        /* Acknowlegde Setup Packet to EP0_IN */
        D11CmdDataWrite(D11_ENDPOINT_EP0_IN, NULL, 0);
        D11CmdDataWrite(D11_ACK_SETUP, NULL, 0);

        /* Parse bmRequestType */
        switch (SetupPacket.bmRequestType & 0x7F) {

            case STANDARD_DEVICE_REQUEST:
                printf("Standard Device Request ");
                switch (SetupPacket.bRequest) {
                    case GET_STATUS:
                        /* Get Status Request to Device should return */
                        /* Remote Wakeup and Self Powered Status */
                        Buffer[0] = 0x01;
                        Buffer[1] = 0x00;
                        D11WriteEndpoint(D11_ENDPOINT_EP0_IN, Buffer, 2);
                        break;

                    case CLEAR_FEATURE:
                    case SET_FEATURE:
                        /* We don't support DEVICE_REMOTE_WAKEUP or TEST_MODE */
                        ErrorStallControlEndPoint();
                        break;

                    case SET_ADDRESS:
                        printf("Set Address\n\r");
                        DeviceAddress = SetupPacket.wValue | 0x80;
                        D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);
                        CtlTransferInProgress = PROGRESS_ADDRESS;
                        break;

                    case GET_DESCRIPTOR:
                        GetDescriptor(&SetupPacket);
                        break;
  
                    case GET_CONFIGURATION:
                        D11WriteEndpoint(D11_ENDPOINT_EP0_IN, &DeviceConfigured, 1);
                        break;

                    case SET_CONFIGURATION:
                        DeviceConfigured = SetupPacket.wValue & 0xFF;
                        D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);
                        if (DeviceConfigured) {
                            RB3 = 0;
                            printf("\n\r *** Device Configured *** \n\r");
                            }
                        else {
                            RB3 = 1; /* Device Not Configured */
                            printf("\n\r ** Device Not Configured *** \n\r");
                            }
                        break;

                    case SET_DESCRIPTOR:
                    default:
                        /* Unsupported - Request Error - Stall */
                        ErrorStallControlEndPoint();
                        break;

                }
                break;

            case STANDARD_INTERFACE_REQUEST:
                printf("Standard Interface Request\n\r");
                switch (SetupPacket.bRequest) {
                        
                    case GET_STATUS:
                        /* Get Status Request to Interface should return */
                        /* Zero, Zero (Reserved for future use) */
                        Buffer[0] = 0x00;
                        Buffer[1] = 0x00;
                        D11WriteEndpoint(D11_ENDPOINT_EP0_IN, Buffer, 2);
                        break;

                    case SET_INTERFACE:
                        /* Device Only supports default setting, Stall may be */
                        /* returned in the status stage of the request */
                        if (SetupPacket.wIndex == 0 && SetupPacket.wValue == 0)  
                            /* Interface Zero, Alternative Setting = 0 */
                            D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);     
                        else ErrorStallControlEndPoint();
                        break;

                    case GET_INTERFACE:
                        if (SetupPacket.wIndex == 0) { /* Interface Zero */
                            Buffer[0] = 0; /* Alternative Setting */
                            D11WriteEndpoint(D11_ENDPOINT_EP0_IN, Buffer, 1);
                            break;
   } /* else fall through as RequestError */

                    //case CLEAR_FEATURE:
                    //case SET_FEATURE:
                        /* Interface has no defined features. Return RequestError */
                    default:
                        ErrorStallControlEndPoint();
                        break;

                }
                break;

            case STANDARD_ENDPOINT_REQUEST:
                printf("Standard Endpoint Request\n\r");
                switch (SetupPacket.bRequest) {

                    case CLEAR_FEATURE:
                    case SET_FEATURE:
                        /* Halt(Stall) feature required to be implemented on all Interrupt and */
                        /* Bulk Endpoints. It is not required nor recommended on the Default Pipe */
                          
                        if (SetupPacket.wValue == ENDPOINT_HALT)
                        {
                            if (SetupPacket.bRequest == CLEAR_FEATURE) Buffer[0] = 0x00;
                            else                                       Buffer[0] = 0x01;
                            switch (SetupPacket.wIndex & 0xFF) {
                                case 0x01 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \
                                              D11_ENDPOINT_EP1_OUT, Buffer, 1);
                                            break;
                                case 0x81 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \
                                              D11_ENDPOINT_EP1_IN, Buffer, 1);
                                            break;
                                case 0x02 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \
                                              D11_ENDPOINT_EP2_OUT, Buffer, 1);
                                            break;
                                case 0x82 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \
                                              D11_ENDPOINT_EP2_IN, Buffer, 1);
                                            break;
                                case 0x03 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \
                                              D11_ENDPOINT_EP3_OUT, Buffer, 1);
                                            break;
                                case 0x83 : D11CmdDataWrite(D11_SET_ENDPOINT_STATUS + \
                                              D11_ENDPOINT_EP3_IN, Buffer, 1);
                                            break;
                                default   : /* Invalid Endpoint - RequestError */
                                            ErrorStallControlEndPoint();
                                            break;
                            }
                            D11WriteEndpoint(D11_ENDPOINT_EP0_IN, NULL, 0);
                        } else {
                            /* No other Features for Endpoint - Request Error */
                            ErrorStallControlEndPoint();
                        }
                        break;

                    case GET_STATUS:
                        /* Get Status Request to Endpoint should return */
                        /* Halt Status in D0 for Interrupt and Bulk */
                        switch (SetupPacket.wIndex & 0xFF) {
                            case 0x01 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \
                                          D11_ENDPOINT_EP1_OUT, Buffer, 1);
                                        break;
                            case 0x81 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \
                                          D11_ENDPOINT_EP1_IN, Buffer, 1);
                                        break;
                            case 0x02 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \
                                          D11_ENDPOINT_EP2_OUT, Buffer, 1);
                                        break;
                            case 0x82 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \
                                          D11_ENDPOINT_EP2_IN, Buffer, 1);
                                        break;
                            case 0x03 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \
                                          D11_ENDPOINT_EP3_OUT, Buffer, 1);
                                        break;
                            case 0x83 : D11CmdDataRead(D11_READ_ENDPOINT_STATUS + \
                                          D11_ENDPOINT_EP3_IN, Buffer, 1);
                                        break;
                            default   : /* Invalid Endpoint - RequestError */

⌨️ 快捷键说明

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