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

📄 sd.lst

📁 FS7805 使用SD卡的demo
💻 LST
📖 第 1 页 / 共 3 页
字号:
 267   2                  return STATUS_SUCCESS;
 268   2          }
 269   1          return STATUS_FLASH_ERROR;
 270   1      }
 271          
 272          STATUS SdReset()
 273          {
 274   1              STATUS Status;
 275   1          int i;
 276   1      
 277   1              SdLowClk();
 278   1              Delay1ms(150);
 279   1              for(i = 1; i <= 4; i++)
 280   1              SdCmdBuf[i]=0;
 281   1          Status = SdSendCmd(GO_IDLE_STATE,SdCmdBuf);
 282   1          return Status;
 283   1      }
 284          
 285          STATUS SdCardDetect()
 286          {
 287   1              STATUS Status;
 288   1          INT16U RetryCount;
 289   1      
 290   1              *(INT32U *)(&SdCmdBuf[1])=OPERATION_VOL_RANGE;
 291   1              Status = SdSendAppCmd(SD_SEND_OP_COND, SdCmdBuf);
 292   1      
 293   1              if(Status == STATUS_SUCCESS)
 294   1          {
 295   2              CardType = CARD_SD;     
 296   2       
 297   2              // Check if card power-up operation finished
 298   2              if(SDMCMDRESBUF01 & CARD_PWRUP_FINISH)
 299   2                  return STATUS_SUCCESS;
 300   2      
 301   2              // Wait until card power-up operation finished
 302   2              for(RetryCount = 0; RetryCount < 500; RetryCount++)
C51 COMPILER V7.50   SD                                                                    04/17/2007 10:40:23 PAGE 6   

 303   2              {
 304   3                  *((INT32U idata *)(&SdCmdBuf[1])) = OPERATION_VOL_RANGE;
 305   3                  
 306   3                  Status = SdSendAppCmd(SD_SEND_OP_COND, SdCmdBuf);
 307   3                  
 308   3                  if(Status != STATUS_SUCCESS)
 309   3                      continue;
 310   3                      
 311   3                  if(SDMCMDRESBUF01 & CARD_PWRUP_FINISH)
 312   3                      return STATUS_SUCCESS;           
 313   3              }
 314   2              return STATUS_FLASH_ERROR;
 315   2          }
 316   1      
 317   1              else
 318   1          {
 319   2              CardType = CARD_MMC;    
 320   2              
 321   2              // Wait until card power-up operation finished
 322   2              for(RetryCount = 0; RetryCount < 500; RetryCount++)
 323   2              {            
 324   3                              *((INT32U *)(&SdCmdBuf[1])) = OPERATION_VOL_RANGE;
 325   3          
 326   3                  Status = SdSendCmd(SEND_OP_COND, SdCmdBuf);
 327   3      
 328   3                  if(Status != STATUS_SUCCESS)
 329   3                      continue;
 330   3                      
 331   3                  if(SdRespBuf[1] & CARD_PWRUP_FINISH)
 332   3                      return STATUS_SUCCESS;           
 333   3              }
 334   2              return STATUS_FLASH_ERROR;
 335   2          }
 336   1          return Status;
 337   1      }
 338          
 339          STATUS SdGoIdentifyState()
 340          {
 341   1          STATUS Status;
 342   1          int i;
 343   1      
 344   1          for(i = 1; i <= 4; i++)
 345   1              SdCmdBuf[i] = 0;
 346   1          Status = SdSendCmd(ALL_SEND_CID,SdCmdBuf);
 347   1          return Status;
 348   1      }
 349          
 350          STATUS SdGoStandbyState()
 351          {
 352   1          STATUS Status;
 353   1          int i;
 354   1              
 355   1          if(CardType == CARD_SD)
 356   1          {
 357   2              for(i = 1; i <= 4; i++)
 358   2                  SdCmdBuf[i] = 0;
 359   2          }
 360   1          else
 361   1          {
 362   2              RCA = 0x00010000;       
 363   2              *((INT32U idata *)(&SdCmdBuf[1])) = RCA;
 364   2          }
C51 COMPILER V7.50   SD                                                                    04/17/2007 10:40:23 PAGE 7   

 365   1      
 366   1          Status = SdSendCmd(SEND_RELATIVE_ADDR,SdCmdBuf);
 367   1      
 368   1          if(CardType == CARD_SD)
 369   1              RCA = *((INT32U *)(&SdRespBuf[1])) & 0xffff0000;
 370   1      
 371   1          return STATUS_SUCCESS;
 372   1      }
 373          
 374          //--------------------------------------------------------------------
 375          STATUS SdReadCSD()                      
 376          {
 377   1          STATUS Status;      
 378   1          BYTE READ_BL_LEN;
 379   1          BYTE C_SIZE_MUTI;
 380   1          INT32U C_SIZE;
 381   1              int i;
 382   1           
 383   1          *((INT32U *)(&SdCmdBuf[1])) = RCA;
 384   1          
 385   1          Status = SdSendCmd(SEND_CSD,SdCmdBuf);
 386   1              for(i=0;i<17;i++)
 387   1                      SdRespBufForProgCsd[i]=SdRespBuf[i];
 388   1          if(Status != STATUS_SUCCESS)
 389   1              return Status;
 390   1                
 391   1              if(SdRespBuf[1] & 0x3c)//check MMC3.1 or MMC4.0
 392   1                      MmcProtol = TRUE;
 393   1              else
 394   1                      MmcProtol = FALSE;
 395   1              
 396   1          READ_BL_LEN = SdRespBuf[6] & 0xf;
 397   1          C_SIZE = SdRespBuf[7] & 0x3;
 398   1          C_SIZE <<= 8;
 399   1          C_SIZE |= SdRespBuf[8];
 400   1          C_SIZE <<= 2;
 401   1          C_SIZE |= (SdRespBuf[9] >> 6);
 402   1          C_SIZE_MUTI = SdRespBuf[10] & 0x3;
 403   1          C_SIZE_MUTI <<= 1;
 404   1          C_SIZE_MUTI |= (SdRespBuf[11] >> 7);
 405   1        
 406   1          SdAvailableBlocks = (INT32U)((C_SIZE + 1) << (C_SIZE_MUTI + 2 + (READ_BL_LEN - BYTES_PER_SECTOR_SHIFT)
             -));
 407   1          SdAvailableBlocks -= 1;  
 408   1      
 409   1          return STATUS_SUCCESS;
 410   1      }       
 411          
 412          STATUS SdGoTransferState()
 413          {
 414   1          STATUS Status;
 415   1          BYTE CurrentState;
 416   1              
 417   1          *((INT32U *)(&SdCmdBuf[1])) = RCA;
 418   1          Status = SdSendCmd(SELECT_CARD, SdCmdBuf);
 419   1          if(Status != STATUS_SUCCESS)
 420   1              return Status;  
 421   1      
 422   1          *((INT32U *)(&SdCmdBuf[1])) = RCA;
 423   1          Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
 424   1          if(Status != STATUS_SUCCESS)
 425   1              return Status;  
C51 COMPILER V7.50   SD                                                                    04/17/2007 10:40:23 PAGE 8   

 426   1      
 427   1          CurrentState = (SdRespBuf[3] >> 1) & 0x0F;
 428   1          if(CurrentState == TRANSFER_STATE)
 429   1          {
 430   2              SdHiClk();
 431   2              if(CardType == CARD_SD)
 432   2              {
 433   3                  Status = SdChangeBusWidth(4); /////
 434   3                  if(Status != STATUS_SUCCESS)
 435   3                      return Status;
 436   3              }
 437   2              else // MMC 3.1,only 1bit Mode
 438   2              {
 439   3                              Status = SdChangeBusWidth(8);
 440   3                              if(Status != STATUS_SUCCESS)
 441   3                      return Status;
 442   3              }
 443   2          }   
 444   1          else
 445   1              return STATUS_FLASH_ERROR;
 446   1          
 447   1          return STATUS_SUCCESS;
 448   1      }       
 449          
 450          //----------------------------------------------------------------------------
 451          STATUS SdChangeBusWidth(BYTE busWidth) //
 452          {
 453   1          STATUS Status;
 454   1        
 455   1          if(CardType == CARD_SD)
 456   1          {
 457   2                      if(busWidth==4)
 458   2                              *((INT32U *)(&SdCmdBuf[1])) = RCA | 0x02;  //4bits bus width
 459   2                      else
 460   2                              *((INT32U *)(&SdCmdBuf[1])) = RCA;
 461   2              
 462   2                      Status = SdSendAppCmd(SET_BUS_WIDTH,SdCmdBuf);
 463   2                      if(Status == STATUS_SUCCESS)
 464   2                      {
 465   3                              if(busWidth==4)
 466   3                              {       
 467   4                                      SDMI_CTL&=~bmSD_BUS_8BIT_EN;
 468   4                                      SDMI_CTL|=bmSD_BUS_4BIT_EN;
 469   4                              }
 470   3                              else
 471   3                              {       
 472   4                                      SDMI_CTL&=~bmSD_BUS_8BIT_EN;
 473   4                                      SDMI_CTL&=~bmSD_BUS_4BIT_EN;
 474   4                              }
 475   3                      }
 476   2              }
 477   1              else // MMC
 478   1              {
 479   2                      if(MmcProtol) // MMC 4.0 surport 1/4/8 bits mode
 480   2                      {
 481   3                              if(busWidth==8)
 482   3                                      *((INT32U *)(&SdCmdBuf[1])) = 0x03b70200;
 483   3                              else if(busWidth==4)
 484   3                                      *((INT32U *)(&SdCmdBuf[1])) = 0x03b70100;
 485   3                              else
 486   3                                      *((INT32U *)(&SdCmdBuf[1])) = 0x03b70000;
 487   3                              //*((INT32U *)(&SdCmdBuf[1])) = 0x03b70000;
C51 COMPILER V7.50   SD                                                                    04/17/2007 10:40:23 PAGE 9   

 488   3                              Status = SdSendCmd(SWITCH, SdCmdBuf);
 489   3      
 490   3                              if(Status == STATUS_SUCCESS)
 491   3                              {               
 492   4                              *((INT32U *)(&SdCmdBuf[1])) = RCA;
 493   4                                      Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
 494   4      
 495   4                                      if(Status == STATUS_SUCCESS)
 496   4                                      {
 497   5                                              if(busWidth==8)
 498   5                                              {       
 499   6                                                      SDMI_CTL|=bmSD_BUS_8BIT_EN;
 500   6                                                      SDMI_CTL&=~bmSD_BUS_4BIT_EN;
 501   6                                              }
 502   5                                              else if((busWidth==4))
 503   5                                              {       
 504   6                                                      SDMI_CTL&=~bmSD_BUS_8BIT_EN;
 505   6                                                      SDMI_CTL|=bmSD_BUS_4BIT_EN;
 506   6                                              }
 507   5                                              else
 508   5                                              {       
 509   6                                                      SDMI_CTL&=~bmSD_BUS_4BIT_EN;
 510   6                                                      SDMI_CTL&=~bmSD_BUS_8BIT_EN;
 511   6                                              }
 512   5                                      }
 513   4                                                      
 514   4                              }
 515   3      
 516   3                      }
 517   2                      else  // MMC 3.1 surpport 1bit only             
 518   2                      {
 519   3                              SDMI_CTL&=~bmSD_BUS_4BIT_EN;
 520   3                              SDMI_CTL&=~bmSD_BUS_8BIT_EN;
 521   3                      }
 522   2          }      
 523   1          return Status;   
 524   1      }   
 525          
 526              
 527          //----------------------------------------------------------------------------
 528          //  Description:
 529          //    Stop the read or write command
 530          //----------------------------------------------------------------------------
 531          STATUS SdStopCmd()
 532          {   
 533   1          STATUS Status;
 534   1          int i;
 535   1          
 536   1          SDMI_CTL&=~bmSD_AUTO_CLK_EN;
 537   1          
 538   1          for(i = 1; i <= 4; i++)
 539   1              SdCmdBuf[i] = 0;
 540   1          Status = SdSendCmd(STOP_TRANS, SdCmdBuf);
 541   1          if(Status != STATUS_SUCCESS)

⌨️ 快捷键说明

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