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

📄 sd.lst

📁 FS7805 使用ATA硬盘的demo
💻 LST
📖 第 1 页 / 共 5 页
字号:
 277   2              for(i = 1; i <= 4; i++) //The next 4 bytes
 278   2                  ((BYTE xdata *)(&SDMCMDRESBUF00))[i]=CmdBuf[i];
 279   2      
 280   2              SDMI_CMD=CmdType;
 281   2      
 282   2              CmdTimer = 5; // 50ms
 283   2              //while((SDMI_INT&bmSD_COMPLETE_INT)==0);
 284   2              //SDMI_INT&=~bmSD_COMPLETE_INT;
 285   2              while(CmdTimer > 0)
 286   2              {
 287   3                  if((SDMI_INT&bmSD_COMPLETE_INT)!=0) //等待命令执行完毕
 288   3                  {
 289   4                      SDMI_INT&=~bmSD_COMPLETE_INT;
 290   4                      break;
 291   4                  }
 292   3              }//*/
 293   2              if(CmdTimer == 0) // Timeout
 294   2              {
 295   3                  SdCtrlReset(); // ???
 296   3      
 297   3                  //MMCerror2++;
 298   3                  continue;
 299   3              }
 300   2      
 301   2              if(RespType == TYPE_RESP_NO)
 302   2                  return STATUS_SUCCESS;
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 6   

 303   2      
 304   2              if(RespType == TYPE_RESP_R3)
 305   2              {
 306   3                  // The response type of SD_SEND_OP_COND (ACMD41) and
 307   3                  // SEND_OP_COND (CMD1) are both R3, which is not protected
 308   3                  // by CRC7. But hardware could still report CRC7 error for
 309   3                  // these command's response. So, to prevent from affecting
 310   3                  // next command, we clear CRC7-ERR INT bit here.
 311   3                  SDMI_ST&=~bmSD_CRC7_ERR;
 312   3                  for(i = 0; i < RespLen; i++)
 313   3                      SdRespBuf[i] = ((BYTE xdata *)(&SDMCMDRESBUF00))[i];
 314   3                  return STATUS_SUCCESS;
 315   3              }
 316   2      
 317   2              if(SDMI_ST&bmSD_CRC7_ERR) // CRC7 Error
 318   2              {
 319   3                  SDMI_ST&=~bmSD_CRC7_ERR; // Clear INT
 320   3                  continue;
 321   3              }
 322   2      
 323   2              for(i = 0; i < RespLen; i++)
 324   2                  SdRespBuf[i] = ((BYTE xdata *)(&SDMCMDRESBUF00))[i];
 325   2      
 326   2              if(RespType == TYPE_RESP_R1)
 327   2              {
 328   3                  // Check following error bits in Card Status:
 329   3                  //   31 OUT_OF_RANGE         SdRespBuf[1].7
 330   3                  //   30 ADDRESS_ERROR        SdRespBuf[1].6
 331   3                  //   29 BLOCK_LEN_ERROR      SdRespBuf[1].5
 332   3                  //   28 ERASE_SEQ_ERROR      SdRespBuf[1].4
 333   3                  //   27 ERASE_PARAM          SdRespBuf[1].3
 334   3                  //   26 WP_VIOLATION         SdRespBuf[1].2
 335   3                  //   24 LOCK_UNLOCK_FAILED   SdRespBuf[1].0
 336   3                  //   23 COM_CRC_ERR          SdRespBuf[2].7
 337   3                  //   22 ILLEGAL_COMMAND      SdRespBuf[2].6
 338   3                  //   21 CARD_ECC_FAILED      SdRespBuf[2].5
 339   3                  //   20 CC_ERROR             SdRespBuf[2].4
 340   3                  //   19 ERROR                SdRespBuf[2].3
 341   3                  if( ( (SdRespBuf[1] & 0xFD) == 0 ) && // 8'b1111_1101
 342   3                      ( (SdRespBuf[2] & 0xF8) == 0 )  ) // 8'b1111_1000
 343   3                      return STATUS_SUCCESS;            // No error
 344   3                  else
 345   3                      continue;
 346   3              }
 347   2            else
 348   2                  return STATUS_SUCCESS;
 349   2          }
 350   1          return STATUS_FLASH_ERROR;
 351   1      }
 352          
 353          STATUS SdSendAppCmd(BYTE AppCmdIndex, PBYTE AppCmdBuf)
 354          {
 355   1          STATUS Status;
 356   1          int RetryCount;
 357   1          BYTE CmdBuf55[MAX_CMD_LEN]; // for APP_CMD (CMD55)
 358   1          //MMCerror1++;
 359   1          //MMCCmdIndex[MMCerror1]= AppCmdIndex;
 360   1          for(RetryCount = 0; RetryCount < 3; RetryCount++)
 361   1          {
 362   2              *((UINT32 *)(&CmdBuf55[1])) = RCA;
 363   2      
 364   2              Status = SdSendCmd(APP_CMD, CmdBuf55);
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 7   

 365   2      
 366   2              if(Status != STATUS_SUCCESS)
 367   2                  {
 368   3                      //MMCerror3++;
 369   3                      continue;
 370   3                  }
 371   2      
 372   2              Status = SdSendCmd(AppCmdIndex, AppCmdBuf);
 373   2      
 374   2              if(Status != STATUS_SUCCESS)
 375   2                  continue;
 376   2              else
 377   2                  return STATUS_SUCCESS;
 378   2          }
 379   1          return STATUS_FLASH_ERROR;
 380   1      }
 381          
 382          //----------------------------------------------------------------------------
 383          STATUS SdChangeBusWidth(BYTE busWidth) //busWidth只能取值1或4或8
 384          {
 385   1          STATUS Status;
 386   1      
 387   1          if(CardType == CARD_SD)
 388   1          {
 389   2              if(busWidth==4)
 390   2                  *((INT32U *)(&SdCmdBuf[1])) = RCA | 0x02;  //4bits bus width
 391   2              else
 392   2                  *((INT32U *)(&SdCmdBuf[1])) = RCA;
 393   2      
 394   2              Status = SdSendAppCmd(SET_BUS_WIDTH,SdCmdBuf);
 395   2              if(Status == STATUS_SUCCESS)
 396   2              {
 397   3                  if(busWidth==4)
 398   3                  {
 399   4                      SDMI_CTL&=~bmSD_BUS_8BIT_EN;
 400   4                      SDMI_CTL|=bmSD_BUS_4BIT_EN;
 401   4                  }
 402   3                  else
 403   3                  {
 404   4                      SDMI_CTL&=~bmSD_BUS_8BIT_EN;
 405   4                      SDMI_CTL&=~bmSD_BUS_4BIT_EN;
 406   4                  }
 407   3              }
 408   2          }
 409   1          else // MMC
 410   1          {
 411   2              if(MmcProtol) // MMC 4.0 支持1/4/8 bits mode
 412   2              {
 413   3                  if(busWidth==8)
 414   3                      *((INT32U *)(&SdCmdBuf[1])) = 0x03b70200;
 415   3                  else if(busWidth==4)
 416   3                      *((INT32U *)(&SdCmdBuf[1])) = 0x03b70100;
 417   3                  else
 418   3                      *((INT32U *)(&SdCmdBuf[1])) = 0x03b70000;
 419   3                  //*((INT32U *)(&SdCmdBuf[1])) = 0x03b70000;
 420   3                  Status = SdSendCmd(SWITCH, SdCmdBuf);
 421   3      
 422   3                  if(Status == STATUS_SUCCESS)
 423   3                  {
 424   4                      *((INT32U *)(&SdCmdBuf[1])) = RCA;
 425   4                      Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
 426   4      
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 8   

 427   4                      if(Status == STATUS_SUCCESS)
 428   4                      {
 429   5                          if(busWidth==8)
 430   5                          {
 431   6                              SDMI_CTL|=bmSD_BUS_8BIT_EN;
 432   6                              SDMI_CTL&=~bmSD_BUS_4BIT_EN;
 433   6                          }
 434   5                          else if((busWidth==4))
 435   5                          {
 436   6                              SDMI_CTL&=~bmSD_BUS_8BIT_EN;
 437   6                              SDMI_CTL|=bmSD_BUS_4BIT_EN;
 438   6                          }
 439   5                          else
 440   5                          {
 441   6                              SDMI_CTL&=~bmSD_BUS_4BIT_EN;
 442   6                              SDMI_CTL&=~bmSD_BUS_8BIT_EN;
 443   6                          }
 444   5                      }
 445   4      
 446   4                      SDMI_BUFBASE=0xF2; //FIFOB0
 447   4                      Status = SdReadExtCSD();
 448   4                  }
 449   3      
 450   3                  /*else
 451   3                  {
 452   3                      SDMI_CTL&=~bmSD_BUS_4BIT_EN;
 453   3                      SDMI_CTL&=~bmSD_BUS_8BIT_EN;
 454   3                  }*/
 455   3              }
 456   2              else  // MMC 3.1 只支持1bit模式
 457   2              {
 458   3                  SDMI_CTL&=~bmSD_BUS_4BIT_EN;
 459   3                  SDMI_CTL&=~bmSD_BUS_8BIT_EN;
 460   3              }
 461   2          }
 462   1          return Status;
 463   1      }
 464          STATUS SdReadExtCSD()
 465          {
 466   1          STATUS Status;
 467   1          int RetryCount1 , RetryCount2;
 468   1          BOOL ReadyForData;
 469   1      
 470   1      //  if (!SdCardExist())
 471   1      //          return STATUS_FLASH_ERROR;
 472   1      
 473   1          SdWaitCard();
 474   1      
 475   1          for(RetryCount1 = 0; RetryCount1 < 5; RetryCount1++)
 476   1          {
 477   2              ReadyForData = FALSE;
 478   2              for(RetryCount2 = 0; RetryCount2 < 20; RetryCount2++)
 479   2              {
 480   3                  *((INT32U *)(&SdCmdBuf[1])) = RCA;
 481   3                  Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
 482   3                  if(Status != STATUS_SUCCESS)
 483   3                      continue;
 484   3                  if(SdRespBuf[3] & 0x01) // READY_FOR_DATA in Card Status
 485   3                  {
 486   4                      ReadyForData = TRUE;
 487   4                      break;
 488   4                  }
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 9   

 489   3              }
 490   2              if(!ReadyForData)
 491   2                  continue;
 492   2      
 493   2              *((INT32U *)(&SdCmdBuf[1])) = 0;
 494   2              Status = SdSendCmd(SEND_EXT_CSD, SdCmdBuf);
 495   2              if(Status != STATUS_SUCCESS)
 496   2                  continue;
 497   2      
 498   2              //*******************************
 499   2              if(SDMI_ST&bmSD_CRC16_ERR)
 500   2              {
 501   3                  SDMI_ST &=~bmSD_CRC16_ERR;
 502   3                  continue;
 503   3              }
 504   2              else
 505   2              {
 506   3                 *((INT32U *)(&SdCmdBuf[1])) = RCA;
 507   3                  Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
 508   3      
 509   3                  return STATUS_SUCCESS;
 510   3              }
 511   2          }
 512   1          return STATUS_FLASH_ERROR;
 513   1      }
 514          //----------------------------------------------------------------------------
 515          STATUS SdReset()
 516          {
 517   1          STATUS Status;
 518   1          int i;
 519   1      
 520   1          RCA = 0;
 521   1      
 522   1          SdLoClk();
 523   1          Delay(5);  // Wait 5ms for stable clock
 524   1          for(i = 1; i <= 4; i++)
 525   1              SdCmdBuf[i] = 0;
 526   1          Status = SdSendCmd(GO_IDLE_STATE, SdCmdBuf);
 527   1          return Status;
 528   1      }
 529          
 530          //----------------------------------------------------------------------------
 531          STATUS SdDetect()
 532          {
 533   1          STATUS Status;
 534   1          UINT16 RetryCount;
 535   1      
 536   1          *((UINT32 *)(&SdCmdBuf[1])) = OPERATION_VOL_RANGE;
 537   1      
 538   1          Status = SdSendAppCmd(SD_SEND_OP_COND, SdCmdBuf);
 539   1      
 540   1          if(Status == STATUS_SUCCESS)
 541   1          {
 542   2              CardType = CARD_SD;
 543   2      
 544   2              // Check if card power-up operation finished
 545   2              if(SdRespBuf[1] & CARD_PWRUP_FINISH)
 546   2                  return STATUS_SUCCESS;
 547   2      
 548   2              // Wait until card power-up operation finished
 549   2              for(RetryCount = 0; RetryCount < 500; RetryCount++)
 550   2              {
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 10  

 551   3                  *((UINT32 *)(&SdCmdBuf[1])) = OPERATION_VOL_RANGE;
 552   3      
 553   3                  Status = SdSendAppCmd(SD_SEND_OP_COND, SdCmdBuf);
 554   3      
 555   3                  if(Status != STATUS_SUCCESS)
 556   3                      continue;
 557   3      
 558   3                  if(SdRespBuf[1] & CARD_PWRUP_FINISH)
 559   3                      return STATUS_SUCCESS;
 560   3              }

⌨️ 快捷键说明

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