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

📄 chap_9.lst

📁 用at89s52访问PDIUSBD12(USB协议)
💻 LST
字号:
C51 COMPILER V7.50   CHAP_9                                                                10/09/2006 14:43:39 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE CHAP_9
OBJECT MODULE PLACED IN chap_9.OBJ
COMPILER INVOKED BY: f:\Keil\C51\BIN\C51.EXE chap_9.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>
   2          #include <d12config.h>
   3          #include <D12main.h>
   4          #include "Descriptor.h"
   5          #include "Chap_9.h"
   6          
   7          /***************************************
   8          ** 函数名称: void ep0_rxdone(void)
   9          ** 功能描述: 通过端点索引 0 接收数据
  10          ** 输    入: 无
  11          ** 输    出: 无
  12          ***************************************/
  13          void ep0_rxdone(void)
  14          {
  15   1              INT8U ep_last, i;
  16   1              INT8U req[sizeof(DEVICE_REQUEST)];
  17   1      
  18   1              ep_last = D12_ReadLastTransactionStatus(0);                      //清除中断寄存器状态,取得最后处理状态
*** WARNING C206 IN LINE 18 OF CHAP_9.C: 'D12_ReadLastTransactionStatus': missing function-prototype
*** ERROR C267 IN LINE 18 OF CHAP_9.C: 'D12_ReadLastTransactionStatus': requires ANSI-style prototype
  19   1              if (ep_last & D12_SETUPPACKET) {                                         //如果收到了建立包(Setup包)
*** ERROR C202 IN LINE 19 OF CHAP_9.C: 'D12_SETUPPACKET': undefined identifier
  20   2                      ControlData.wLength = 0;                                                 //传输字节总数清0
*** ERROR C202 IN LINE 20 OF CHAP_9.C: 'ControlData': undefined identifier
  21   2                      ControlData.wCount = 0;                                                  //传输字节计数器清0
*** ERROR C202 IN LINE 21 OF CHAP_9.C: 'ControlData': undefined identifier
  22   2                      if(D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),req) 
  23   2                                                              != sizeof(DEVICE_REQUEST) ) {
  24   3                                                                                                                       //从端点0读8个字节失败
  25   3                              D12_SetEndpointStatus(0, 1);                             //停止控制端点0
  26   3                              D12_SetEndpointStatus(1, 1);                             //停止控制端点1
  27   3                              bEPPflags.bits.control_state = USB_IDLE;         //设置为等待状态
  28   3                              return;
  29   3                      }
  30   2                      /******* 以下语句通信中的解决大小端问题,使该函数与编译器无关 ****/
  31   2                      ControlData.DeviceRequest.bmRequestType = req[0];
  32   2                      ControlData.DeviceRequest.bRequest          = req[1];
  33   2                      ControlData.DeviceRequest.wValue                = req[3] * 256 + req[2]; 
  34   2                      ControlData.DeviceRequest.wIndex        = req[5] * 256 + req[4];
  35   2                      ControlData.DeviceRequest.wLength       = req[7] * 256 + req[6]; 
  36   2                      
  37   2                      /********  接收建立包成功 **********/
  38   2                      D12_AcknowledgeEndpoint(0);                                              //对控制端点0进行建立包应答
  39   2                      D12_AcknowledgeEndpoint(1);                                              //对控制端点1进行建立包应答
  40   2                      ControlData.wLength = ControlData.DeviceRequest.wLength;         //取出要传输数据的总字节数
  41   2                      
  42   2                      if (ControlData.DeviceRequest.bmRequestType & (INT8U)USB_ENDPOINT_DIRECTION_MASK) {
  43   3                                                                                                                      //如果控制传输是控制读取
  44   3                               bEPPflags.bits.setup_packet = 1;                       //通知control_handler()处理Setup包
  45   3                               bEPPflags.bits.control_state = USB_TRANSMIT;                      //设置为发送状态
  46   3                      }
  47   2                      else{                                                                                   //控制传输是控制写入
  48   3                                if (ControlData.DeviceRequest.wLength == 0) {
  49   4                                        bEPPflags.bits.setup_packet = 1;                             //通知control_handler()处理Setup包                                 
  50   4                                        bEPPflags.bits.control_state = USB_IDLE;             //设置为等待状态
C51 COMPILER V7.50   CHAP_9                                                                10/09/2006 14:43:39 PAGE 2   

  51   4                                }
  52   3                                else {
  53   4                                          if (ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {     
  54   5                                                                                                                                               //数据长度出错
  55   5                                                   bEPPflags.bits.control_state = USB_IDLE;    //设置为等待状态       
  56   5                                                   D12_SetEndpointStatus(0, 1);                                //停止控制端点0
  57   5                                                   D12_SetEndpointStatus(1, 1);                            //停止控制端点1
  58   5                                          }
  59   4                                          else
  60   4                                                  bEPPflags.bits.control_state = USB_RECEIVE;  //设置为接收状态
  61   4                                }// set command with data
  62   3                       }// else set command
  63   2              }// if setup packet
  64   1      
  65   1              /*****  下面为控制写入的数据阶段  ***************/
  66   1              else if (bEPPflags.bits.control_state == USB_RECEIVE) {              //如果为接收状态
  67   2                               i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
  68   2                               ControlData.dataBuffer + ControlData.wCount);               //从端点0接收数据
  69   2                               ControlData.wCount += i;                                                                 //统计已接收的字节数
  70   2                               if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {                                         
             -                                      //数据接收完毕
  71   3                                       bEPPflags.bits.setup_packet = 1;                                 //通知control_handler()处理Setup包                              
  72   3                                       bEPPflags.bits.control_state = USB_IDLE;                 //设置为等待状态
  73   3                               }
  74   2                       }else 
  75   1                               bEPPflags.bits.control_state = USB_IDLE;                                 //设置等待状态
  76   1      }
  77          
  78          /***************************************
  79          ** 函数名称: void ep0_txdone(void)
  80          ** 功能描述: 通过端点索引 0 发送数据
  81          ** 输    入: 无
  82          ** 输    出: 无
  83          ***************************************/
  84          void ep0_txdone(void)
  85          {
  86   1              INT16 i = ControlData.wLength - ControlData.wCount;     //计算未发送的字节数
  87   1      
  88   1              D12_ReadLastTransactionStatus(1);                                       //清除中断寄存器标志位
  89   1      
  90   1              if (bEPPflags.bits.control_state != USB_TRANSMIT){      //非发送状态                                                                                            
  91   2                      single_transmit(0, 0);                                          
  92   2                      return;                                                                                 //返回
  93   2              }
  94   1              
  95   1              if( i >= EP0_PACKET_SIZE) {                                                     //未发送字节数大于16,发送16个字节
  96   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
  97   2                      ControlData.wCount += EP0_PACKET_SIZE;
  98   2                      bEPPflags.bits.control_state = USB_TRANSMIT;    
  99   2              }
 100   1              else if( i != 0) {                                                                      //发送所有未发送的字节
 101   2                      D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
 102   2                      ControlData.wCount += i;
 103   2                      bEPPflags.bits.control_state = USB_IDLE;                //置状态为等待状态
 104   2              }
 105   1              else if (i == 0){
 106   2                      D12_WriteEndpoint(1, 0, 0);                                     //发送完毕,发0个字节
 107   2                      bEPPflags.bits.control_state = USB_IDLE;
 108   2              }
 109   1      }
 110          /*************************************************************
 111          ** 函数名称: void control_handler(void)
C51 COMPILER V7.50   CHAP_9                                                                10/09/2006 14:43:39 PAGE 3   

 112          ** 功能描述: 控制传输
 113          **************************************************************/
 114          void control_handler(void)
 115          {
 116   1              INT8U type, req;
 117   1      
 118   1              type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
 119   1                                                                                                      //读取请求代码
 120   1              req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
 121   1              if (type == USB_STANDARD_REQUEST)
 122   1                      (*StandardDeviceRequest[req])();                //标准请求处理
 123   1              //else if (type == USB_VENDOR_REQUEST)          //厂商请求
 124   1              //      (*VendorDeviceRequest[req])();
 125   1              //else if(type == USB_CLASS_REQUEST)
 126   1              //      (*ClassDeviceRequest[req])();                   //类请求,如大容量类
 127   1              else
 128   1                      stall_ep0();                                                    //无效请求,返回STALL                            
 129   1      }

C51 COMPILATION COMPLETE.  1 WARNING(S),  4 ERROR(S)

⌨️ 快捷键说明

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