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

📄 usb_setup.lst

📁 源码 : KIEL C 单片机 : C8051F320 功能 : U盘 (64M) 关键字 : C8051F320,U盘,NANDFLASH,FAT,SCH 描述 : 源码完全可运行
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.12  USB_SETUP                                                              08/20/2006 19:41:25 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE USB_SETUP
OBJECT MODULE PLACED IN Usb_Setup.OBJ
COMPILER INVOKED BY: C:\keil\C51\BIN\c51.exe Usb_Setup.c DB OE

stmt level    source

*** WARNING C500 IN LINE 1 OF USB_SETUP.C: MISSING DEVICE (SECURITY KEY NOT FOUND)
   1          #include "c8051F320.h"
   2          #include "stdio.h"
   3          #include "intrins.h"
   4          /////////////////////////////
   5          #include "Usb_Descreptor.h"
   6          #include "Usb_FunDec.h"
   7          #include "Usb_Parameter.h"
   8          #include "Usb_Register.h"
   9          #include "Usb_Request.h"
  10          
  11          //全局变量
  12          static unsigned int   DataSize;                  		// 需要端点0发送的数据大小
  13          static unsigned int   DataSent;                  		// 端点0已经发送的数据大小
  14          static unsigned char  *DataPtr;                  		// 端点0发送数据的指针
  15          static unsigned char  ONES_PACKET[2] = {0x01, 0x00};    // 在Get_Status等命令中应用的数组
  16          static unsigned char  ZERO_PACKET[2] = {0x00, 0x00};    // 在Get_Status等命令中应用的数组
  17          
  18          unsigned char  Ep_Status[3]	={EP_IDLE,EP_STALL,EP_STALL};   // 定义端点的状态
  19          unsigned char  USB_State	=DEV_ATTACHED;	                // 定义设备的状态
  20          struct Usb_Setup						// Setup阶段收到的8字节的命令,此处定义为结构
  21          {
  22          	unsigned char bmRequestType;
  23          	unsigned char bRequest;
  24          	unsigned char wValue[2];
  25          	unsigned char wIndex[2];
  26          	unsigned char wLength[2];
  27          }Setup;
  28          
  29          ///////////////////////////////////////////////////////////////////////////////////////////////
  30          void Handle_Setup()						//端点0中断处理函数
  31          {
  32   1          unsigned char ControlReg=0;         // 存放端点0控制/状态寄存器值的变量
  33   1          UWrite_Byte(INDEX, 0);           	// 指向端点0
  34   1          URead_Byte(E0CSR, ControlReg);  	// 读端点0控制寄存器
  35   1          if (ControlReg & rbSUEND)           // 如果上次数据阶段提前结束
  36   1          {  
  37   2      		UWrite_Byte(E0CSR, rbDATAEND);  // 当前数据传完                                
  38   2              UWrite_Byte(E0CSR, rbSSUEND);   // 清除SUEND标志
  39   2              Ep_Status[0] = EP_IDLE;         // 端点返回到空闲状态
  40   2          }
  41   1          if (ControlReg & rbSTSTL)           // 如果上次传输因错误而发送了STALL使传输提前结束
  42   1          {                                  
  43   2              UWrite_Byte(E0CSR, 0);          // 清除STALL
  44   2              Ep_Status[0] = EP_IDLE;			// 端点0返回到空闲状态
  45   2          }
  46   1      
  47   1      	if (ControlReg & rbOPRDY)           // 如果接收到输出数据包
  48   1      	{
  49   2      	    if (Ep_Status[0] == EP_IDLE)    // 如果端点0空闲
  50   2      		{
  51   3      			Fifo_Read(FIFO_EP0,8,(unsigned char *)&Setup);		// 读取设置数据包,8个字节
  52   3      			switch(Setup.bRequest)  				    // 判断请求类型   
  53   3      			{                              
  54   4      				case GET_STATUS:		Get_Status();		break;				     	
C51 COMPILER V6.12  USB_SETUP                                                              08/20/2006 19:41:25 PAGE 2   

  55   4      				case CLEAR_FEATURE:		Clear_Feature();	break;
  56   4      				case SET_FEATURE:    	Set_Feature(); 		break;   
  57   4      				case SET_ADDRESS:		Set_Address();	 	break;	
  58   4      				case GET_DESCRIPTOR:	Get_Descriptor();	break;	
  59   4      				case GET_CONFIGURATION:	Get_Configuration();break;
  60   4      				case SET_CONFIGURATION:	Set_Configuration();break;
  61   4      				case GET_INTERFACE:		Get_Interface();	break;
  62   4      				case SET_INTERFACE:		Set_Interface();	break;		
  63   4      				case GET_MAXLUN:		Get_Maxlun();		break;
  64   4      				default:				Force_Stall();		break;			
  65   4      	     	}	
  66   3      			                 
  67   3      		/////////////////////////////////////////////////////////////////////////////////////////////
  68   3      		}
  69   2      		else if(Ep_Status[0]==EP_RX)	// 如果在OUT状态,此程序中不会从端点0接收其它信息,所以没相关的操作
  70   2      		{}
  71   2      	}
  72   1      	if (Ep_Status[0] == EP_TX)			// 如果在IN状态
  73   1      	{
  74   2      		    unsigned char ControlReg=0,TempReg=0;	// 存放寄存器值的变量                                      
  75   2      			URead_Byte(E0CSR, ControlReg);			// 读端点0控制寄存器                              
  76   2      			TempReg = rbINPRDY;                     // 输出数据准备好           
  77   2      			if (DataSize >= EP0_PACKET_SIZE)		// 如果待发送数据的长度大于端点0长度
  78   2      			{
  79   3      				Fifo_Write(FIFO_EP0, EP0_PACKET_SIZE,DataPtr);	// 发送数据包
  80   3      		        DataPtr  += EP0_PACKET_SIZE;                    // 更新数据指针
  81   3      		        DataSize -= EP0_PACKET_SIZE;                    // 更新待发送的数据量
  82   3      		        DataSent += EP0_PACKET_SIZE;                    // 更新已发送的数据量
  83   3      		    }
  84   2      			else                        			// 如果待发送数据的长度小于端点0长度
  85   2      			{
  86   3      				Fifo_Write(FIFO_EP0, DataSize,DataPtr);	// 发送剩余的数据       
  87   3      		        TempReg |= rbDATAEND;                  	// 指示数据发送完备,进入状态阶段		               
  88   3      		        Ep_Status[0] = EP_IDLE;                 // 端点返回到空闲状态               
  89   3      			}
  90   2      			if (DataSent == (Setup.wLength[0]+256*Setup.wLength[1]))	//如果发送的数据量正好是端点0的整数倍
  91   2      			                            
  92   2      		    {
  93   3      		        TempReg |= rbDATAEND;    // 指示数据发送完备,进入状态阶段
  94   3      		        Ep_Status[0] = EP_IDLE;  // 端点返回到空闲状态
  95   3      		    }
  96   2      		        UWrite_Byte(E0CSR, TempReg);  // 写端点0控制寄存器
  97   2          }
  98   1      }
  99          
 100          void Force_Stall()
 101          {
 102   1      	UWrite_Byte(INDEX, 0);
 103   1          UWrite_Byte(E0CSR, rbSDSTL);       // 发送STALL
 104   1          Ep_Status[0] = EP_STALL;           // 端点0到STALL状态,直到下次复位
 105   1      }
 106          
 107          //处理标准请求的函数
 108          void Get_Status()
 109          {	
 110   1         	switch(Setup.bmRequestType)                  
 111   1         	{
 112   2            	case IN_DEVICE:                          	// 如果是设备的状态
 113   2                 	DataPtr = ZERO_PACKET;               	// 发送 0x00, 总线供电,不支持远程唤醒
 114   2                 	DataSize = 2;                        	
 115   2                 	break;      
 116   2            	case IN_INTERFACE:                       	// 接口状态
C51 COMPILER V6.12  USB_SETUP                                                              08/20/2006 19:41:25 PAGE 3   

 117   2                 	DataPtr = ZERO_PACKET;               	// 接口状态永远返回0
 118   2                 	DataSize = 2;         
 119   2                 	break;  
 120   2            	case IN_ENDPOINT:                        	// 端点状态
 121   2                 	if (Setup.wIndex[0] == IN_EP1)          // 如果是端点1
 122   2      			{
 123   3      				if (Ep_Status[1] == EP_HALT)
 124   3      				{                               // 如果端点1在EN_HALT状态
 125   4      					DataPtr = ONES_PACKET;		// 发送ONES_PACKET,指示端点1在HALT状态
 126   4      	                DataSize = 2;
 127   4      	            }
 128   3      	            else
 129   3      	            {
 130   4      	                DataPtr = ZERO_PACKET;		// 否则发送ZERO_PACKET,指示端点1在空闲状态
 131   4      	                DataSize = 2;
 132   4      	            }
 133   3      			}
 134   2      	        if (Setup.wIndex[0] == OUT_EP2)
 135   2      	        {                                 
 136   3      				if (Ep_Status[2] == EP_HALT) 
 137   3      				{
 138   4      					DataPtr = ONES_PACKET;
 139   4      	                DataSize = 2;
 140   4      				}
 141   3      	            else
 142   3      				{
 143   4      					DataPtr = ZERO_PACKET;
 144   4      					DataSize = 2;
 145   4      				}
 146   3      			}
 147   2                  break;
 148   2            default:	Force_Stall();	break;           
 149   2      	}
 150   1         if (Ep_Status[0] != EP_STALL)
 151   1         {
 152   2         		UWrite_Byte(E0CSR, rbSOPRDY);                       
 153   2            	Ep_Status[0] = EP_TX;                     // 端点0在EP_TX状态
 154   2            	DataSent = 0;								// 已发送数据量清零
 155   2         }
 156   1      }
 157          
 158          void Clear_Feature()
 159          {
 160   1      	if ((Setup.bmRequestType & 0x02)&&			// 如果是端点
 161   1              (Setup.wValue[0] == ENDPOINT_HALT)  && 	// 并且这些端点的状态是EP_HALT
 162   1             ((Setup.wIndex[0] == IN_EP1) ||         	// 并且选择的是端点1 IN
 163   1              (Setup.wIndex[0] == OUT_EP2)))         	// 或端点2 OUT 
 164   1      	{
 165   2               if (Setup.wIndex[0] == IN_EP1) 
 166   2               {
 167   3                  UWrite_Byte (INDEX, 1);             // 使toggle复位为零
 168   3                  UWrite_Byte (EINCSRL, rbInCLRDT);       
 169   3                  Ep_Status[1] = EP_IDLE;             // 端点1到空闲状态                    
 170   3               }
 171   2               else
 172   2               {
 173   3                  UWrite_Byte (INDEX, 2);         
 174   3                  UWrite_Byte (EOUTCSRL, rbOutCLRDT);         
 175   3                  Ep_Status[2] = EP_IDLE;             
 176   3               }
 177   2      	}
 178   1      	else
C51 COMPILER V6.12  USB_SETUP                                                              08/20/2006 19:41:25 PAGE 4   

⌨️ 快捷键说明

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