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

📄 bulk_only.lst

📁 实现U盘功能的单片机程序,单片机为C8051F340
💻 LST
📖 第 1 页 / 共 2 页
字号:
 182   1              TransCSW();
 183   1      }
 184          void SCSI_Verify(void)
 185          {
 186   1              TransCSW();
 187   1      }
 188          void SCSI_Reserved(void)
 189          {
 190   1      }
 191          void TransCSW()
 192          {
 193   1              Fifo_Write(FIFO_EP1, 13, Bulk_CSW);
 194   1              UWrite_Byte(INDEX, 1);
 195   1              UWrite_Byte(EINCSRL, rbInINPRDY);   
 196   1              Bulk_Status=BULK_IDLE;                                 
 197   1      }
 198          ///////////////////////////////////////////////////////////////////////////////////////////////////
 199          void SCSI_Read10()
 200          {
 201   1              unsigned int i=0;
 202   1              LED_g=~LED_g;
 203   1              for(i=0;i<4;i++)                                                // 计算LBA,CBWCB的第2、3、4和5位代表LBA
 204   1              {
 205   2                      LBA=(LBA<<8)+Bulk_CBW.CBWCB[2+i];
 206   2              }
 207   1              Transfer_Length = Bulk_CBW.CBWCB[7]*256 + Bulk_CBW.CBWCB[8];    //传输的长度,CBWCB的第7和8位代表传输长度
 208   1              nCurrentBlock = LBA / 32;               //计算FLASH的物理地址   
 209   1              nCurrentPage  = LBA % 32;
 210   1      
 211   1              Flash_Read_Page(nCurrentBlock,nCurrentPage,Bulk_PACKET,512);    //向页缓冲区读1页
 212   1      
 213   1              Transfer_Length--;              //待传输的扇区数减1
 214   1              nCurrentPage++;                 //当前页序号加1
 215   1      
 216   1              Bulk_Status = BULK_DATA_TRANS;          //Bulk在传输状态
 217   1              pCurrentBuf = Bulk_PACKET;                      //指针指向页缓冲区
 218   1              nBufCount=0;    
 219   1      
 220   1              Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);             //在双缓冲方式,一次可以向FIFO写两个数据包
 221   1              UWrite_Byte(INDEX, 1);
 222   1              UWrite_Byte(EINCSRL, rbInINPRDY);
 223   1              nBufCount+=EP1_PACKET_SIZE;
 224   1              Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);
 225   1              UWrite_Byte(INDEX, 1);
 226   1              UWrite_Byte(EINCSRL, rbInINPRDY);               
 227   1      }
 228          void TransDataGoOn()
 229          {
 230   1              unsigned int i=0;
 231   1      
 232   1              if(nBufCount<384)
 233   1              {
 234   2                      nBufCount+=EP1_PACKET_SIZE;             
 235   2                      Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);     //在双缓冲方式,一次可以向FIFO写两个数据包
 236   2                      UWrite_Byte(INDEX, 1);
 237   2                      UWrite_Byte(EINCSRL, rbInINPRDY);
 238   2                      nBufCount+=EP1_PACKET_SIZE;
C51 COMPILER V7.20   BULK_ONLY                                                             06/23/2008 19:39:40 PAGE 5   

 239   2                      Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);
 240   2                      UWrite_Byte(INDEX, 1);
 241   2                      UWrite_Byte(EINCSRL, rbInINPRDY);                       
 242   2              }
 243   1              else if(Transfer_Length>0)
 244   1              {
 245   2                      if(nCurrentPage==32)
 246   2                      {
 247   3                              nCurrentBlock++;
 248   3                              nCurrentPage=0;
 249   3                      }
 250   2                      else
 251   2                      {}
 252   2                      Flash_Read_Page(nCurrentBlock,nCurrentPage,Bulk_PACKET,512);
 253   2                      nCurrentPage++;
 254   2                      Transfer_Length--;
 255   2                      nBufCount=0;
 256   2                      pCurrentBuf=Bulk_PACKET;
 257   2                      Bulk_Status=BULK_DATA_TRANS;
 258   2                      Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);//在双缓冲方式,一次可以向FIFO写两个数据包
 259   2                      UWrite_Byte(INDEX, 1);
 260   2                      UWrite_Byte(EINCSRL, rbInINPRDY);       
 261   2                      nBufCount+=EP1_PACKET_SIZE;
 262   2                      Fifo_Write(FIFO_EP1,EP1_PACKET_SIZE,pCurrentBuf+nBufCount);
 263   2                      UWrite_Byte(INDEX, 1);
 264   2                      UWrite_Byte(EINCSRL, rbInINPRDY);       
 265   2              }
 266   1              else
 267   1              {
 268   2                      Bulk_Status=BULK_DATA_END;
 269   2                      nBufCount=0;
 270   2                      TransCSW();
 271   2              }
 272   1      }
 273          /////////////////////////////////////////////////////////////////////////////////////////////////
 274          void SCSI_Write10(void)
 275          {
 276   1              unsigned int i=0;
 277   1              LED_g=~LED_g;
 278   1              for(i=0;i<4;i++)
 279   1              {
 280   2                      LBA=(LBA<<8)+Bulk_CBW.CBWCB[2+i];
 281   2              }
 282   1              Transfer_Length = Bulk_CBW.CBWCB[7]*256 + Bulk_CBW.CBWCB[8];
 283   1              nCurrentBlock=LBA/32;   
 284   1              nCurrentPage =LBA%32;
 285   1              nBegainPage = nCurrentPage;
 286   1      
 287   1              Bulk_Status = BULK_DATA_RECIEVE;
 288   1              pCurrentBuf = Bulk_PACKET;
 289   1              nBufCount   = 0;
 290   1      
 291   1              Flash_Erase_Block(Bufer_Block);                 //擦除缓冲区BLOCK
 292   1      
 293   1      }
 294          
 295          void Bulk_Receive_Data()
 296          {
 297   1              unsigned int i=0;
 298   1              Copy(pCurrentBuf+nBufCount,Bulk_Buffer,EP2_PACKET_SIZE);
 299   1              nBufCount+=EP2_PACKET_SIZE;
 300   1              if(nBufCount==512)                                                      //如果一扇区内容接收完毕
C51 COMPILER V7.20   BULK_ONLY                                                             06/23/2008 19:39:40 PAGE 6   

 301   1              {
 302   2                      Flash_Write_Page(Bufer_Block,nCurrentPage,Bulk_PACKET,512);     //将数据暂时写到缓冲区BLOCK     
 303   2                      nCurrentPage++;                                                 //页指针加1
 304   2                      Transfer_Length--;                                              //待传输数据长度减1
 305   2                      nBufCount=0;
 306   2              }
 307   1      
 308   1              if((Transfer_Length>0)&&(nCurrentPage == 32))           //如果一个BLOCK写完毕
 309   1              {
 310   2                      for(i=0;i<nBegainPage;i++)
 311   2                      {
 312   3                              Flash_Read_Page(nCurrentBlock,i,Bulk_PACKET,512);
 313   3                              Flash_Write_Page(Bufer_Block,i,Bulk_PACKET,512);
 314   3                      }
 315   2                      Flash_Erase_Block(nCurrentBlock);
 316   2                      for(i=0;i<32;i++)
 317   2                      {
 318   3                              Flash_Read_Page(Bufer_Block,i,Bulk_PACKET,512);
 319   3                              Flash_Write_Page(nCurrentBlock,i,Bulk_PACKET,512);
 320   3                      }
 321   2                      nCurrentBlock++;
 322   2                      nCurrentPage=0;
 323   2                      nBufCount=0;
 324   2                      nBegainPage=0;
 325   2                      Flash_Erase_Block(Bufer_Block);
 326   2              }
 327   1      
 328   1              if(Transfer_Length==0)
 329   1              {
 330   2                      for(i=0;i<nBegainPage;i++)
 331   2                      {
 332   3                              Flash_Read_Page(nCurrentBlock,i,Bulk_PACKET,512);
 333   3                              Flash_Write_Page(Bufer_Block,i,Bulk_PACKET,512);
 334   3                      }
 335   2                      for(i=nCurrentPage;i<32;i++)
 336   2                      {
 337   3                              Flash_Read_Page(nCurrentBlock,i,Bulk_PACKET,512);
 338   3                              Flash_Write_Page(Bufer_Block,i,Bulk_PACKET,512);
 339   3                      }
 340   2                      Flash_Erase_Block(nCurrentBlock);
 341   2                      for(i=0;i<32;i++)
 342   2                      {
 343   3                              Flash_Read_Page(Bufer_Block,i,Bulk_PACKET,512);
 344   3                              Flash_Write_Page(nCurrentBlock,i,Bulk_PACKET,512);
 345   3                      }
 346   2                      TransCSW();                                       
 347   2              }
 348   1      }
 349          void Copy(unsigned char *PEnd,unsigned char *PSource,unsigned int num)
 350          {
 351   1              unsigned int i=0;
 352   1              for(i=0;i<num;i++)
 353   1              {
 354   2                      *(PEnd+i)=*(PSource+i);
 355   2              }
 356   1      }
 357          
 358          ////////////////////////////////////////////////////////////////////////////////////////////////


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1802    ----
C51 COMPILER V7.20   BULK_ONLY                                                             06/23/2008 19:39:40 PAGE 7   

   CONSTANT SIZE    =     68    ----
   XDATA SIZE       =    607    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     29      12
   IDATA SIZE       =   ----    ----
   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 + -