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

📄 chap_9.lst

📁 周立功dp1581usb2.0实验仪
💻 LST
📖 第 1 页 / 共 5 页
字号:
 187   1              if(USB_Int_Flag.BITS.EP0SETUP)
 188   1              {
 189   2                      EA_DISABLE;
 190   2                      USB_Setup();
 191   2                      EA_ENABLE;
 192   2              }
 193   1              
 194   1              //挂起处理
 195   1              if(USB_Int_Flag.BITS.SUSP)
 196   1              {               
 197   2                      //清除挂起标志
 198   2                      EA_DISABLE;
 199   2                      USB_Int_Flag.BITS.SUSP = 0;
 200   2                      EA_ENABLE;
 201   2                      //ISP1581进入挂起状态           
 202   2                      D14_Cntrl_Reg.D14_MODE.BITS.GOSUSP = 1;
 203   2                      D14_Cntrl_Reg.D14_MODE.BITS.GOSUSP = 0;
 204   2              }
 205   1              
 206   1              //挂起恢复处理
 207   1              if(USB_Int_Flag.BITS.RESUME)
 208   1              {
 209   2                      //清除恢复标志
 210   2                      EA_DISABLE;
 211   2                      USB_Int_Flag.BITS.RESUME = 0;         
 212   2                      EA_ENABLE;
 213   2                      //产生一个恢复信号
 214   2                      D14_Cntrl_Reg.D14_MODE.BITS.SNDRSU = 1;
 215   2                      D14_Cntrl_Reg.D14_MODE.BITS.SNDRSU = 0;
 216   2              }
 217   1              
 218   1              //高速状态
 219   1              if(USB_Int_Flag.BITS.HS_STAT)
 220   1              {
 221   2                      //清除高速状态标志
 222   2                      EA_DISABLE;
 223   2                      USB_Int_Flag.BITS.HS_STAT = 0;
 224   2                      EA_ENABLE;
 225   2                      if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
 226   2                      {
 227   3                              //切换高速指示
 228   3                              HS_FS_LED = HIGH_SPEED_LED;
 229   3                              //设置高速模式状态
 230   3                              Kernel_Flag.BITS.HS_FS_State = HIGH_SPEED;
 231   3                              //重新配置高速端点
 232   3                              Init_Endpoint();
 233   3      
 234   3      //                      PIO_Count = 64;
 235   3                              PIO_Count = 512;
 236   3                      }
 237   2              }
 238   1      }
 239          
 240          
 241          //***********************************************************************
C51 COMPILER V7.01  CHAP_9                                                                 02/09/2004 20:43:55 PAGE 5   

 242          //*                                                                                                                                     *
 243          //*     Routine         :                                                               *
 244          //*     Input           : None                                                                                  *
 245          //*     Output          : None                                                                  *
 246          //*     Function        :                                                               *
 247          //*                                                                                                                                             *
 248          //***********************************************************************
 249          //建立包处理
 250          void USB_Setup(void)
 251          {
 252   1              unsigned char type, req;
 253   1      
 254   1              //清除EP0SETUP中断标志
 255   1              USB_Int_Flag.BITS.EP0SETUP = 0;   
 256   1              //清除总线复位标志
 257   1              Kernel_Flag.BITS.Bus_Reset = 0;
 258   1              //选择端点0SETUP缓冲区
 259   1              D14_Cntrl_Reg.D14_ENDPT_INDEX = 0x20;
 260   1              
 261   1              //读取USB请求
 262   1              //读取请求类型
 263   1              USB_Device_Request.bmRequestType =  D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 264   1              //读取请求号
 265   1              USB_Device_Request.bRequest = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 266   1              //读取16bit请求数据
 267   1              USB_Device_Request.wValue = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 268   1              USB_Device_Request.wValue <<= 8;
 269   1              USB_Device_Request.wValue |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 270   1              //读取16bit请求索引
 271   1              USB_Device_Request.wIndex = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 272   1              USB_Device_Request.wIndex <<= 8;
 273   1              USB_Device_Request.wIndex |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 274   1              //读取16bit长度
 275   1              USB_Device_Request.wLength = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 276   1              USB_Device_Request.wLength <<= 8;
 277   1              USB_Device_Request.wLength |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 278   1              
 279   1              //长度处理(高低8位对调)
 280   1              Temp = USB_Device_Request.wLength;
 281   1              USB_Device_Request.wLength = 0;
 282   1              USB_Device_Request.wLength = (UC) Temp;
 283   1              USB_Device_Request.wLength <<= 8;
 284   1              Temp >>= 8;
 285   1              USB_Device_Request.wLength |= Temp;
 286   1              
 287   1              type = USB_Device_Request.bmRequestType & 0x60;
 288   1              req = USB_Device_Request.bRequest & 0x0f;
 289   1      
 290   1              //厂商请求
 291   1              if (type == 0x40)
 292   1              {
 293   2                      Vendor_Specific_Command();//厂商请求处理
 294   2              }
 295   1              else if (type == 0x00)
 296   1                      (*StandardDeviceRequest[req])();//调用标准请求
 297   1      }
 298          
 299          //***********************************************************************
 300          //*                                                                                                                                     *
 301          //*     Routine         :                                                               *
 302          //*     Input           : None                                                                                  *
 303          //*     Output          : None                                                                  *
C51 COMPILER V7.01  CHAP_9                                                                 02/09/2004 20:43:55 PAGE 6   

 304          //*     Function        :                                                               *
 305          //*                                                                                                                                             *
 306          //***********************************************************************
 307          //厂商请求处理
 308          void Vendor_Specific_Command(void)
 309          {
 310   1              if(USB_Device_Request.bRequest == 0x0C)
 311   1              {
 312   2                      switch (USB_Device_Request.wIndex)
 313   2                      {
 314   3                      case GET_FIRMWARE_VERSION  ://获取固件版本
 315   3                              if(USB_Device_Request.wLength == 1)
 316   3                              {
 317   4                                      //select endpoint
 318   4                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
 319   4                                      //set the data length to 1 byte
 320   4                                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
 321   4                                      D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
 322   4                                      //sent 0x21 as data
 323   4                                      D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x21;//版本号
 324   4                                      wait_ep0tx();
 325   4                                      ep0out_ack();
 326   4      //                              ep0in_ack();
 327   4                                      break;
 328   4                              }
 329   3                              
 330   3                      case SETUP_DMA_REQUEST :
 331   3                              //Out Token Ack detected
 332   3                              wait_ep0rx();
 333   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
 334   3                              //
 335   3                              FileSize.Size.Address[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 336   3                              FileSize.Size.Address[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 337   3                              FileSize.Size.Address[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 338   3                              //读取传输字节数
 339   3                              Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 340   3                              bytecount = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 341   3                              bytecount <<= 8;
 342   3                              bytecount |= Temp;
 343   3                              //读取传输方式
 344   3                              FileSize.Size.DIR = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 345   3                              ep0in_ack();
 346   3                              Kernel_Flag.BITS.Transfer_Start = 1;//标志传输数据开始
 347   3                              break;
 348   3                      
 349   3                      case GET_SET_EEPROM_REQUEST  ://对EEPROM操作的请求
 350   3                              //Out Token Ack detected
 351   3                              wait_ep0rx();
 352   3                              D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
 353   3                              //
 354   3                              FileSize.Size.Address[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 355   3                              FileSize.Size.Address[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 356   3                              FileSize.Size.Address[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 357   3                              //读取传输字节数
 358   3                              Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 359   3                              bytecount = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 360   3                              bytecount <<= 8;
 361   3                              bytecount |= Temp;
 362   3                              bytecouter=(UC)bytecount;
 363   3                              //读取传输方式
 364   3                              FileSize.Size.DIR = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
 365   3                              ep0in_ack();
C51 COMPILER V7.01  CHAP_9                                                                 02/09/2004 20:43:55 PAGE 7   

 366   3                              Kernel_Flag.BITS.Transfer_Start = 1;//标志传输数据开始
 367   3                              break;
 368   3                      default :
 369   3                              if(USB_Device_Request.bmRequestType == 0xC0)
 370   3                              {
 371   4                                      ep0in_ack();
 372   4                                      break;                          
 373   4                              }
 374   3                              if(USB_Device_Request.bmRequestType == 0x40)
 375   3                              {       
 376   4                                      D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
 377   4                                      D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
 378   4                                      while(!USB_Int_Flag.BITS.EP0SETUP)
 379   4                                      {
 380   5                                              //读取ISP1581中断寄存器
 381   5                                              USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;

⌨️ 快捷键说明

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