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

📄 usbcore.lst

📁 单片机上实现USB转串口程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:07 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE USBCORE
OBJECT MODULE PLACED IN UsbCore.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE UsbCore.c BROWSE DEBUG OBJECTEXTEND TABS(1)

stmt level    source

   1          /******************************************************************
   2             本程序只供学习使用,未经作者许可,不得用于其它任何用途
   3             
   4                  欢迎访问我的USB专区:http://group.ednchina.com/93/
   5                  欢迎访问我的blog:   http://www.ednchina.com/blog/computer00
   6                                       http://computer00.21ic.org
   7          
   8                  感谢PCB赞助商——电子园: http://bbs.cepark.com/
   9          
  10          UsbCore.c file
  11          
  12          作者:电脑圈圈
  13          建立日期: 2008.06.29
  14          修改日期: 2008.08.05
  15          版本:V1.1
  16          版权所有,盗版必究。
  17          Copyright(C) 电脑圈圈 2008-2018
  18          All rights reserved            
  19          *******************************************************************/
  20          
  21          #include "config.h"
  22          #include "pdiusbd12.h"
  23          #include "uart.h"
  24          #include "usbcore.h"
  25          
  26          idata uint8 Buffer[16];  //读端点0用的缓冲区
  27          
  28          
  29          //USB设备请求的各字段
  30          uint8  bmRequestType;
  31          uint8  bRequest;
  32          uint16 wValue;
  33          uint16 wIndex;
  34          uint16 wLength;
  35          //当前发送数据的位置
  36          uint8 * pSendData;
  37          //需要发送数据的长度
  38          uint16 SendLength;
  39          //是否需要发送0数据包的标志。在USB控制传输的数据过程中,
  40          //当返回的数据包字节数少于最大包长时,会认为数据过程结束。
  41          //当请求的字节数比实际需要返回的字节数长,而实际返回的字节
  42          //数又刚好是端点0大小的整数倍时,就需要返回一个0长度的数据包
  43          //来结束数据过程。因此这里增加一个标志,供程序决定是否需要返回
  44          //一个0长度的数据包。
  45          uint8 NeedZeroPacket;
  46          
  47          //当前的配置值。只有在设置非0配置后
  48          uint8 ConfigValue;
  49          
  50          //端点1缓冲是否忙的标志。当缓冲区中有数据时,该标志为真。
  51          //当缓冲区中空闲时,该标志为假。
  52          uint8 Ep1InIsBusy;
  53          
  54          //端点2缓冲是否忙的标志。当缓冲区中有数据时,该标志为真。
  55          //当缓冲区中空闲时,该标志为假。
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:07 PAGE 2   

  56          uint8 Ep2InIsBusy;
  57          
  58          //LineCoding数组,用来保存波特率、停止位等串口属性。
  59          //初始化波特率为9600,1停止位,无校验,8数据位。
  60          uint8 LineCoding[7]={0x80,0x25,0x00,0x00,0x00,0x00,0x08};
  61          
  62          //USB设备描述符的定义
  63          code uint8 DeviceDescriptor[0x12]=  //设备描述符为18字节
  64          {
  65          //bLength字段。设备描述符的长度为18(0x12)字节
  66           0x12,
  67           
  68          //bDescriptorType字段。设备描述符的编号为0x01
  69           0x01,
  70           
  71          //bcdUSB字段。这里设置版本为USB1.1,即0x0110。
  72          //由于是小端结构,所以低字节在先,即0x10,0x01。
  73           0x10,
  74           0x01,
  75           
  76          //bDeviceClass字段。本设备必须在设备描述符中指定设备的类型,
  77          //否则,由于在配置集合中有两个接口,就会被系统认为是一个USB
  78          //复合设备,从而导致设备工作不正常。0x02为通信设备类的类代码。
  79           0x02,
  80           
  81          //bDeviceSubClass字段。必须为0。
  82           0x00,
  83           
  84          //bDeviceProtocol字段。必须为0。
  85           0x00,
  86           
  87          //bMaxPacketSize0字段。PDIUSBD12的端点0大小的16字节。
  88           0x10,
  89           
  90          //idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
  91          //实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
  92          //注意小端模式,低字节在先。
  93           0x88,
  94           0x88,
  95           
  96          //idProduct字段。产品ID号,由于是第七个实验,我们这里取0x0007。
  97          //注意小端模式,低字节应该在前。
  98           0x07,
  99           0x00,
 100           
 101          //bcdDevice字段。取1.0版,即0x0100。
 102          //小端模式,低字节在先。
 103           0x00,
 104           0x01,
 105           
 106          //iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理,
 107          //字符串索引就从1开始。
 108           0x01,
 109          
 110          //iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
 111          //注意字符串索引值不要使用相同的值。
 112           0x02,
 113           
 114          //iSerialNumber字段。设备的序列号字符串索引值。
 115          //这里取3就可以了。
 116           0x03,
 117          
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:07 PAGE 3   

 118          //bNumConfigurations字段。该设备所具有的配置数。
 119          //我们只需要一种配置就行了,因此该值设置为1。
 120           0x01
 121          };
 122          //////////////////////////设备描述符完毕//////////////////////////////
 123          
 124          
 125          //USB配置描述符集合的定义
 126          //配置描述符总长度为9+9+9+7+7+9+9+7字节
 127          code uint8 ConfigurationDescriptor[9+9+5+5+4+5+7+9+7+7]=
 128          {
 129           /***************配置描述符***********************/
 130           //bLength字段。配置描述符的长度为9字节。
 131           0x09,
 132           
 133           //bDescriptorType字段。配置描述符编号为0x02。
 134           0x02,
 135           
 136           //wTotalLength字段。配置描述符集合的总长度,
 137           //包括配置描述符本身、接口描述符、类描述符、端点描述符等。
 138           sizeof(ConfigurationDescriptor)&0xFF, //低字节
 139           (sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节
 140           
 141           //bNumInterfaces字段。该配置包含的接口数,有两个接口。
 142           0x02,
 143           
 144           //bConfiguration字段。该配置的值为1。
 145           0x01,
 146           
 147           //iConfigurationz字段,该配置的字符串索引。这里没有,为0。
 148           0x00,
 149           
 150           //bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,
 151           //并且我们不想实现远程唤醒的功能,所以该字段的值为0x80。
 152           0x80,
 153           
 154           //bMaxPower字段,该设备需要的最大电流量。由于我们的板子
 155           //需要的电流不到100mA,因此我们这里设置为100mA。由于每单位
 156           //电流为2mA,所以这里设置为50(0x32)。
 157           0x32,
 158           
 159           /*******************CDC类接口描述符*********************/
 160           //bLength字段。接口描述符的长度为9字节。
 161           0x09,
 162           
 163           //bDescriptorType字段。接口描述符的编号为0x04。
 164           0x04,
 165           
 166           //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。
 167           0x00,
 168           
 169           //bAlternateSetting字段。该接口的备用编号,为0。
 170           0x00,
 171           
 172           //bNumEndpoints字段。非0端点的数目。CDC接口只使用一个中断
 173           //输入端点。
 174           0x01,
 175           
 176           //bInterfaceClass字段。该接口所使用的类。CDC类的类代码为0x02。
 177           0x02,
 178           
 179           //bInterfaceSubClass字段。该接口所使用的子类。要实现USB转串口,
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:07 PAGE 4   

 180           //就必须使用Abstract Control Model(抽象控制模型)子类。它的
 181           //编号为0x02。
 182           0x02,
 183           
 184           //bInterfaceProtocol字段。使用Common AT Commands(通用AT命令)
 185           //协议。该协议的编号为0x01。
 186           0x01,
 187           
 188           //iConfiguration字段。该接口的字符串索引值。这里没有,为0。
 189           0x00,
 190           
 191           /***************以下为功能描述符****************/
 192           /********* Header Functional Descriptor ********/
 193           //bFunctionLength字段。该描述符长度为5字节
 194           0x05,
 195           
 196           //bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE)
 197           //编号为0x24。
 198           0x24,
 199           
 200           //bDescriptorSubtype字段。描述符子类为Header Functional Descriptor
 201           //编号为0x00。
 202           0x00,
 203           
 204           //bcdCDC字段。CDC版本号,为0x0110(低字节在先)
 205           0x10,
 206           0x01,
 207           
 208           /**** Call Management Functional Descriptor ****/
 209           //bFunctionLength字段。该描述符长度为5字节
 210           0x05,
 211           
 212           //bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE)
 213           //编号为0x24。
 214           0x24,
 215           
 216           //bDescriptorSubtype字段。描述符子类为Call Management 
 217           //functional descriptor,编号为0x01。
 218           0x01,
 219           
 220           //bmCapabilities字段。设备自己不管理call management
 221           0x00,
 222           
 223           //bDataInterface字段。没有数据类接口用作call management
 224           0x00,
 225          
 226           /*** Abstract Control Management Functional Descriptor ***/
 227           //bFunctionLength字段。该描述符长度为4字节
 228           0x04,
 229           
 230           //bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE)
 231           //编号为0x24。
 232           0x24,
 233           
 234           //bDescriptorSubtype字段。描述符子类为Abstract Control 
 235           //Management functional descriptor,编号为0x02。
 236           0x02,
 237          
 238           //bmCapabilities字段。支持Set_Line_Coding、Set_Control_Line_State、
 239           //Get_Line_Coding请求和Serial_State通知
 240           0x02,
 241          
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 16:00:07 PAGE 5   

 242           /***  Union Functional Descriptor  **/
 243           //bFunctionLength字段。该描述符长度为5字节。 
 244           0x05,
 245          
 246           //bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE)
 247           //编号为0x24。
 248           0x24,
 249           
 250           //bDescriptorSubtype字段。描述符子类为
 251           //Union functional descriptor,编号为0x06。
 252           0x06,
 253           
 254           //MasterInterface字段。这里为前面编号为0的CDC接口。
 255           0x00,
 256           
 257           //SlaveInterface字段,这里为接下来编号为1的数据类接口。
 258           0x01,
 259          
 260           /***********  以下为接口0的端点描述符  *******/
 261           //bLength字段。端点描述符长度为7字节。
 262           0x07,
 263           
 264           //bDescriptorType字段。端点描述符编号为0x05。
 265           0x05,
 266           
 267           //bEndpointAddress字段。端点的地址。这里使用D12的输入端点1。
 268           //D7位表示数据方向,输入端点D7为1。所以输入端点1的地址为0x81。
 269           0x81,
 270           
 271           //bmAttributes字段。D1~D0为端点传输类型选择。
 272           //该端点为中断端点。中断端点的编号为3。其它位保留为0。
 273           0x03,
 274           
 275           //wMaxPacketSize字段。该端点的最大包长。端点1的最大包长为16字节。
 276           //注意低字节在先。
 277           0x10,
 278           0x00,
 279           
 280           //bInterval字段。端点查询的时间,这里设置为10个帧时间,即10ms。
 281           0x0A,
 282           
 283           /*********  以下为接口1(数据接口)的接口描述符  *********/
 284           //bLength字段。接口描述符的长度为9字节。
 285           0x09,
 286           
 287           //bDescriptorType字段。接口描述符的编号为0x04。
 288           0x04,
 289           
 290           //bInterfaceNumber字段。该接口的编号,第二个接口,编号为1。

⌨️ 快捷键说明

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