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

📄 chap_9.lst

📁 PDIUSBD12的固件程序可能对开发USB1.1的兄弟有用
💻 LST
📖 第 1 页 / 共 2 页
字号:
 196   1      }
 197          
 198          
 199          void get_descriptor(void)
 200          {
 201   1              INT8U bDescriptor = MSB(ControlData.DeviceRequest.wValue);                                      //读取请求的描述符类型
 202   1      
 203   1              if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
 204   1              {//获取设备描述符
 205   2                      code_transmit((INT8U *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
 206   2              
 207   2              }
 208   1              else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) 
 209   1              {//获取其它描述符
 210   2                      if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH)
 211   2                      { 
 212   3                              ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;
 213   3                      }
 214   2                      code_transmit((INT8U *)&(usb_descr.ConfigDescr), ControlData.DeviceRequest.wLength);
 215   2                                                                                                                                                              //发送描述符内容
 216   2              }
 217   1              else
 218   1                      stall_ep0();
 219   1      }
 220          
 221          
 222          void get_configuration(void)
 223          {
 224   1              INT8U c = bEPPflags.bits.configuration;                                                                         //取出配置值
 225   1              single_transmit(&c, 1);                                                                                                         //发送配置值
 226   1      }
 227          
 228          
 229          void set_configuration(void)
 230          {
 231   1              if (ControlData.DeviceRequest.wValue == 0) 
 232   1              {//配置值不对,设备进入未配置状态
 233   2                      single_transmit(0, 0);
 234   2                      DISABLE();
 235   2                      bEPPflags.bits.configuration = 0;
 236   2                      ENABLE();
 237   2                      init_unconfig();                                                                                                                //进入地址状态,禁止0除外的所有端点
 238   2              } 
 239   1              else if (ControlData.DeviceRequest.wValue == 1) 
C51 COMPILER V7.06   CHAP_9                                                                09/15/2008 18:19:55 PAGE 5   

 240   1              {
 241   2                      single_transmit(0, 0);
 242   2                      init_unconfig();
 243   2                      init_config();
 244   2                      DISABLE();
 245   2                      bEPPflags.bits.configuration = 1;
 246   2                      ENABLE();
 247   2              } 
 248   1              else
 249   1                      stall_ep0();
 250   1      }
 251          
 252          
 253          void get_interface(void)
 254          {
 255   1              INT8U txdat = 0;                                                                                                                        //本设备只有一个接口
 256   1              single_transmit(&txdat, 1);                                                                                                     //发送一个字节
 257   1      }
 258          
 259          
 260          void set_interface(void)
 261          {
 262   1              if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
 263   1                      single_transmit(0, 0);
 264   1              else            
 265   1                      stall_ep0();                            
 266   1      }
 267          
 268          
 269          void control_handler(void)                                                                                                                      //协议控制子程序
 270          {
 271   1              INT8U type, req;
 272   1      
 273   1              type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;                 //读取请求代码
 274   1              req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
 275   1              if (type == USB_STANDARD_REQUEST)
 276   1                      (*StandardDeviceRequest[req])();                                                                                        //标准请求处理
 277   1              else
 278   1                      stall_ep0();                    
 279   1      }
 280          
 281          
 282          void ep0_rxdone(void)                                                                                                                           //端点0接收数据
 283          {
 284   1              INT8U ep_last, i;
 285   1              INT8U req[sizeof(DEVICE_REQUEST)];
 286   1      
 287   1              ep_last = D12_ReadLastTransactionStatus(0);                                                                             //清除中断寄存器状态,取得最后处理状态
 288   1              if (ep_last & D12_SETUPPACKET) 
 289   1              {                                                                                                                                                               //如果收到了建立包(Setup包)
 290   2                      ControlData.wLength = 0;                                                                                                        //传输字节总数清0
 291   2                      ControlData.wCount = 0;                                                                                                         //传输字节计数器清0
 292   2                      if(D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),req) 
 293   2                                                              != sizeof(DEVICE_REQUEST) ) 
 294   2                      {
 295   3                                                                                                                                                                              //从端点0读8个字节失败
 296   3                              D12_SetEndpointStatus(0, 1);                                                                                    //停止控制端点0
 297   3                              D12_SetEndpointStatus(1, 1);                                                                                    //停止控制端点1
 298   3                              bEPPflags.bits.control_state = USB_IDLE;                                                                //设置为等待状态
 299   3                              return;
 300   3                      }
 301   2                      /******* 以下语句通信中的解决大小端问题,使该函数与编译器无关 ****/
C51 COMPILER V7.06   CHAP_9                                                                09/15/2008 18:19:55 PAGE 6   

 302   2                      ControlData.DeviceRequest.bmRequestType = req[0];
 303   2                      ControlData.DeviceRequest.bRequest          = req[1];
 304   2                      ControlData.DeviceRequest.wValue                = req[3] * 256 + req[2]; 
 305   2                      ControlData.DeviceRequest.wIndex        = req[5] * 256 + req[4];
 306   2                      ControlData.DeviceRequest.wLength       = req[7] * 256 + req[6]; 
 307   2                      
 308   2                      /********  接收建立包成功 **********/
 309   2                      D12_AcknowledgeEndpoint(0);                                                                                                     //对控制端点0进行建立包应答
 310   2                      D12_AcknowledgeEndpoint(1);                                                                                                     //对控制端点1进行建立包应答
 311   2                      ControlData.wLength = ControlData.DeviceRequest.wLength;                                        //取出要传输数据的总字节数
 312   2                      
 313   2                      if (ControlData.DeviceRequest.bmRequestType & (INT8U)USB_ENDPOINT_DIRECTION_MASK) 
 314   2                      {
 315   3                                                                                                                                                                              //如果控制传输是控制读取
 316   3                               bEPPflags.bits.setup_packet = 1;                                                                               //通知control_handler()处理Setup包
 317   3                               bEPPflags.bits.control_state = USB_TRANSMIT;                                           //设置为发送状态
 318   3                      }
 319   2                      else
 320   2                      {                                                                                                                                                       //控制传输是控制写入
 321   3                              if (ControlData.DeviceRequest.wLength == 0) 
 322   3                              {
 323   4                                      bEPPflags.bits.setup_packet = 1;                                                                //通知control_handler()处理Setup包                                
 324   4                                      bEPPflags.bits.control_state = USB_IDLE;                                                //设置为等待状态
 325   4                              }
 326   3                              else 
 327   3                              {
 328   4                                      if (ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) 
 329   4                                      {                                                                                                                                       //数据长度出错
 330   5                                               bEPPflags.bits.control_state = USB_IDLE;                                       //设置为等待状态        
 331   5                                               D12_SetEndpointStatus(0, 1);                                                           //停止控制端点0
 332   5                                               D12_SetEndpointStatus(1, 1);                                                           //停止控制端点1
 333   5                                      }
 334   4                                      else
 335   4                                              bEPPflags.bits.control_state = USB_RECEIVE;                             //设置为接收状态
 336   4                              }
 337   3                      }
 338   2              }
 339   1              else if (bEPPflags.bits.control_state == USB_RECEIVE) 
 340   1              {                                                       //控制写入的数据阶段
 341   2                      i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
 342   2                      ControlData.dataBuffer + ControlData.wCount);
 343   2                      ControlData.wCount += i;
 344   2                      if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
 345   2                      {                                                                               //数据接收完毕
 346   3                              bEPPflags.bits.setup_packet = 1;                                                                        //通知control_handler()处理Setup包                                
 347   3                              bEPPflags.bits.control_state = USB_IDLE;
 348   3                      }
 349   2              }
 350   1              else 
 351   1                      bEPPflags.bits.control_state = USB_IDLE;
 352   1      }
 353          
 354          
 355          
 356          void ep0_txdone(void)
 357          {
 358   1              INT16 i = ControlData.wLength - ControlData.wCount;                                                             //计算未发送的字节数
 359   1      
 360   1              D12_ReadLastTransactionStatus(1);                                                                                               //清除中断寄存器标志位
 361   1      
 362   1              if (bEPPflags.bits.control_state != USB_TRANSMIT)
 363   1              {                                                                                                                                                               //非发送状态                                                                                            
C51 COMPILER V7.06   CHAP_9                                                                09/15/2008 18:19:55 PAGE 7   

 364   2                      single_transmit(0, 0);                                          
 365   2                      return;
 366   2              }
 367   1              
 368   1              if( i >= EP0_PACKET_SIZE) 
 369   1              {                                                                                                                                                               //未发送字节数大于16,发送16个字节
 370   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
 371   2                      ControlData.wCount += EP0_PACKET_SIZE;
 372   2                      bEPPflags.bits.control_state = USB_TRANSMIT;    
 373   2              }
 374   1              else if( i != 0) 
 375   1              {                                                                                                                               //发送所有未发送的字节
 376   2                      D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
 377   2                      ControlData.wCount += i;
 378   2                      bEPPflags.bits.control_state = USB_IDLE;
 379   2              }
 380   1              else if (i == 0)
 381   1              {
 382   2                      D12_WriteEndpoint(1, 0, 0);
 383   2                      bEPPflags.bits.control_state = USB_IDLE;
 384   2              }
 385   1      }
 386          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1001    ----
   CONSTANT SIZE    =     48    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     35      25
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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