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

📄 sl811.c

📁 优盘读写子程序,芯片是SL811
💻 C
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////
//初始化USB
void InitializeUsb(void)
{
        register BYTE i;

        asm{ldb i,#usb_csof_high;}
        asm{stb i,usb_address_reg;}
        asm{ldb i,#0xae;}
        asm{stb i,usb_data_reg;}
        UsbReset();
        asm{ldb i,#usb_csof_high;}
        asm{stb i,usb_address_reg;}
        asm{ldb i,#0xae;}
        asm{stb i,usb_data_reg;}
        asm{ldb i,#usb_csof_low;}
        asm{stb i,usb_address_reg;}
        asm{ldb i,#0xe0;}
        asm{stb i,usb_data_reg;}
        asm{ldb i,#usb_control_reg;}
        asm{stb i,usb_address_reg;}
        asm{stb 0,usb_data_reg;}
        asm{ldb i,#usb_interrupt_enable;}
        asm{stb i,usb_address_reg;}
        asm{stb 0,usb_data_reg;}
        ClearUsbInterruptStatus();
}

//复位USB
void UsbReset(void)
{
        usb_address_reg=usb_control_reg;
        usb_data_reg=0x08;                              //usb engine reset
        DelayMs(50);                                    //delay 50ms
        usb_address_reg=usb_control_reg;
        usb_data_reg=0x08;                              //usb engine reset
        DelayMs(50);                                    //delay 50ms
        UsbCmd=0;
}

//判别USB是否需要处理,对插入的USB设备进行初始化工作
//return: FALSE-        优盘未插入
//        TRUE-         优盘已插入
void UsbInsert(void)
{
        BYTE i;
        WORD data;

        usb_address_reg=usb_interrupt_status;
        i=usb_data_reg;
        if(i&0x20)
        {
                usb_address_reg=usb_interrupt_status;
                usb_data_reg=i;
                UsbReset();
                if(UsbDetectSpeed()==0xff){FlagUsbDisk=FALSE;return;}
                if(!UsbGetDescriptor()){FlagUsbDisk=FALSE;return;}
                if(!UsbSetAddress()){FlagUsbDisk=FALSE;return;}
                if(!UsbSetConfig()){FlagUsbDisk=FALSE;return;}
                if(!UsbGetInterface()){FlagUsbDisk=FALSE;return;}

                if((UsbDataBuffer[1]!=0x16)||
                   (UsbDataBuffer[2]!=0x0a)||
                   (UsbDataBuffer[3]!=0x11)||
                   (UsbDataBuffer[4]!=0x11)){FlagUsbDisk=FALSE;return;}
//读出容量,由于变量为BYTE,因此只能处理128M以下的优盘
                DiskParameter.DiskSpace=UsbDataBuffer[9];
//读出每一块扇区数,得到进行写入比较时的模
                DiskParameter.DiskBlockSize=(WORD)UsbDataBuffer[15]+(((WORD)UsbDataBuffer[16])<<8)-1;
//读BOOT区(0扇区)
                if(!UsbGetDiskData(0,1)){FlagUsbDisk=FALSE;return;}
//ROOT区起始扇区
                DiskParameter.DiskRootBegin=(((WORD)UsbReceiveBuffer[0x16])<<1)+1;
//控制块起始扇区
                DiskParameter.DiskDataBegin=(((WORD)UsbReceiveBuffer[0x11]+(((WORD)UsbReceiveBuffer[0x12])<<8))>>4)+
                                            DiskParameter.DiskRootBegin+0x06;
//读ROOT区
                if(!UsbGetDiskData(DiskParameter.DiskRootBegin,1)){FlagUsbDisk=FALSE;return;}
//比较文件名ETFY.dat
                if((UsbReceiveBuffer[0x20]!='E')||
                   (UsbReceiveBuffer[0x21]!='T')||
                   (UsbReceiveBuffer[0x22]!='F')||
                   (UsbReceiveBuffer[0x23]!='Y')){FlagUsbDisk=FALSE;return;}
//读入控制快
                if(!UsbGetDiskData(DiskParameter.DiskDataBegin,1)){FlagUsbDisk=FALSE;return;}
//测试校验和
                data=0;
                for(i=0;i!=255;i++)data+=(WORD)UsbReceiveBuffer[2*i]+(((WORD)UsbReceiveBuffer[2*i+1])<<8);
                if(data!=(WORD)UsbReceiveBuffer[510]+(((WORD)UsbReceiveBuffer[511])<<8)){FlagUsbDisk=FALSE;return;}
//读授权
                DiskParameter.ReadDiskAuthorize=UsbReceiveBuffer[0x49];
                DiskParameter.ChangeSystemParamAuthorize=UsbReceiveBuffer[0x8a];
                DiskParameter.ChangeAlarmParamAuthorize=UsbReceiveBuffer[0xae];
                DiskParameter.ChangeClearAuthorize=UsbReceiveBuffer[0x150];
                DiskParameter.ChangeChannelParamAuthorize=UsbReceiveBuffer[0x151];
                DiskParameter.ChangeReactiveParamAuthorize=UsbReceiveBuffer[0x152];

                DiskParameter.DiskFirstRecord=(WORD)UsbReceiveBuffer[0x20]+(((WORD)UsbReceiveBuffer[0x21])<<8);
                DiskParameter.DiskRecordSize=((WORD)UsbReceiveBuffer[0x22]+(((WORD)UsbReceiveBuffer[0x23])<<8))<<1;
                FlagUsbDisk=TRUE;
        }
}

//检测插入的USB设备工作速度
//return: 0xff-无设备
//        0x00-low
//        0x01-high
BYTE UsbDetectSpeed(void)
{
        register BYTE i,j;

        usb_address_reg=usb_csof_high;
        usb_data_reg=0xae;
        asm{ldb i,#usb_control_reg;}
        asm{stb i,usb_address_reg;}
        asm{ldb i,#0x48;}
        asm{stb i,usb_data_reg;}
        asm{ldb i,#usb_control_reg;}
        asm{stb i,usb_address_reg;}
        asm{ldb i,#0x00;}
        asm{stb i,usb_data_reg;}
        DelayMs(20);
        i=ClearUsbInterruptStatus();
        if(!(i&0x20))
        {
                usb_address_reg=usb_control_reg;
                usb_data_reg=0x00;
                return 0xff;                            //null
        }
        else if(!(i&0x80))
        {
                asm{ldb i,#usb_csof_high;}
                asm{stb i,usb_address_reg;}
                asm{ldb i,#0xee;}
                asm{stb i,usb_data_reg;}
                asm{ldb i,#usb_csof_low;}
                asm{stb i,usb_address_reg;}
                asm{ldb i,#0xe0;}
                asm{stb i,usb_data_reg;}
                asm{ldb i,#usb_control_reg;}
                asm{stb i,usb_address_reg;}
                asm{ldb i,#0x21;}
                asm{stb i,usb_data_reg;}
                j==0x00;                                //low speed
        }
        else
        {
                asm{ldb i,#usb_csof_high;}
                asm{stb i,usb_address_reg;}
                asm{ldb i,#0xae;}
                asm{stb i,usb_data_reg;}
                asm{ldb i,#usb_csof_low;}
                asm{stb i,usb_address_reg;}
                asm{ldb i,#0xe0;}
                asm{stb i,usb_data_reg;}
                asm{ldb i,#usb_control_reg;}
                asm{stb i,usb_address_reg;}
                asm{ldb i,#0x05;}
                asm{stb i,usb_data_reg;}
                j=0x01;                                 //high speed
        }
        asm{ldb i,#usb_a_pid;}
        asm{stb i,usb_address_reg;}
        asm{ldb i,#0x50;}
        asm{stb i,usb_data_reg;}
        asm{ldb i,#usb_a_device_address;}
        asm{stb i,usb_address_reg;}
        asm{stb 0,usb_data_reg;}
        asm{ldb i,#usb_a_control;}
        asm{stb i,usb_address_reg;}
        asm{ldb i,#0x01;}
        asm{stb i,usb_data_reg;}
        DelayMs(50);
        return j;
}

//清除USB中断状态寄存器
//return:中断状态寄存器的内容
BYTE ClearUsbInterruptStatus(void)
{
        register BYTE i;

        asm{ldb i,#usb_interrupt_status;}
        asm{stb i,usb_address_reg;}
        i=usb_data_reg;
        usb_address_reg=usb_interrupt_status;
        usb_data_reg=i;
        return i;
}

//批量写入USB缓冲区
//input: xbyte-         写入的字节数
//       usbaddress-    写入的usb缓冲区起始地址
//       address-       数据指针
void UsbBufferWrite(BYTE xbyte,BYTE usbaddress,BYTE *address)
{
        usb_address_reg=usbaddress;
        while(xbyte--)
        {
                usb_data_reg=*address++;
                DelayUs(2);
        }
}

//批量读出USB缓冲区
//input: xbyte-         读出的字节数
//       usbaddress-    读出的usb缓冲区起始地址
//       address-       数据指针
void UsbBufferRead(BYTE xbyte,BYTE usbaddress,BYTE *address)
{
        usb_address_reg=usbaddress;
        while(xbyte--)
        {
                *address++=usb_data_reg;
                DelayUs(2);
        }
}

//return: FALSE-        发送失败
//        TRUE-         发送成功
//when UsbSendSetupCmd,pid=PID_SETUP
//when UsbSendOUTCmd,pid=PID_OUT
BYTE UsbSendCmd(BYTE pid,register BYTE usbendpoint,BYTE usbdev)
{
        register BYTE i;
        WORD cout0=0,cout1=0;

        asm{ldb i,#usb_a_pid;}
        asm{stb i,usb_address_reg;}
        asm{addb i,usbendpoint,pid;}
        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,#0x08;}
        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;}
        UsbBufferWrite(0x08,usb_internal_buffer_1,(BYTE*)&SetupPacket);

        do
        {
                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&0x40)&&(pid==PID_OUT))return FALSE;       //NAK
                if(i&0x01)return TRUE;                          //success
        }while(++cout0<3000);
        return FALSE;
}

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

        asm{ldb i,#usb_a_pid;}
        asm{stb i,usb_address_reg;}
        asm{addb i,usbendpoint,#PID_IN;}
        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;}

⌨️ 快捷键说明

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