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

📄 usbcore.lst

📁 单片机上实现U盘功能
💻 LST
📖 第 1 页 / 共 4 页
字号:
 245           0x03, //字符串描述符
 246           //0x0409为美式英语的ID
 247           0x09,
 248           0x04
 249          };
 250          ////////////////////////语言ID完毕//////////////////////////////////
 251          
 252          /**************************************************/
 253          /*********        本转换结果来自         **********/
 254          /********* Http://computer00.21ic.org    **********/
 255          /*********        作者: 电脑圈圈         **********/
 256          /*********         欢迎大家使用          **********/
 257          /*********    版权所有,盗版请写明出处   **********/
 258          /**************************************************/
 259          
 260          //http://computer00.21ic.org/user1/2198/archives/2007/42769.html
 261          //字符串“电脑圈圈的USB专区 Http://group.ednchina.com/93/”的Unicode编码
 262          //8位小端格式
 263          code uint8 ManufacturerStringDescriptor[82]={
 264          82,         //该描述符的长度为82字节
 265          0x03,       //字符串描述符的类型编码为0x03
 266          0x35, 0x75, //电
 267          0x11, 0x81, //脑
 268          0x08, 0x57, //圈
 269          0x08, 0x57, //圈
 270          0x84, 0x76, //的
 271          0x55, 0x00, //U
 272          0x53, 0x00, //S
 273          0x42, 0x00, //B
 274          0x13, 0x4e, //专
 275          0x3a, 0x53, //区
 276          0x20, 0x00, // 
 277          0x48, 0x00, //H
 278          0x74, 0x00, //t
 279          0x74, 0x00, //t
 280          0x70, 0x00, //p
 281          0x3a, 0x00, //:
 282          0x2f, 0x00, ///
 283          0x2f, 0x00, ///
 284          0x67, 0x00, //g
 285          0x72, 0x00, //r
 286          0x6f, 0x00, //o
 287          0x75, 0x00, //u
 288          0x70, 0x00, //p
 289          0x2e, 0x00, //.
 290          0x65, 0x00, //e
 291          0x64, 0x00, //d
 292          0x6e, 0x00, //n
 293          0x63, 0x00, //c
 294          0x68, 0x00, //h
 295          0x69, 0x00, //i
 296          0x6e, 0x00, //n
 297          0x61, 0x00, //a
 298          0x2e, 0x00, //.
 299          0x63, 0x00, //c
 300          0x6f, 0x00, //o
 301          0x6d, 0x00, //m
 302          0x2f, 0x00, ///
 303          0x39, 0x00, //9
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:19 PAGE 6   

 304          0x33, 0x00, //3
 305          0x2f, 0x00  ///
 306          };
 307          /////////////////////////厂商字符串结束/////////////////////////////
 308          
 309          //字符串“《圈圈教你玩USB》之 假U盘”的Unicode编码
 310          //8位小端格式
 311          code uint8 ProductStringDescriptor[32]={
 312          32,         //该描述符的长度为32字节
 313          0x03,       //字符串描述符的类型编码为0x03
 314          0x0a, 0x30, //《
 315          0x08, 0x57, //圈
 316          0x08, 0x57, //圈
 317          0x59, 0x65, //教
 318          0x60, 0x4f, //你
 319          0xa9, 0x73, //玩
 320          0x55, 0x00, //U
 321          0x53, 0x00, //S
 322          0x42, 0x00, //B
 323          0x0b, 0x30, //》
 324          0x4b, 0x4e, //之
 325          0x20, 0x00, // 
 326          0x47, 0x50, //假
 327          0x55, 0x00, //U
 328          0xd8, 0x76, //盘
 329          };
 330          ////////////////////////产品字符串结束////////////////////////////
 331          
 332          //字符串“2008-08-14”的Unicode编码
 333          //8位小端格式
 334          code uint8 SerialNumberStringDescriptor[22]={
 335          22,         //该描述符的长度为22字节
 336          0x03,       //字符串描述符的类型编码为0x03
 337          0x32, 0x00, //2
 338          0x30, 0x00, //0
 339          0x30, 0x00, //0
 340          0x38, 0x00, //8
 341          0x2d, 0x00, //-
 342          0x30, 0x00, //0
 343          0x38, 0x00, //8
 344          0x2d, 0x00, //-
 345          0x31, 0x00, //1
 346          0x34, 0x00  //4
 347          };
 348          //////////////////////产品序列号字符串结束/////////////////////////
 349          
 350          /********************************************************************
 351          函数功能:延时x毫秒函数。
 352          入口参数:x:延时的毫秒数。
 353          返    回:无。
 354          备    注:无。
 355          ********************************************************************/
 356          void DelayXms(uint16 x)                
 357          {
 358   1       uint16 i;
 359   1       uint16 j;
 360   1       for(i=0;i<x;i++)
 361   1       for(j=0;j<227;j++); //循环语句延时
 362   1      }
 363          ////////////////////////End of function//////////////////////////////
 364          
 365          /********************************************************************
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:19 PAGE 7   

 366          函数功能:USB断开连接函数。
 367          入口参数:无。
 368          返    回:无。
 369          备    注:无。
 370          ********************************************************************/
 371          void UsbDisconnect(void)
 372          {
 373   1      #ifdef DEBUG0
               Prints("断开USB连接。\r\n");
              #endif
 376   1       D12WriteCommand(D12_SET_MODE);  //写设置模式命令
 377   1       D12WriteByte(0x06); //设置模式的第一字节
 378   1       D12WriteByte(0x47); //设置模式的第二字节
 379   1       DelayXms(1000);  //延迟1秒
 380   1      }
 381          ////////////////////////End of function//////////////////////////////
 382          
 383          /********************************************************************
 384          函数功能:USB连接函数。
 385          入口参数:无。
 386          返    回:无。
 387          备    注:无。
 388          ********************************************************************/
 389          void UsbConnect(void)
 390          {
 391   1      #ifdef DEBUG0
               Prints("连接USB。\r\n");
              #endif
 394   1       D12WriteCommand(D12_SET_MODE);  //写设置模式命令
 395   1       D12WriteByte(0x16); //设置模式的第一字节
 396   1       D12WriteByte(0x47); //设置模式的第二字节
 397   1      }
 398          ////////////////////////End of function//////////////////////////////
 399          
 400          /********************************************************************
 401          函数功能:总线挂起中断处理函数。
 402          入口参数:无。
 403          返    回:无。
 404          备    注:无。
 405          ********************************************************************/
 406          void UsbBusSuspend(void)
 407          {
 408   1      #ifdef DEBUG0
               Prints("USB总线挂起。\r\n");
              #endif
 411   1      }
 412          ////////////////////////End of function//////////////////////////////
 413          
 414          /********************************************************************
 415          函数功能:总线复位中断处理函数。
 416          入口参数:无。
 417          返    回:无。
 418          备    注:无。
 419          ********************************************************************/
 420          void UsbBusReset(void)
 421          {
 422   1      #ifdef DEBUG0
               Prints("USB总线复位。\r\n");
              #endif
 425   1       Ep1InIsBusy=0; //复位后端点1输入缓冲区空闲。
 426   1       Ep2InIsBusy=0; //复位后端点2输入缓冲区空闲。
 427   1       TransportStage=COMMAND_STAGE; //复位后传输阶段为命令阶段。
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:19 PAGE 8   

 428   1      }
 429          ////////////////////////End of function//////////////////////////////
 430          
 431          /********************************************************************
 432          函数功能:根据pData和SendLength将数据发送到端点0的函数。
 433          入口参数:无。
 434          返    回:无。
 435          备    注:无。
 436          ********************************************************************/
 437          void UsbEp0SendData(void)
 438          {
 439   1       //将数据写到端点中去准备发送
 440   1       //写之前要先判断一下需要发送的数据是否比端点0
 441   1       //最大长度大,如果超过端点大小,则一次只能发送
 442   1       //最大包长的数据。端点0的最大包长在DeviceDescriptor[7]
 443   1       if(SendLength>DeviceDescriptor[7])
 444   1       {
 445   2        //按最大包长度发送
 446   2        D12WriteEndpointBuffer(1,DeviceDescriptor[7],pSendData);
 447   2        //发送后剩余字节数减少最大包长
 448   2        SendLength-=DeviceDescriptor[7];
 449   2        //发送一次后指针位置要调整
 450   2        pSendData+= DeviceDescriptor[7];
 451   2       }
 452   1       else
 453   1       {
 454   2        if(SendLength!=0)
 455   2        {
 456   3         //不够最大包长,可以直接发送
 457   3         D12WriteEndpointBuffer(1,SendLength,pSendData);
 458   3         //发送完毕后,SendLength长度变为0
 459   3         SendLength=0;
 460   3        }
 461   2        else //如果要发送的数据包长度为0
 462   2        {
 463   3         if(NeedZeroPacket==1) //如果需要发送0长度数据
 464   3         {
 465   4          D12WriteEndpointBuffer(1,0,pSendData); //发送0长度数据包
 466   4          NeedZeroPacket=0; //清需要发送0长度数据包标志
 467   4         }
 468   3        }
 469   2       }
 470   1      }
 471          ////////////////////////End of function//////////////////////////////
 472          
 473          /********************************************************************
 474          函数功能:端点0输出中断处理函数。
 475          入口参数:无。
 476          返    回:无。
 477          备    注:无。
 478          ********************************************************************/
 479          void UsbEp0Out(void)
 480          {
 481   1      #ifdef DEBUG0
               Prints("USB端点0输出中断。\r\n");
              #endif
 484   1       //读取端点0输出最后传输状态,该操作清除中断标志
 485   1       //并判断第5位是否为1,如果是,则说明是建立包
 486   1       if(D12ReadEndpointLastStatus(0)&0x20)
 487   1       {
 488   2        D12ReadEndpointBuffer(0,16,Buffer); //读建立过程数据
 489   2        D12AcknowledgeSetup(); //应答建立包
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:19 PAGE 9   

 490   2        D12ClearBuffer(); //清缓冲区
 491   2        //将缓冲数据填到设备请求的各字段中
 492   2        bmRequestType=Buffer[0];
 493   2        bRequest=Buffer[1];
 494   2        wValue=Buffer[2]+(((uint16)Buffer[3])<<8);
 495   2        wIndex=Buffer[4]+(((uint16)Buffer[5])<<8);
 496   2        wLength=Buffer[6]+(((uint16)Buffer[7])<<8);
 497   2        //下面的代码判断具体的请求,并根据不同的请求进行相关操作

⌨️ 快捷键说明

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