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

📄 usb.lst

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

 734   1              i=inportb(D12_DATA);
 735   1              j=inportb(D12_DATA);
 736   1              i += (j<<8);
 737   1      
 738   1              if(bEPPflags.bits.in_isr == 0)
 739   1                      ENABLE;
 740   1      
 741   1              return i;
 742   1      }
 743          
 744          //读取端点数据
 745          unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
 746          {
 747   1              unsigned char i, j;
 748   1      
 749   1              if(bEPPflags.bits.in_isr == 0)
 750   1                      DISABLE;
 751   1      
 752   1              outportb(D12_COMMAND, endp);
 753   1              if((inportb(D12_DATA) & D12_FULLEMPTY) == 0)
 754   1              {
 755   2                      if(bEPPflags.bits.in_isr == 0)
 756   2                              ENABLE;
 757   2                      return 0;
 758   2              }
 759   1      
 760   1              outportb(D12_COMMAND, 0xF0);
 761   1              j = inportb(D12_DATA);
 762   1              j = inportb(D12_DATA);
 763   1      
 764   1              if(j > len)
 765   1                      j = len;
 766   1      
 767   1              for(i=0; i<j; i++)
 768   1                      *(buf+i) = inportb(D12_DATA);
 769   1      
 770   1              outportb(D12_COMMAND, 0xF2);
 771   1      
 772   1              if(bEPPflags.bits.in_isr == 0)
 773   1                      ENABLE;
 774   1      
 775   1              return j;
 776   1      }
 777          
 778          //写端点
 779          unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char len, unsigned char * buf)
 780          {
 781   1              unsigned char i;
 782   1      
 783   1              if(bEPPflags.bits.in_isr == 0)
 784   1                      DISABLE;
 785   1      
 786   1              outportb(D12_COMMAND, endp);
 787   1              i = inportb(D12_DATA);
 788   1      
 789   1              outportb(D12_COMMAND, 0xF0);
 790   1              outportb(D12_DATA, 0);
 791   1              outportb(D12_DATA, len);
 792   1      
 793   1              for(i=0; i<len; i++)
 794   1                      outportb(D12_DATA, *(buf+i));
 795   1      
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 14  

 796   1              outportb(D12_COMMAND, 0xFA);
 797   1      
 798   1              if(bEPPflags.bits.in_isr == 0)
 799   1                      ENABLE;
 800   1      
 801   1              return len;
 802   1      }
 803          
 804          //设置端点应答
 805          void D12_AcknowledgeEndpoint(unsigned char endp)
 806          {
 807   1              outportb(D12_COMMAND, endp);
 808   1              outportb(D12_COMMAND, 0xF1);
 809   1              if(endp == 0)
 810   1                      outportb(D12_COMMAND, 0xF2);
 811   1      }
 812          
 813          //输出数据
 814          void outportb(unsigned int Addr, unsigned char Data)
 815          {
 816   1              *((unsigned char xdata *) Addr) = Data;
 817   1      }
 818          
 819          //输入数据
 820          unsigned char inportb(unsigned int Addr)
 821          {
 822   1              return *((unsigned char xdata *) Addr);
 823   1      }
 824          
 825          
 826          //获取固件版本号
 827          void get_firmware_version()
 828          {
 829   1              unsigned char i;
 830   1      
 831   1              i = 0x31; // firmware version number
 832   1              single_transmit((unsigned char *)&i, 1);
 833   1      }
 834          
 835          //获取端点2缓存区大小
 836          void get_buffer_size()
 837          {
 838   1              unsigned char i[4];
 839   1              if(bNoRAM == TRUE)
 840   1              {
 841   2                      i[0] = EP2_PACKET_SIZE;
 842   2                      i[1] = 0;
 843   2                      i[2] = 0;
 844   2                      i[3] = 0;
 845   2              }
 846   1              else
 847   1              {
 848   2                      i[0] = 0;
 849   2                      i[1] = 1;
 850   2                      i[2] = 0;
 851   2                      i[3] = 0;
 852   2              }
 853   1              single_transmit((unsigned char *)&i, 4);
 854   1      }
 855          
 856          //厂商请求处理
 857          void read_write_register(void)
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 15  

 858          {
 859   1              unsigned char i,len,epstatus;
 860   1      
 861   1              if(ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
 862   1              {
 863   2                      if(bEPPflags.bits.verbose)
 864   2                              printf("Read Registers: Offset = 0x%x, Length = 0x%x, Index = 0x%x.\n",
 865   2                                      ControlData.DeviceRequest.wValue,
 866   2                                      ControlData.DeviceRequest.wLength,
 867   2                                      ControlData.DeviceRequest.wIndex);
 868   2      
 869   2                      if(ControlData.DeviceRequest.wIndex == GET_FIRMWARE_VERSION &&
 870   2                              ControlData.DeviceRequest.wValue == 0 &&
 871   2                              ControlData.DeviceRequest.wLength == 1)
 872   2                              get_firmware_version();//获取固件版本号
 873   2                      else
 874   2                              if(ControlData.DeviceRequest.wIndex == GET_BUFFER_SIZE &&
 875   2                              ControlData.DeviceRequest.wValue == 0 &&
 876   2                              ControlData.DeviceRequest.wLength == 4)
 877   2                              get_buffer_size();//获取缓冲区大小
 878   2                      else
 879   2                              stall_ep0();
 880   2      
 881   2              }       // if read register
 882   1              else
 883   1              {
 884   2                      if(bEPPflags.bits.verbose)
 885   2                      {
 886   3      
 887   3                              printf("Write Registers: Offset = 0x%x, Length = 0x%x, Index = 0x%x.\n",
 888   3                                      ControlData.DeviceRequest.wValue,
 889   3                                      ControlData.DeviceRequest.wLength,
 890   3                                      ControlData.DeviceRequest.wIndex);
 891   3      
 892   3                              printf("Data: ");
 893   3                              for(i = 0; i < ControlData.DeviceRequest.wLength; i ++)
 894   3                                      printf("0x%bx, ", *((ControlData.dataBuffer)+i));
 895   3                              printf("\n");
 896   3                      }
 897   2      
 898   2                      if(ControlData.DeviceRequest.wIndex == SETUP_DMA_REQUEST &&
 899   2                              ControlData.DeviceRequest.wValue == 0 &&
 900   2                              ControlData.DeviceRequest.wLength == 6)
 901   2                      {
 902   3                              if(ControlData.dataBuffer[5]==0x81)
 903   3                              {
 904   4                                      D12_WriteEndpoint(5, ControlData.dataBuffer[3], EpBuf);//发送数据
 905   4                              }
 906   3                              if(ControlData.dataBuffer[5]==0x80)
 907   3                              {
 908   4                                      epstatus=D12_ReadEndpointStatus(4);
 909   4                                      epstatus &= 0x60;
 910   4                                      if (epstatus == 0x60)
 911   4                                              len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
 912   4                              }
 913   3                              single_transmit(0, 0);
 914   3                              //setup_dma_request();//DMA设置处理,因为未使用DMA所以屏蔽掉
 915   3                      }
 916   2                      else
 917   2                              stall_ep0();
 918   2              }       // if write register
 919   1      }
C51 COMPILER V7.20   USB                                                                   07/30/2004 10:23:30 PAGE 16  

 920          
 921          //定时器0初始化程序
 922          //定时器用来定时检测按键状态
 923          void init_timer0(void)
 924          {
 925   1              TMOD &= 0XF0;                    /* clear Timer 0   */
 926   1              TMOD  |= 0X1;
 927   1              TL0 = 0X0;                   /* value set by user    */
 928   1              TH0 = 0X0;                  /* value set by user  */
 929   1              ET0 = 1;        /* IE.1*/
 930   1              TR0 = 1;                /* TCON.4 start timer  */
 931   1              PT0 = 1;
 932   1      
 933   1              EA = 1;
 934   1      }
 935          //中断设置
 936          void init_special_interrupts(void)
 937          {
 938   1              IT0 = 0;
 939   1              EX0 = 1;
 940   1              PX0 = 0;
 941   1      }
 942          
 943          //I/O口初始化程序
 944          void init_port()
 945          {
 946   1              P0 = 0xFF;
 947   1              P1 = 0xFF;
 948   1              P2 = 0xFF;
 949   1              P3 = 0xFF;
 950   1              MCU_D12CS = 0x0;
 951   1              D12SUSPD = 0;
 952   1      }
 953          
 954          //串行口设置
 955          void init_serial(void)
 956          {
 957   1              SCON = 0X52;
 958   1              PCON = 0X80 | PCON;
 959   1              TMOD = 0X20;
 960   1              TCON = 0x69;    // TCON
 961   1              TH1 = 0xFA;
 962   1      }
 963          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2899    ----
   CONSTANT SIZE    =    931    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     36      56
   IDATA SIZE       =     86    ----
   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 + -