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

📄 bulk_only.lst

📁 实现U盘功能的单片机程序,单片机为C8051F340
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.20   BULK_ONLY                                                             06/23/2008 19:39:40 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE BULK_ONLY
OBJECT MODULE PLACED IN Bulk_Only.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe Bulk_Only.c DB OE

line level    source

   1          #include "c8051F340.h"
   2          #include "stdio.h"
   3          #include "intrins.h"
   4          /////////////////////////////
   5          #include "Usb_FunDec.h"
   6          #include "Usb_Parameter.h"
   7          #include "Usb_Register.h"
   8          #include "Usb_Request.h"
   9          #include "Usb_SCSI_Descreptor.h"
  10          ///////////////////////////////////////////////////////////////////////////////////////////
  11          sbit    LED_g                   = P2^4;         //LED控制脚
  12          // Bulk传输处理函数
  13          void Interpret_CBW(void);               // 解释CBW命令
  14          void TransDataGoOn(void);               // 继续传输
  15          void TransCSW(void);                    // 发送CSW
  16          void Bulk_Receive_Data(void);   // 接收数据
  17          void Copy(unsigned char *PEnd,unsigned char *PSource,unsigned int num); // 在Bulk_Out过程中将Bulk_Buffer中
             -的数据拷贝到Bulk_PACKET中
  18          // 外部函数调用
  19          extern void                     Flash_Read_Page(unsigned int BLockNum,unsigned char BlockPageNum,unsigned char *P,unsigned 
             -int Data_Length);
  20          extern unsigned char    Flash_Write_Page(unsigned int BLockNum,unsigned char BlockPageNum,unsigned char *P,u
             -nsigned int Data_Length);
  21          extern unsigned char    Flash_Erase_Block(unsigned int BlockNum);       
  22          // 外部变量
  23          extern unsigned char Ep_Status[3];
  24          // BUlk传输变量
  25          unsigned char Bulk_Status = BULK_IDLE;                          // Bulk传输状态
  26          unsigned char Bulk_CSW[13]={0x55,0x53,0x42,0x53,};
  27          xdata struct CBW
  28          {
  29                  unsigned char dCBWstagnature[4];
  30                  unsigned char dCBWTag[4];
  31                  unsigned char dCBWDataTransLength[4];
  32                  unsigned char bmCBWFlags;
  33                  unsigned char dCBWLun;
  34                  unsigned char dCBWCBLength;
  35                  unsigned char CBWCB[16];
  36          }Bulk_CBW;
  37          xdata unsigned char Bulk_PACKET[512];   // 读写FLASH时的数据缓冲区
  38          xdata unsigned char Bulk_Buffer[64];    // FIFO缓冲区
  39          unsigned int LBA=0;                                             // LBA
  40          unsigned int Transfer_Length=0;                 // 要传输的长度,单位为扇区
  41          unsigned int nCurrentBlock=0;                   // 当前的Block地址
  42          unsigned int nCurrentPage=0;                    // 当前的Page地址
  43          unsigned char *pCurrentBuf;                             // Bulk传输中的指针
  44          unsigned int nBufCount=0;                               // FIFO读写过程中传输的数据量
  45          unsigned int nBegainPage=0;                             // Bulk_Out传输中的开始Page地址
  46          /////////////////////////////////////////////////////////////////////////////////////////////                   
  47          void Handle_In1()
  48          {
  49   1          unsigned char ControlReg;
  50   1              UWrite_Byte(INDEX, 1);           
  51   1              URead_Byte(EINCSRL, ControlReg); 
  52   1              if (Ep_Status[1] == EP_HALT)         
C51 COMPILER V7.20   BULK_ONLY                                                             06/23/2008 19:39:40 PAGE 2   

  53   1              {
  54   2              UWrite_Byte(EINCSRL, rbInSDSTL);
  55   2              }
  56   1              else                                 
  57   1              {
  58   2                      if (ControlReg & rbInSTSTL)       
  59   2              {
  60   3                      UWrite_Byte(EINCSRL, rbInCLRDT);//清除SDSTL和STSTL,并将CLRDT写1使toggle复位为0
  61   3              }
  62   2                      if (ControlReg & rbInUNDRUN)            
  63   2              {
  64   3                      UWrite_Byte(EINCSRL, 0x00);             // 清除UNDRUN,注意toggle位不复位
  65   3              }
  66   2                      if(!(ControlReg & rbInINPRDY))
  67   2                      {
  68   3                              switch(Bulk_Status)
  69   3                              {
  70   4                                      case BULK_DATA_TRANS:   TransDataGoOn();        break;
  71   4                                      case BULK_DATA_END:             TransCSW();                     break;
  72   4                                      default:                                                                        break;
  73   4                              } 
  74   3                      }                                      
  75   2              }                                   
  76   1      }
  77          /////////////////////////////////////////////////////////////////////////////////////////////                   
  78          // Handle_Out2
  79          void Handle_Out2()
  80          {
  81   1              unsigned int   Count=0;
  82   1              unsigned char  ControlReg;
  83   1              UWrite_Byte(INDEX, 2);                          // Set index to endpoint 2 registers
  84   1              URead_Byte(EOUTCSRL, ControlReg);
  85   1              if (Ep_Status[2] == EP_HALT)            // If endpoint is halted, send a stall
  86   1              {
  87   2              UWrite_Byte(EOUTCSRL, rbOutSDSTL);
  88   2      
  89   2              }
  90   1              else
  91   1              {
  92   2                  if (ControlReg & rbOutSTSTL)        
  93   2                  {
  94   3                       UWrite_Byte(EOUTCSRL, rbOutCLRDT);     //清除SDSTL和STSTL,并将CLRDT写1使toggle复位为0
  95   3                  }
  96   2                              ////////////////////////////////////////////////////////////////
  97   2                      if(ControlReg & rbOutOPRDY)
  98   2                      {
  99   3                              UWrite_Byte(INDEX, 2); 
 100   3                              URead_Byte(EOUTCNTL, Count);
 101   3                              Fifo_Read(FIFO_EP2, Count, Bulk_Buffer);
 102   3                              UWrite_Byte(INDEX, 2);           
 103   3                      UWrite_Byte(EOUTCSRL, 0);       // Clear Out Packet ready bit
 104   3                              if((Bulk_Status !=BULK_DATA_RECIEVE) && (Bulk_Buffer[0]==0x55))
 105   3                              {
 106   4                                      Interpret_CBW();
 107   4                              }       
 108   3                              else
 109   3                              {                       
 110   4                                      Bulk_Receive_Data();
 111   4                              }
 112   3                      }
 113   2              }
 114   1      }
C51 COMPILER V7.20   BULK_ONLY                                                             06/23/2008 19:39:40 PAGE 3   

 115          ///////////////////////////////////////////////////////////////////////////////////////////////////
 116          void Interpret_CBW()
 117          {
 118   1              unsigned char i=0;
 119   1              Bulk_CSW[4] = Bulk_Buffer[4];
 120   1              Bulk_CSW[5] = Bulk_Buffer[5];
 121   1              Bulk_CSW[6] = Bulk_Buffer[6];
 122   1              Bulk_CSW[7] = Bulk_Buffer[7];
 123   1              for(i=0;i<12;i++)                                                       //提取SCSI命令字
 124   1              {
 125   2                      Bulk_CBW.CBWCB[i] = Bulk_Buffer[15+i];
 126   2              }
 127   1              switch(Bulk_CBW.CBWCB[0])
 128   1              {
 129   2                      case INQUIRY:                                   SCSI_Inquiry();                                 break;
 130   2                      case MODE_SENSE:                                SCSI_Mode_Sense();                              break;
 131   2                      case READ10:                                    SCSI_Read10();                                  break;
 132   2                      case READ_CAPACITY:                     SCSI_Read_Capacity();                   break;
 133   2                      case TEST_UNIT_READY:                   SCSI_Test_Unit_Ready();                 break;
 134   2                      case VERIFY:                                    SCSI_Verify();                                  break;
 135   2                      case WRITE10:                                   SCSI_Write10();                                 break;
 136   2                      case MEDIUM_REMOVAL:                    SCSI_Medium_Removal();                  break;
 137   2      
 138   2                      case Vender_Order:                              SCSI_Vender_Order();                    break;
 139   2                      default:                                                SCSI_Reserved();                                break;
 140   2              }       
 141   1      }
 142          ///////////////////////////////////////////////////////////////////////////////////////////////////                     
 143          void SCSI_Inquiry(void)
 144          {
 145   1              if(Bulk_CBW.CBWCB[4]!=0)
 146   1              {
 147   2                      Bulk_Status=BULK_DATA_END;
 148   2                      Fifo_Write(FIFO_EP1,sizeof(Device_InquiryData),Device_InquiryData);
 149   2                      UWrite_Byte(INDEX, 1);
 150   2                      UWrite_Byte(EINCSRL, rbInINPRDY);
 151   2              }
 152   1              else
 153   1              {}
 154   1      }
 155          void SCSI_Mode_Sense(void)
 156          {
 157   1              Bulk_Status=BULK_DATA_END;
 158   1              Fifo_Write(FIFO_EP1,sizeof(Device_ModeSense),Device_ModeSense);
 159   1              UWrite_Byte(INDEX, 1);
 160   1              UWrite_Byte(EINCSRL, rbInINPRDY);
 161   1      }
 162          void SCSI_Read_Capacity(void)
 163          {
 164   1              Bulk_Status=BULK_DATA_END;
 165   1              Fifo_Write(FIFO_EP1,sizeof(Device_Capacity),Device_Capacity);
 166   1              UWrite_Byte(INDEX, 1);
 167   1              UWrite_Byte(EINCSRL, rbInINPRDY);
 168   1      }
 169          void SCSI_Vender_Order()
 170          {
 171   1              Bulk_Status=BULK_DATA_END;
 172   1              Fifo_Write(FIFO_EP1,sizeof(Vender_Order),Vender_Order);
 173   1              UWrite_Byte(INDEX, 1);
 174   1              UWrite_Byte(EINCSRL, rbInINPRDY);
 175   1      }
 176          void SCSI_Test_Unit_Ready(void)
C51 COMPILER V7.20   BULK_ONLY                                                             06/23/2008 19:39:40 PAGE 4   

 177          {
 178   1              TransCSW();
 179   1      }
 180          void SCSI_Medium_Removal(void)
 181          {

⌨️ 快捷键说明

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