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

📄 sl811.c

📁 优盘读写子程序,芯片是SL811
💻 C
📖 第 1 页 / 共 2 页
字号:
        asm{stb i,usb_address_reg;}
        asm{ldb i,#0x40;}
        asm{stb i,usb_data_reg;}
        asm{ldb i,#usb_a_address;}
        asm{stb i,usb_address_reg;}
        asm{ldb i,#usb_internal_buffer_1;}
        asm{stb i,usb_data_reg;}

        do
        {
                FreshExternalWatchdog();
                usb_address_reg=usb_a_control;
                usb_data_reg=UsbCmd^DATA0_RD;
                do
                {
                        if(++cout1==0)return FALSE;             //timerout
                        usb_address_reg=usb_interrupt_status;
                }while(!(usb_data_reg&0x01));
                ClearUsbInterruptStatus();
                usb_address_reg=usb_a_status;
                i=usb_data_reg;
                if(i&0x02)return FALSE;              //error detection in transmisson
                if(i&0x04)return FALSE;              //time out occurred
                if(i&0x20)return FALSE;              //overflow
                if(i&0x01)
                {
                        UsbCmd^=0x40;
                        usb_address_reg=usb_a_counter;
                        i=usb_data_reg;
                        i=0x40-i;
                        UsbBufferRead(i,usb_internal_buffer_1,usbdatabufferpointer);
                        usbdatabufferpointer+=i;
                        if((usbtransleft-=(WORD)i)<=0)
                        {
                                if(!(UsbCmd&0x40))return TRUE;
                                asm{ldb i,#usb_a_pid;}
                                asm{stb i,usb_address_reg;}
                                asm{ldb i,#PID_OUT;}
                                asm{stb i,usb_data_reg;}
                                asm{ldb i,#usb_a_device_address;}
                                asm{stb i,usb_address_reg;}
                                asm{ldb i,usbdev;}
                                asm{stb i,usb_data_reg;}
                                asm{ldb i,#usb_a_xferlen;}
                                asm{stb i,usb_address_reg;}
                                asm{stb 0,usb_data_reg;}
                                usb_address_reg=usb_a_control;
                                usb_data_reg=UsbCmd^DATA0_WR;
                                UsbCmd^=0x40;
                                return TRUE;
                        }
                }
        }while(++cout0<3000);
        return FALSE;
}

//return: FALSE-        失败
//        TRUE-         成功
BYTE UsbSendoutData(register BYTE usbendpoint,
                    BYTE usbdev,
                    BYTE *usbdatabufferpointer,
                    WORD usbtransleft)
{
        register BYTE i,j;
        WORD cout0=0,cout1=0;

        asm{ldb i,#usb_a_pid;}
        asm{stb i,usb_address_reg;}
        asm{addb i,usbendpoint,#PID_OUT;}
        asm{stb i,usb_data_reg;}
        asm{ldb i,#usb_a_device_address;}
        asm{stb i,usb_address_reg;}
        asm{ldb i,usbdev;}
        asm{stb i,usb_data_reg;}
        asm{ldb i,#usb_a_xferlen;}
        asm{stb i,usb_address_reg;}
        asm{ldb i,#0x40;}
        asm{stb i,usb_data_reg;}
        asm{ldb i,#usb_a_address;}
        asm{stb i,usb_address_reg;}
        asm{ldb i,#usb_internal_buffer_1;}
        asm{stb i,usb_data_reg;}

        do
        {
                FreshExternalWatchdog();
                UsbBufferWrite(0x40,usb_internal_buffer_1,usbdatabufferpointer);
                usb_address_reg=usb_a_control;
                usb_data_reg=UsbCmd^DATA0_WR;
                do
                {
                        if(++cout1==0)return FALSE;             //timerout
                        usb_address_reg=usb_interrupt_status;
                }while(!(usb_data_reg&0x01));
                ClearUsbInterruptStatus();
                usb_address_reg=usb_a_status;
                i=usb_data_reg;
                if(i&0x02)return FALSE;              //error detection in transmisson
                if(i&0x04)return FALSE;              //time out occurred
                if(i&0x20)return FALSE;              //overflow
                if(i&0x01)
                {
                        UsbCmd^=0x40;
                        usbdatabufferpointer+=0x40;
                        if((usbtransleft-=0x40)<=0)
                        {
                                if(!(UsbCmd&0x40))return TRUE;
                                asm{ldb i,#usb_a_pid;}
                                asm{stb i,usb_address_reg;}
                                asm{ldb i,#PID_OUT;}
                                asm{stb i,usb_data_reg;}
                                asm{ldb i,#usb_a_device_address;}
                                asm{stb i,usb_address_reg;}
                                asm{ldb i,usbdev;}
                                asm{stb i,usb_data_reg;}
                                asm{ldb i,#usb_a_xferlen;}
                                asm{stb i,usb_address_reg;}
                                asm{stb 0,usb_data_reg;}
                                usb_address_reg=usb_a_control;
                                usb_data_reg=UsbCmd^DATA0_WR;
                                UsbCmd^=0x40;
                                return TRUE;
                        }
                }
        }while(++cout0<3000);
        return FALSE;
}

//用SETUP包发送一个请求,并输入请求的结果
//return: FALSE-        失败
//        TRUE-         成功
BYTE UsbSetupIn(BYTE usbdev,BYTE *usbdatabufferpointer,WORD usbtransleft)
{
        if(UsbSendCmd(PID_SETUP,0x00,usbdev))
        {
                ClearUsbInterruptStatus();
                UsbCmd^=0x40;
                return UsbGetinData(0x00,usbdev,usbdatabufferpointer,usbtransleft);
        }
        return FALSE;
}

//对输入的USB设备进行描述符读取工作
//return: FALSE-        失败
//        TRUE-         成功
BYTE UsbGetDescriptor(void)
{
        SetupPacket.usb_setup_bmRequest=0x80;
        SetupPacket.usb_setup_bRequest=GET_DESCRIPTOR;
        SetupPacket.usb_setup_wValue=DEVICE;
        SetupPacket.usb_setup_wIndex=0x00;
        SetupPacket.usb_setup_wLength=0x40;
        return UsbSetupIn(0x00,(BYTE*)&UsbDataBuffer,0x10);
}

//对插入的USB设备进行设置地址工作
//return: FALSE-        失败
//        TRUE-         成功
BYTE UsbSetAddress(void)
{
        SetupPacket.usb_setup_bmRequest=0x00;
        SetupPacket.usb_setup_bRequest=SET_ADDRESS;
        SetupPacket.usb_setup_wValue=NEW_DEVICE_ADDRESS;
        SetupPacket.usb_setup_wIndex=0x00;
        SetupPacket.usb_setup_wLength=0x00;
        if(!UsbSetupIn(0x00,(BYTE*)&UsbDataBuffer,0x00))return FALSE;

        SetupPacket.usb_setup_bmRequest=0x80;
        SetupPacket.usb_setup_bRequest=GET_DESCRIPTOR;
        SetupPacket.usb_setup_wValue=DEVICE;
        SetupPacket.usb_setup_wIndex=0x00;
        SetupPacket.usb_setup_wLength=0x12;
        if(!UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x12))return FALSE;

        SetupPacket.usb_setup_bmRequest=0x80;
        SetupPacket.usb_setup_bRequest=GET_DESCRIPTOR;
        SetupPacket.usb_setup_wValue=CONFIGURATION;
        SetupPacket.usb_setup_wIndex=0x00;
        SetupPacket.usb_setup_wLength=0x09;
        if(!UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x09))return FALSE;

        SetupPacket.usb_setup_bmRequest=0x80;
        SetupPacket.usb_setup_bRequest=GET_DESCRIPTOR;
        SetupPacket.usb_setup_wValue=CONFIGURATION;
        SetupPacket.usb_setup_wIndex=0x00;
        SetupPacket.usb_setup_wLength=0xff;
        if(!UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x20))return FALSE;

        SetupPacket.usb_setup_bmRequest=0x80;
        SetupPacket.usb_setup_bRequest=GET_DESCRIPTOR;
        SetupPacket.usb_setup_wValue=DEVICE;
        SetupPacket.usb_setup_wIndex=0x00;
        SetupPacket.usb_setup_wLength=0x12;
        if(!UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x12))return FALSE;

        SetupPacket.usb_setup_bmRequest=0x80;
        SetupPacket.usb_setup_bRequest=GET_DESCRIPTOR;
        SetupPacket.usb_setup_wValue=CONFIGURATION;
        SetupPacket.usb_setup_wIndex=0x00;
        SetupPacket.usb_setup_wLength=0x89;
        return UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x20);
}

//对插入的USB设备进行接口读取工作
//return: FALSE-        失败
//        TRUE-         成功
BYTE UsbGetInterface(void)
{
        SetupPacket.usb_setup_bmRequest=0xc2;
        SetupPacket.usb_setup_bRequest=0x10;
        SetupPacket.usb_setup_wValue=0x00;
        SetupPacket.usb_setup_wIndex=0x00;
        SetupPacket.usb_setup_wLength=0x1f;
        return UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x1f);
}

//对插入的USB设备进行接口配置工作
//return: FALSE-        失败
//        TRUE-         成功
BYTE UsbSetConfig(void)
{
        SetupPacket.usb_setup_bmRequest=0x00;
        SetupPacket.usb_setup_bRequest=0x09;
        SetupPacket.usb_setup_wValue=0x01;
        SetupPacket.usb_setup_wIndex=0x00;
        SetupPacket.usb_setup_wLength=0x00;
        return UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x00);
}

//读出优盘的状态
//return: FALSE                 失败
//        TRUE                  成功
//优盘状态UsbDataBuff[0]=0      故障
//        UsbDataBuff[0]=1      正常
BYTE UsbGetDiskStatus(void)
{
        SetupPacket.usb_setup_bmRequest=0xc2;
        SetupPacket.usb_setup_bRequest=0x14;
        SetupPacket.usb_setup_wValue=0x00;
        SetupPacket.usb_setup_wIndex=0x00;
        SetupPacket.usb_setup_wLength=0x01;
        return UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x01);
}

//读出优盘的写保护状态
//return: FALSE                 失败
//        TRUE                  成功
//优盘状态UsbDataBuff[0]=0      无写保护
//        UsbDataBuff[0]=1      有写保护
BYTE UsbGetDiskProtect(void)
{
        SetupPacket.usb_setup_bmRequest=0xc2;
        SetupPacket.usb_setup_bRequest=0x15;
        SetupPacket.usb_setup_wValue=0x00;
        SetupPacket.usb_setup_wIndex=0x00;
        SetupPacket.usb_setup_wLength=0x01;
        return UsbSetupIn(NEW_DEVICE_ADDRESS,(BYTE*)&UsbDataBuffer,0x01);
}

//读出优盘数据
//return: FALSE                 失败
//        TRUE                  成功
BYTE UsbGetDiskData(WORD usbdisksectorbegin,WORD usbdisksectorcount)
{

        SetupPacket.usb_setup_bmRequest=0x42;
        SetupPacket.usb_setup_bRequest=0x11;
        SetupPacket.usb_setup_wValue=0x00;
        SetupPacket.usb_setup_wIndex=0x00;
        SetupPacket.usb_setup_wLength=0x08;
        if(!UsbSendCmd(PID_SETUP,0x00,NEW_DEVICE_ADDRESS))return FALSE;
        ClearUsbInterruptStatus();
        UsbCmd^=0x40;
        SetupPacket.usb_setup_bmRequest=usbdisksectorbegin;
        SetupPacket.usb_setup_bRequest=usbdisksectorbegin>>8;
        SetupPacket.usb_setup_wValue=0x00;
        SetupPacket.usb_setup_wIndex=usbdisksectorcount;
        SetupPacket.usb_setup_wLength=0x00;
        if(!UsbSendCmd(PID_OUT,0x00,NEW_DEVICE_ADDRESS))return FALSE;
        ClearUsbInterruptStatus();
        UsbGetinData(0x00,NEW_DEVICE_ADDRESS,(BYTE*)UsbDataBuffer,0);
        ClearUsbInterruptStatus();
        return UsbGetinData(0x02,NEW_DEVICE_ADDRESS,(BYTE*)UsbReceiveBuffer,usbdisksectorcount<<0x09);
}

⌨️ 快捷键说明

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