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

📄 usb.lst

📁 一个通过D12与计算机进行USB通信的单片机程序,开发者可以参考
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 5   

 241   1              {
 242   2                      if(i_st & D12_INT_BUSRESET)
 243   2                      {
 244   3                              bus_reset();//USB总线服务
 245   3                              bEPPflags.bits.bus_reset = 1;
 246   3                      }
 247   2                      if(i_st & D12_INT_EOT)
 248   2                              dma_eot();//DMA传输结束
 249   2                      if(i_st & D12_INT_SUSPENDCHANGE)
 250   2                              bEPPflags.bits.suspend = 1;//挂起改变
 251   2                      if(i_st & D12_INT_ENDP0IN)
 252   2                              ep0_txdone();//端点0IN中断
 253   2                      if(i_st & D12_INT_ENDP0OUT)
 254   2                              ep0_rxdone();//端点0OUT中断
 255   2                      if(i_st & D12_INT_ENDP1IN)
 256   2                              ep1_txdone();//端点1IN中断
 257   2                      if(i_st & D12_INT_ENDP1OUT)
 258   2                              ep1_rxdone();//端点1OUT中断
 259   2                      if(i_st & D12_INT_ENDP2IN)
 260   2                              main_txdone();//端点2IN中断
 261   2                      if(i_st & D12_INT_ENDP2OUT)
 262   2                              main_rxdone();//端点2OUT中断
 263   2              }
 264   1              bEPPflags.bits.in_isr = 0;
 265   1      }
 266          
 267          //总线复位处理子程序
 268          void bus_reset(void)
 269          {
 270   1      }
 271          
 272          //端点0OUT中断
 273          void ep0_rxdone(void)
 274          {
 275   1              unsigned char ep_last, i;
 276   1              ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
 277   1              if (ep_last & D12_SETUPPACKET)
 278   1              {
 279   2                      //接收到SETUP包
 280   2                      ControlData.wLength = 0;
 281   2                      ControlData.wCount = 0;
 282   2                      if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
 283   2                              (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) )
 284   2                      {
 285   3                              //SETUP包出错,返回
 286   3                              D12_SetEndpointStatus(0, 1);
 287   3                              D12_SetEndpointStatus(1, 1);
 288   3                              bEPPflags.bits.control_state = USB_IDLE;
 289   3                              return;
 290   3                      }
 291   2                      ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
 292   2                      ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
 293   2                      ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
 294   2      
 295   2                      //对控制端点的输入/输出进行应答
 296   2                      D12_AcknowledgeEndpoint(0);
 297   2                      D12_AcknowledgeEndpoint(1);
 298   2      
 299   2                      ControlData.wLength = ControlData.DeviceRequest.wLength;
 300   2                      ControlData.wCount = 0;
 301   2      
 302   2                      if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 6   

 303   2                      {
 304   3                              //从主机传输数据
 305   3                              bEPPflags.bits.setup_packet = 1;
 306   3                              bEPPflags.bits.control_state = USB_TRANSMIT;            /* get command */
 307   3                      }
 308   2                      else
 309   2                      {
 310   3                              if (ControlData.DeviceRequest.wLength == 0)
 311   3                              {
 312   4                                      bEPPflags.bits.setup_packet = 1;
 313   4                                      bEPPflags.bits.control_state = USB_IDLE;                /* set command */
 314   4                              }
 315   3                              else
 316   3                              {
 317   4                                      if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
 318   4                                      {
 319   5                                              //接收数据长度为0
 320   5                                              bEPPflags.bits.control_state = USB_IDLE;
 321   5                                              D12_SetEndpointStatus(0, 1);
 322   5                                              D12_SetEndpointStatus(1, 1);
 323   5                                      }
 324   4                                      else
 325   4                                      {
 326   5                                              bEPPflags.bits.control_state = USB_RECEIVE;     //设置接收状态
 327   5                                      }
 328   4                              } // set command with data
 329   3                      } // else set command
 330   2              } // if setup packet
 331   1              else if (bEPPflags.bits.control_state == USB_RECEIVE)
 332   1              {
 333   2                      //接收数据
 334   2                      i =     D12_ReadEndpoint(0, EP0_PACKET_SIZE,
 335   2                              ControlData.dataBuffer + ControlData.wCount);
 336   2                      ControlData.wCount += i;
 337   2                      if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
 338   2                      {
 339   3                              //数据接收完毕
 340   3                              bEPPflags.bits.setup_packet = 1;
 341   3                              bEPPflags.bits.control_state = USB_IDLE;
 342   3                      }
 343   2              }
 344   1              else
 345   1              {
 346   2                      bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
 347   2              }
 348   1      }
 349          
 350          //端点0IN处理
 351          void ep0_txdone(void)
 352          {
 353   1      
 354   1              short i = ControlData.wLength - ControlData.wCount;
 355   1              
 356   1              D12_ReadLastTransactionStatus(1); //清中断标志位
 357   1              if (bEPPflags.bits.control_state != USB_TRANSMIT) return;//非发送状态,返回
 358   1              if( i >= EP0_PACKET_SIZE)
 359   1              {
 360   2                      //剩下数据大于16字节,发送16字节
 361   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
 362   2                      ControlData.wCount += EP0_PACKET_SIZE;
 363   2                      bEPPflags.bits.control_state = USB_TRANSMIT;
 364   2              }
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 7   

 365   1              else if( i != 0)
 366   1              {
 367   2                      //发送剩下数据
 368   2                              D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
 369   2                              ControlData.wCount += i;
 370   2                              bEPPflags.bits.control_state = USB_IDLE;
 371   2      
 372   2              }
 373   1              else if (i == 0)
 374   1              {
 375   2                      D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
 376   2                      bEPPflags.bits.control_state = USB_IDLE;
 377   2              }
 378   1      }
 379          
 380          //DMA结束处理
 381          void dma_eot(void)
 382          {
 383   1      }
 384          
 385          //端点1OUT处理
 386          void ep1_txdone(void)
 387          {
 388   1              D12_ReadLastTransactionStatus(3); //清中断标志位
 389   1      }
 390          
 391          //端点1IN处理
 392          void ep1_rxdone(void)
 393          {
 394   1              unsigned char len;
 395   1      
 396   1              D12_ReadLastTransactionStatus(2); //清中断标志位
 397   1              len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
 398   1              if(len != 0) bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
 399   1              rcv_data_len = len ;
 400   1      }
 401          
 402          //主端点OUT控制
 403          void main_txdone(void)
 404          {
 405   1              D12_ReadLastTransactionStatus(5); //清中断标志位
 406   1      }
 407          
 408          //主端点IN控制
 409          void main_rxdone(void)
 410          {
 411   1              unsigned char len,epstatus;
 412   1      
 413   1              D12_ReadLastTransactionStatus(4);                       //清中断标志位
 414   1              len = D12_ReadEndpoint(4, 64, EpBuf);           //接收数据
 415   1              epstatus=D12_ReadEndpointStatus(4);
 416   1              epstatus &= 0x60;
 417   1              if (epstatus == 0x60) len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
 418   1              rcv_data_len = len ;
 419   1              bEPPflags.bits.ep2_rxdone = 1 ;
 420   1      }
 421          void reserved(void)
 422          {
 423   1              stall_ep0();
 424   1      }
 425          
 426          
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 8   

 427          //获取设备状态
 428          void get_status(void)
 429          {
 430   1              unsigned char endp, txdat[2];
 431   1              unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 432   1              unsigned char c;
 433   1              if (bRecipient == USB_RECIPIENT_DEVICE)
 434   1              {
 435   2                      if(bEPPflags.bits.remote_wakeup == 1)           //获取远程唤醒状态
 436   2                              txdat[0] = 3;
 437   2                      else
 438   2                              txdat[0] = 1;
 439   2                      txdat[1]=0;
 440   2                      single_transmit(txdat, 2);
 441   2              }
 442   1              else if (bRecipient == USB_RECIPIENT_INTERFACE)
 443   1              {                                                                                               //获取接口状态
 444   2                      txdat[0]=0;
 445   2                      txdat[1]=0;
 446   2                      single_transmit(txdat, 2);
 447   2              }
 448   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT)
 449   1              {                                                                                               //获取端点状态
 450   2                      endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 451   2                      if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 452   2                              c = D12_SelectEndpoint(endp*2 + 1);     /* Control-in */
 453   2                      else
 454   2                              c = D12_SelectEndpoint(endp*2); /* Control-out */
 455   2                      if(c & D12_STALL)
 456   2                              txdat[0] = 1;
 457   2                      else
 458   2                              txdat[0] = 0;
 459   2                      txdat[1] = 0;
 460   2                      single_transmit(txdat, 2);
 461   2              }
 462   1              else
 463   1                      stall_ep0();
 464   1      }
 465          
 466          //特性清除
 467          void clear_feature(void)
 468          {
 469   1              unsigned char endp;
 470   1              unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
 471   1      
 472   1              if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
 473   1              {                                                                                       //清除远程唤醒功能
 474   2                      DISABLE;
 475   2                      bEPPflags.bits.remote_wakeup = 0;
 476   2                      ENABLE;
 477   2                      single_transmit(0, 0);
 478   2              }
 479   1              else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT
             -_STALL)
 480   1              {                                                                                       //清除端点stall
 481   2                      endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
 482   2                      if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 483   2                              /* clear TX stall for IN on EPn. */
 484   2                              D12_SetEndpointStatus(endp*2 + 1, 0);
 485   2                      else
 486   2                              /* clear RX stall for OUT on EPn. */
 487   2                              D12_SetEndpointStatus(endp*2, 0);

⌨️ 快捷键说明

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