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

📄 sd.lst

📁 SdCard_V2.1TinyFatFs.rar是单片机实现SD卡功能的FAT文件系统
💻 LST
📖 第 1 页 / 共 5 页
字号:
 762   2              SdAvailableBlocks = (UINT32)((C_SIZE+1) << 10);//memory capacity blocks = (C_SIZE+1)*512KB/512B
 763   2      }
 764   1          SdAvailableBlocks -= 1;   //计算得到可用block数。默认block大小为512字节
 765   1      
 766   1          return STATUS_SUCCESS;
 767   1      }       
 768          #if 0
              //--------------------------------------------------------------------
              //读取SCR寄存器的值,判断SD卡确切的版本~
              STATUS SdReadSCR(void)  //----          
              {
                  STATUS Status;      
                  BYTE i;
              for(i = 0;i < 10;i++){ 
                  *((UINT32 *)(&SdCmdBuf[1])) = 0;
                      SDMI_BUFBASE=0xF2; //FIFOB1
                      SDMI_LENH = 0;
                      SDMI_LENL = 8;    
                  Status = SdSendAppCmd(SEND_SCR, SdCmdBuf);   //读取SD卡的SCR信息
                      SDMI_LENH = 0X02;
                      SDMI_LENL = 0;
                  if(Status == STATUS_SUCCESS) {//
                              if((*(BYTE xdata*)(0xf200)&0x0F)>= 1)  //SD 1.10,2.00卡
                                      SdVer2Flag = 1;
                              else 
                                      SdVer2Flag = 0;
                      return Status;
                      }
              }
                      SdVer2Flag = 0;
              }
              #endif
 794          #if 0
              STATUS SdProgCsd(void) //改写CSD
              {
                  STATUS Status;
                  //BYTE CrcSts;
C51 COMPILER V7.02b   SD                                                                   03/24/2008 15:52:29 PAGE 14  

                  int RetryCount1 , RetryCount2,i;
                  BOOL ReadyForData;
              
                  if(SDMI_ST & bmSD_WR_PROTECT)
                      return STATUS_WRITE_PROTECT;
                
                  SdWaitCard();
              
                  for(RetryCount1 = 0; RetryCount1 < 5; RetryCount1++)
                  {
                      ReadyForData = FALSE;
                      for(RetryCount2 = 0; RetryCount2 < 20; RetryCount2++)
                      {
                          *((INT32U *)(&SdCmdBuf[1])) = RCA;
                          Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
                          if(Status != STATUS_SUCCESS) //MMCerror1++;
                              continue;  
                          if(SdRespBuf[3] & 0x01) // READY_FOR_DATA in Card Status
                          {
                              ReadyForData = TRUE;
                              break;
                          }
                      }        
                      if(!ReadyForData) //MMCerror2++;
                          continue;
                              //SdReadCSD();
                      SDMI_BUFBASE=0xF2; //FIFOB0
                              for(i=0;i<17;i++)
                                      ((BYTE xdata *)DMA_FIFOB0)[i]=SdRespBufForProgCsd[i]; //.
                              ((BYTE xdata *)DMA_FIFOB0)[6] |= 0x0A;//
                              
                              Status = SdSendCmd(PROGRAM_CSD, SdCmdBuf);
                      if(Status != STATUS_SUCCESS)
                          continue;
                              //*******************************           
                              ///*CrcSts = (SDMI_ST&0x38) >> 3;
                              //if(CrcSts != GOOD_CRC16_STS) //MMCerror3++;
                              //      continue;
                              //else  //
                              return STATUS_SUCCESS;
                      }
                  
                  return STATUS_FLASH_ERROR;
              }
              #endif
 844          
 845          //----------------------------------------------------------------------------
 846          STATUS SdGoTransferState(void)
 847          {
 848   1          STATUS Status;
 849   1          BYTE CurrentState;
 850   1              
 851   1          *((INT32U *)(&SdCmdBuf[1])) = RCA;
 852   1          Status = SdSendCmd(SELECT_CARD, SdCmdBuf);
 853   1          if(Status != STATUS_SUCCESS)
 854   1              return Status;  
 855   1      
 856   1          *((INT32U *)(&SdCmdBuf[1])) = RCA;
 857   1          Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
 858   1          if(Status != STATUS_SUCCESS)
 859   1              return Status;  
 860   1      
C51 COMPILER V7.02b   SD                                                                   03/24/2008 15:52:29 PAGE 15  

 861   1          CurrentState = (SdRespBuf[3] >> 1) & 0x0F;
 862   1          if(CurrentState == TRANSFER_STATE)
 863   1          {
 864   2              SdHiClk();
 865   2              if(CardType == CARD_SD)
 866   2              {
 867   3                  Status = SdChangeBusWidth(4);
 868   3                  if(Status != STATUS_SUCCESS)
 869   3                      return Status;
 870   3              }
 871   2              else 
 872   2              {
 873   3                              Status = SdChangeBusWidth(8);  //derek.
 874   3                  if(Status != STATUS_SUCCESS)
 875   3                      return Status;  
 876   3              }
 877   2          }   
 878   1          else
 879   1              return STATUS_FLASH_ERROR;
 880   1          
 881   1          return STATUS_SUCCESS;
 882   1      }       
 883          #if 0
              //----------------------------------------------------------------------------
              //  Description:
              //    Stop the read or write command.
              //        Used for read or write multi blocks.
              //----------------------------------------------------------------------------
              STATUS SdStopCmd()
              {
                  STATUS Status;
                  int i;
              
                  SDMI_CTL&=~bmSD_AUTO_CLK_EN;
              
                  for(i = 1; i <= 4; i++)
                      SdCmdBuf[i] = 0;
                  Status = SdSendCmd(STOP_TRANS, SdCmdBuf);
                  if(Status != STATUS_SUCCESS)
                      return Status;
               
                  SdWaitCard();
                    
                  return STATUS_SUCCESS; 
              }
              
              //----------------------------------------------------------------------------
              STATUS SdWaitCmd()
              {
                      CmdTimer = SD_CMD_TIMEOUT;      
                      while((!(SDMI_INT&bmSD_COMPLETE_INT))&&CmdTimer); //等待命令执行完毕
                      SDMI_INT&=~bmSD_COMPLETE_INT; //清除中断标志
              
                      if (CmdTimer)                             //没有超时,返回成功标志
                              return STATUS_SUCCESS;
                      else 
                      {
                              SdCtrlReset();
                              return STATUS_FLASH_ERROR;
                      }
              }
              #endif  
C51 COMPILER V7.02b   SD                                                                   03/24/2008 15:52:29 PAGE 16  

 923           /*
 924          //----------------------------------------------------------------------------
 925          STATUS SdSetBlockLen(INT16U len)
 926          {   
 927              STATUS Status;
 928              
 929              SdWaitCard();
 930              
 931                  *((INT32U *)(&SdCmdBuf[1]))=len;
 932              Status = SdSendCmd(SET_BLOCKLEN,SdCmdBuf);
 933                  if(Status == STATUS_SUCCESS)
 934              {
 935                  SDMI_LENH=len>>8;
 936                  SDMI_LENL=len;
 937              }
 938                     
 939              return Status;   
 940          }   
 941           */
 942          //--------------------------------------------------------------------
 943          // Read single sector of data from SD/MMC,
 944          // Read the first sector when execute multi-read command.
 945          //--------------------------------------------------------------------
 946          #pragma OPTIMIZE(4)
 947          STATUS SdReadOneSector(BYTE*buff, DWORD sector)
 948          {
 949   1              STATUS Status;
 950   1          int RetryCount1 , RetryCount2;
 951   1          bool ReadyForData;
 952   1               DWORD       SectorStart,SectorCount;
 953   1               SectorStart= sector;
 954   1               SectorCount =1;
 955   1               //buff =DMA_FIFOB0;    
 956   1                // (BYTE xdata *)DMA_FIFOB0
 957   1              if (!SdCardExist())
 958   1                      return STATUS_FLASH_ERROR;
 959   1      
 960   1          if(SectorStart > SdAvailableBlocks)
 961   1              return STATUS_PARAM_ERROR;
 962   1      
 963   1          SdWaitCard();                          //等待上次操作执行完毕
 964   1      
 965   1          for(RetryCount1 = 0; RetryCount1 < 15; RetryCount1++)
 966   1          {
 967   2              ReadyForData = false;
 968   2              for(RetryCount2 = 0; RetryCount2 < 20; RetryCount2++)
 969   2              {
 970   3                  *((UINT32 *)(&SdCmdBuf[1])) = RCA;
 971   3                  Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
 972   3                  if(Status != STATUS_SUCCESS)
 973   3                      continue;  
 974   3                  if(SdRespBuf[3] & 0x01) // READY_FOR_DATA in Card Status
 975   3                  {
 976   4                      ReadyForData = true;
 977   4                      break;
 978   4                  }
 979   3              }        
 980   2              if(!ReadyForData){
 981   3                              CmdTimer=3;
 982   3                              while(CmdTimer);
 983   3                  continue;
 984   3                      }
C51 COMPILER V7.02b   SD                                                                   03/24/2008 15:52:29 PAGE 17  

 985   2                      
 986   2                      SDMI_BUFBASE=(DMA_FIFOB0>>8);
 987   2            
 988   2      if(SdHcFlag) {                    //Derek 2007.07.02
 989   3                      *((UINT32 *)(&SdCmdBuf[1])) = SectorStart;
 990   3      } else
 991   2              *((UINT32 *)(&SdCmdBuf[1])) = 
 992   2                  SectorStart << BYTES_PER_SECTOR_SHIFT;
 993   2      
 994   2      //***********************
 995   2              if (SectorCount > 1) // Muti-Read.
 996   2              {    
 997   3                              SDMI_CTL|=bmSD_AUTO_CLK_EN;     
 998   3                      Status = SdSendCmd(READ_MUL_BLOCK, SdCmdBuf);
 999   3                      if(Status != STATUS_SUCCESS)
1000   3                      continue;
1001   3              }
1002   2              else
1003   2              {
1004   3                              SDMI_CTL &= ~bmSD_AUTO_CLK_EN; //2007.01.18
1005   3                              Status = SdSendCmd(READ_BLOCK, SdCmdBuf);
1006   3      
1007   3                      if(Status != STATUS_SUCCESS)
1008   3                              continue;
1009   3                              else
1010   3                               memcpy(buff, (BYTE xdata *)DMA_FIFOB0, 512);
1011   3              }
1012   2      //*******************************   
1013   2            if(SDMI_ST&bmSD_CRC16_ERR)
1014   2              {
1015   3                  SDMI_ST &=~bmSD_CRC16_ERR;
1016   3                  continue;
1017   3              }
1018   2              else

⌨️ 快捷键说明

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