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

📄 usb.lst

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


C51 COMPILER V7.20, COMPILATION OF MODULE USB
OBJECT MODULE PLACED IN usb.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE usb.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>                /* special function register declarations   */
   2          #include <stdio.h>
   3          #include <string.h>
   4          #include "d12.h"
   5          
   6          
   7          unsigned char rcv_data_len;
   8          
   9          void main(void)
  10          {
  11   1      
  12   1              init_port();                                    //初始化I/O口
  13   1              init_serial();                                  //初始化串行口
  14   1              init_timer0();                                  //初始化定时器0
  15   1              init_special_interrupts();              //设置中断
  16   1              MCU_D12CS = 0x1;
  17   1              MCU_D12CS = 0x0;
  18   1              bEPPflags.value = 0;
  19   1              reconnect_USB();                                //重新连接USB
  20   1              while( TRUE )
  21   1              {
  22   2                      if (bEPPflags.bits.timer)
  23   2                      {
  24   3                              DISABLE;                                //定时器溢出,检测按键状态
  25   3                              bEPPflags.bits.timer = 0;
  26   3                              ENABLE;
  27   3                              if(bEPPflags.bits.configuration)//设备未配置返回
  28   3                                      check_key_LED();
  29   3                      }
  30   2                      if (bEPPflags.bits.bus_reset)
  31   2                      {                                                       //设备复位处理
  32   3                              DISABLE;
  33   3                              bEPPflags.bits.bus_reset = 0;
  34   3                              ENABLE;
  35   3                              // Release D12's SUSPEND pin after bus reset
  36   3                              // Enable 74HCT123 pulse generation before disconnect
  37   3                              D12SUSPD = 1;
  38   3                      }
  39   2                      if (bEPPflags.bits.suspend)
  40   2                      {                                                       //挂起改变处理
  41   3                              DISABLE;
  42   3                              bEPPflags.bits.suspend= 0;
  43   3                              ENABLE;
  44   3                              if(D12SUSPD == 1)
  45   3                              {                                               //挂起处理
  46   4                                      D12SUSPD = 0;
  47   4                                      P0 = 0xFF;
  48   4                                      P1 = 0xFF;
  49   4                                      P2 = 0xFF;
  50   4                                      P3 = 0xFF;
  51   4                                      D12_SetDMA(0xC3);
  52   4                                      D12SUSPD = 1;
  53   4                                      PCON |= 0x02;
  54   4                                      while (1);
  55   4                              }
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 2   

  56   3                      }
  57   2                      if (bEPPflags.bits.setup_packet)
  58   2                      {                                                       //Setup包处理
  59   3                              DISABLE;
  60   3                              bEPPflags.bits.setup_packet = 0;
  61   3                              ENABLE;
  62   3                              control_handler();              //调用请求处理子程序
  63   3                              D12SUSPD = 1;
  64   3                      }
  65   2                      if(bEPPflags.bits.ep1_rxdone)
  66   2                      {
  67   3                              D12_WriteEndpoint(3,rcv_data_len,GenEpBuf);
  68   3                  bEPPflags.bits.ep1_rxdone = 0 ;
  69   3                      }
  70   2                      if(bEPPflags.bits.ep2_rxdone)
  71   2                      {
  72   3                              D12_WriteEndpoint(5,rcv_data_len,EpBuf);
  73   3                  bEPPflags.bits.ep2_rxdone = 0 ;
  74   3                      }
  75   2              }
  76   1      }
  77          
  78          //返回stall应答
  79          void stall_ep0(void)
  80          {
  81   1              D12_SetEndpointStatus(0, 1);
  82   1              D12_SetEndpointStatus(1, 1);
  83   1      }
  84          
  85          //断开USB总线
  86          void disconnect_USB(void)
  87          {
  88   1              // Initialize D12 configuration
  89   1              D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
  90   1      }
  91          
  92          //连接USB总线
  93          void connect_USB(void)
  94          {
  95   1              // reset event flags
  96   1              DISABLE;
  97   1              bEPPflags.value = 0;//清除所有状态
  98   1              ENABLE;
  99   1              // V2.1 enable normal+sof interrupt
 100   1              D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
 101   1              // Initialize D12 configuration
 102   1              D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
 103   1      }
 104          
 105          //重新连接到USB总线
 106          void reconnect_USB(void)
 107          {
 108   1              unsigned long clk_cnt;
 109   1              MCU_LED0 = 0;
 110   1              MCU_LED1 = 0;
 111   1              // Pull-down D12's SUSPEND pin
 112   1              // Disable 74HCT123 pulse generation before disconnect
 113   1              // Release D12's SUSPEND pin after receiving bus reset from host
 114   1              D12SUSPD = 0;
 115   1              disconnect_USB();
 116   1              printf("Wait for 1 second ...\n");
 117   1              clk_cnt = ClockTicks;
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 3   

 118   1              while(ClockTicks < clk_cnt + 20) ;
 119   1              connect_USB();
 120   1              MCU_LED0 = 1;
 121   1              MCU_LED1 = 1;
 122   1      }
 123          
 124          //恢复到未配置状态
 125          void init_unconfig(void)
 126          {
 127   1      //      unsigned char i;
 128   1              D12_SetEndpointEnable(0);       /* Disable all endpoints but EPP0. */
 129   1      }
 130          
 131          //设置配置状态
 132          void init_config(void)
 133          {
 134   1              D12_SetEndpointEnable(1);       /* Enable  generic/iso endpoints. */
 135   1      }
 136          
 137          //从端点号1发送数据
 138          void single_transmit(unsigned char * buf, unsigned char len)
 139          {
 140   1              if( len <= EP0_PACKET_SIZE)
 141   1              {
 142   2                      D12_WriteEndpoint(1, len, buf);
 143   2              }
 144   1      }
 145          //发送端点号1建立代码
 146          void code_transmit(unsigned char code * pRomData, unsigned short len)
 147          {
 148   1      
 149   1              ControlData.wCount = 0;
 150   1              if(ControlData.wLength > len) ControlData.wLength = len;
 151   1              ControlData.pData = pRomData;
 152   1              if( ControlData.wLength >= EP0_PACKET_SIZE)
 153   1              {
 154   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
 155   2                      ControlData.wCount += EP0_PACKET_SIZE;
 156   2                      DISABLE;
 157   2                      bEPPflags.bits.control_state = USB_TRANSMIT;
 158   2                      ENABLE;
 159   2              }
 160   1              else
 161   1              {
 162   2                      D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
 163   2                      ControlData.wCount += ControlData.wLength;
 164   2                      DISABLE;
 165   2                      bEPPflags.bits.control_state = USB_IDLE;
 166   2                      ENABLE;
 167   2              }
 168   1      }
 169          
 170          //LED和按键处理子程序
 171          void check_key_LED(void)
 172          {
 173   1              static unsigned char c, last_key = 0xf;
 174   1      
 175   1              c = MCU_SWM0 & MCU_SWM1;
 176   1              c &= 0x0f;
 177   1              if (c != last_key)
 178   1              {
 179   2                      D12_WriteEndpoint(3, 1, &c);//发送按键状态
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 4   

 180   2              }
 181   1              last_key = c;
 182   1              if(bEPPflags.bits.ep1_rxdone)
 183   1              {
 184   2                      DISABLE;
 185   2                      bEPPflags.bits.ep1_rxdone = 0;
 186   2                      ENABLE;
 187   2                      MCU_LED0 = !(GenEpBuf[3] & 0x1);//改变LED状态
 188   2                      MCU_LED1 = !(GenEpBuf[3] & 0x2);
 189   2              }
 190   1      }
 191          
 192          void help_devreq(unsigned char typ, unsigned char req)
 193          {
 194   1              typ >>= 5;
 195   1              if(typ == USB_STANDARD_REQUEST)
 196   1              {
 197   2              }
 198   1              else if(bEPPflags.bits.verbose) printf("Request Type = %s, bRequest = 0x%bx.\n", _NAME_USB_REQUEST_TYPE[t
             -yp],req);
 199   1      }
 200          
 201          //请求处理子程序
 202          void control_handler()
 203          {
 204   1              unsigned char type, req;
 205   1              type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
 206   1              req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
 207   1              help_devreq(type, req); //显示设备请求
 208   1              if (type == USB_STANDARD_REQUEST) (*StandardDeviceRequest[req])();//调用标准请求
 209   1              else if (type == USB_VENDOR_REQUEST) (*VendorDeviceRequest[req])();//调用厂商请求
 210   1              else stall_ep0();
 211   1      }
 212          
 213          
 214          //定时器0中断处理
 215          timer_isr() interrupt 1
 216          {
 217   1              DISABLE;
 218   1              ClockTicks++;
 219   1              bEPPflags.bits.timer = 1;
 220   1              ENABLE;
 221   1      }
 222          
 223          //USB中断处理
 224          usb_isr() interrupt 0
 225          {
 226   1              DISABLE;
 227   1              fn_usb_isr();
 228   1              ENABLE;
 229   1      }
 230          
 231          //USB中断服务子程序
 232          void fn_usb_isr()
 233          {
 234   1              unsigned int i_st;
 235   1      
 236   1              bEPPflags.bits.in_isr = 1;
 237   1      
 238   1              i_st = D12_ReadInterruptRegister();//读取中断寄存器
 239   1      
 240   1              if(i_st != 0)

⌨️ 快捷键说明

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