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

📄 sd.lst

📁 FS7805 使用SD卡的demo
💻 LST
📖 第 1 页 / 共 3 页
字号:
 542   1              return Status;
 543   1          
 544   1          SdWaitCard();
 545   1            
 546   1          return STATUS_SUCCESS; 
 547   1      }   
 548          //----------------------------------------------------------------------------
 549          STATUS SdWaitCmd()
C51 COMPILER V7.50   SD                                                                    04/17/2007 10:40:23 PAGE 10  

 550          {   
 551   1              CmdTimer = SD_CMD_TIMEOUT;      
 552   1              while((!(SDMI_INT&bmSD_COMPLETE_INT))&&CmdTimer); //
 553   1              SDMI_INT&=~bmSD_COMPLETE_INT; //
 554   1          
 555   1              if (CmdTimer)
 556   1                      return STATUS_SUCCESS;
 557   1              else 
 558   1              {
 559   2                      SdCtrlReset();
 560   2                      return STATUS_FLASH_ERROR;
 561   2              }
 562   1      }   
 563              
 564          //----------------------------------------------------------------------------
 565          /*
 566          STATUS SdSetBlockLen(INT16U len)
 567          {   
 568              STATUS Status;
 569              
 570              SdWaitCard();
 571              
 572                  *((INT32U *)(&SdCmdBuf[1]))=len;
 573              Status = SdSendCmd(SET_BLOCK_LEN,SdCmdBuf);
 574                  if(Status == STATUS_SUCCESS)
 575              {
 576                  SDMI_LENH=len>>8;
 577                  SDMI_LENL=len;
 578              }
 579                     
 580              return Status;   
 581          }   
 582           */   
 583          //--------------------------------------------------------------------
 584          // Read first sector of data from SD/MMC
 585          //--------------------------------------------------------------------
 586          STATUS SdReadOneSector()
 587          {
 588   1              STATUS Status;
 589   1          int RetryCount1 , RetryCount2;
 590   1          BOOL ReadyForData;
 591   1      
 592   1              if (!SdCardExist())
 593   1                      return STATUS_FLASH_ERROR;
 594   1      
 595   1          if(SectorStart > SdAvailableBlocks)
 596   1              return STATUS_PARAM_ERROR;
 597   1      
 598   1          SdWaitCard();
 599   1        
 600   1          for(RetryCount1 = 0; RetryCount1 < 5; RetryCount1++)
 601   1          {
 602   2              ReadyForData = FALSE;
 603   2              for(RetryCount2 = 0; RetryCount2 < 20; RetryCount2++)
 604   2              {
 605   3                  *((INT32U *)(&SdCmdBuf[1])) = RCA;
 606   3                  Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
 607   3                  if(Status != STATUS_SUCCESS)
 608   3                      continue;  
 609   3                  if(SdRespBuf[3] & 0x01) // READY_FOR_DATA in Card Status
 610   3                  {
 611   4                      ReadyForData = TRUE;
C51 COMPILER V7.50   SD                                                                    04/17/2007 10:40:23 PAGE 11  

 612   4                      break;
 613   4                  }
 614   3              }        
 615   2              if(!ReadyForData)
 616   2                  continue;
 617   2                  
 618   2                      //SDMI_BUFBASE=0xEC; //FIFOA0
 619   2                             
 620   2              *((INT32U *)(&SdCmdBuf[1])) = 
 621   2                  SectorStart << BYTES_PER_SECTOR_SHIFT;
 622   2      
 623   2                      //***********************8
 624   2              if (SectorCount > 1) // Muti-Read.
 625   2              {    
 626   3                              SDMI_CTL|=bmSD_AUTO_CLK_EN;     
 627   3                      Status = SdSendCmd(READ_MUL_BLOCK, SdCmdBuf);
 628   3                      if(Status != STATUS_SUCCESS)
 629   3                      continue;
 630   3              }
 631   2              else
 632   2              {
 633   3                              Status = SdSendCmd(READ_BLOCK, SdCmdBuf);
 634   3                      if(Status != STATUS_SUCCESS)
 635   3                              continue;
 636   3              }
 637   2      //*******************************   
 638   2              if(SDMI_ST&bmSD_CRC16_ERR)//
 639   2              {
 640   3                  SDMI_ST &=~bmSD_CRC16_ERR;
 641   3                  continue;
 642   3              }
 643   2              else
 644   2                  return STATUS_SUCCESS;
 645   2          }
 646   1          return STATUS_FLASH_ERROR;
 647   1      }
 648          
 649          //----------------------------------------------------------------------------
 650          //  Description:
 651          //    Read one sector of data from the SD device 
 652          //----------------------------------------------------------------------------
 653          STATUS SdReadNextSectorData()
 654          {
 655   1              STATUS Status;
 656   1              bit Stop;
 657   1      
 658   1              Stop = SectorCount == 1;
 659   1      
 660   1      
 661   1              
 662   1              SDMI_CMD=SD_CMD_RX_DATA_ONLY;  //       
 663   1              SDMI_CTL|=bmSD_AUTO_CLK_EN;    //
 664   1              if ((Status = SdWaitCmd()) != STATUS_SUCCESS)//
 665   1                      return Status;
 666   1      
 667   1              if(SDMI_ST&bmSD_CRC16_ERR) // CRC7 Error
 668   1              {
 669   2                      SDMI_ST&=~bmSD_CRC16_ERR; // Clear INT
 670   2                      return STATUS_DATA_ERROR;
 671   2              }
 672   1              
 673   1              if (Stop)
C51 COMPILER V7.50   SD                                                                    04/17/2007 10:40:23 PAGE 12  

 674   1                      return SdStopCmd();
 675   1              
 676   1              return STATUS_SUCCESS;
 677   1      }
 678          
 679          STATUS SdReadSector()
 680          {
 681   1          STATUS Status = SdReadOneSector();
 682   1          SectorStart ++;
 683   1          return Status;
 684   1      }
 685          
 686          STATUS SdReadNextSector()
 687          {
 688   1          BYTE        RetryCount;
 689   1      
 690   1              STATUS Status = SdReadNextSectorData();
 691   1          if(Status != STATUS_SUCCESS)
 692   1              {
 693   2                      for(RetryCount = 0 ; RetryCount < 5; RetryCount ++)
 694   2                      {
 695   3                              Status = SdStopCmd();
 696   3                              if(Status != STATUS_SUCCESS)
 697   3                                      continue;
 698   3                              Status = SdReadOneSector();
 699   3                                      break;
 700   3                      }       
 701   2              }
 702   1          SectorStart ++;
 703   1          return Status;
 704   1      }
 705          //--------------------------------------------------------------------
 706          // Write one sector of data to SD/MMC
 707          //--------------------------------------------------------------------
 708          STATUS SdWriteOneSector()
 709          {
 710   1          STATUS Status;
 711   1          BYTE CrcSts;
 712   1          int RetryCount1 , RetryCount2;
 713   1          BOOL ReadyForData;
 714   1      
 715   1          if(SDMI_ST & bmSD_WR_PROTECT)
 716   1              return STATUS_WRITE_PROTECT;
 717   1        
 718   1          SdWaitCard();
 719   1      
 720   1              //MMCtest ++;
 721   1          for(RetryCount1 = 0; RetryCount1 < 5; RetryCount1++)
 722   1          {
 723   2              ReadyForData = FALSE;
 724   2              for(RetryCount2 = 0; RetryCount2 < 20; RetryCount2++)
 725   2              {
 726   3                  *((INT32U *)(&SdCmdBuf[1])) = RCA;
 727   3                  Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
 728   3                  if(Status != STATUS_SUCCESS) //MMCerror1++;
 729   3                      continue;  
 730   3                  if(SdRespBuf[3] & 0x01) // READY_FOR_DATA in Card Status
 731   3                  {
 732   4                      ReadyForData = TRUE;
 733   4                      break;
 734   4                  }
 735   3              }        
C51 COMPILER V7.50   SD                                                                    04/17/2007 10:40:23 PAGE 13  

 736   2              if(!ReadyForData) //MMCerror2++;
 737   2                  continue;
 738   2      
 739   2              //SDMI_BUFBASE=0xF0; //FIFOB0
 740   2      
 741   2              *((INT32U *)(&SdCmdBuf[1])) = SectorStart << BYTES_PER_SECTOR_SHIFT;
 742   2                      //***********************8
 743   2                      if (SectorCount > 1) // Muti-Read.
 744   2                      {   
 745   3                  Status = SdSendCmd(WRITE_MUL_BLOCK, SdCmdBuf);
 746   3                  if(Status != STATUS_SUCCESS)
 747   3                      continue;
 748   3                      }
 749   2              else
 750   2                      {
 751   3                              Status = SdSendCmd(WRITE_BLOCK, SdCmdBuf);
 752   3                  if(Status != STATUS_SUCCESS)
 753   3                      continue;
 754   3                      }
 755   2                      //*******************************           
 756   2                      CrcSts = (SDMI_ST&0x38) >> 3;
 757   2                      if(CrcSts != GOOD_CRC16_STS) //MMCerror3++;
 758   2                              continue;
 759   2                      else    //*/
 760   2                              return STATUS_SUCCESS;
 761   2              }
 762   1          
 763   1          return STATUS_FLASH_ERROR;
 764   1      }
 765          
 766          //----------------------------------------------------------------------------
 767          //  Description:
 768          //    Write one sector of data from the SD device 
 769          //----------------------------------------------------------------------------
 770          STATUS SdWriteNextSector()
 771          {
 772   1              STATUS Status;
 773   1              BYTE CrcSts;
 774   1              bit Stop;
 775   1              
 776   1              Stop = SectorCount == 1;
 777   1              
 778   1              SdWaitCard();
 779   1              
 780   1              //SDMI_BUFBASE=0xF0; //FIFOB0
 781   1              
 782   1              SDMI_CMD=SD_CMD_TX_DATA_ONLY; 
 783   1              if ((Status = SdWaitCmd()) != STATUS_SUCCESS)
 784   1                      return Status;
 785   1              CrcSts = (SDMI_ST&0x38) >> 3;
 786   1              if (CrcSts != GOOD_CRC16_STS)
 787   1                      return STATUS_DATA_ERROR;
 788   1              
 789   1              if (Stop)
 790   1                      return SdStopCmd();
 791   1              
 792   1              return STATUS_SUCCESS;
 793   1      }
 794          
 795          STATUS SdWriteSector()
 796          {
 797   1          STATUS Status = SdWriteOneSector();
C51 COMPILER V7.50   SD                                                                    04/17/2007 10:40:23 PAGE 14  

 798   1          SectorStart ++;
 799   1          return Status;
 800   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2361    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     39    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8      41
   IDATA SIZE       =      9    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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