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

📄 sd.lst

📁 FS7805 使用ATA硬盘的demo
💻 LST
📖 第 1 页 / 共 5 页
字号:
 847   1      
 848   1        Stop = SectorCount == 1;
 849   1      
 850   1      #ifdef PREFETCH
                if ((Status = SdWaitCmd()) != STATUS_SUCCESS)
                  return Status;
                if (!Stop)
                {
                  UINT16 NextBuffer = GetNextBuffer(CurrentBuffer);
                  CSRWrite(SD_BASE + SD_BUFFER_BASE, ((TDataCast *)&NextBuffer)->ucByte[0]);
                  CSRWrite(SD_BASE + SD_COMMAND, SD_CMD_RX_DATA_ONLY);
                  CSRWrite(SD_BASE + SD_CLK_CTRL, CSRRead(SD_BASE + SD_CLK_CTRL) | SD_CLK_AUTO_DIS);
                }
              #else
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 15  

 861   1        //CSRWrite(SD_BASE + SD_BUFFER_BASE, ((TDataCast *)&CurrentBuffer)->ucByte[0]);
 862   1          SDMI_BUFBASE=0xF2; //FIFOB0
 863   1          SDMI_CMD=SD_CMD_RX_DATA_ONLY;
 864   1          SDMI_CTL|=bmSD_AUTO_CLK_EN;
 865   1          if ((Status = SdWaitCmd()) != STATUS_SUCCESS)
 866   1              return Status;
 867   1      #endif
 868   1      
 869   1          if(SDMI_ST&bmSD_CRC16_ERR) // CRC7 Error
 870   1          {
 871   2              SDMI_ST&=~bmSD_CRC16_ERR; // Clear INT
 872   2              return STATUS_DATA_ERROR;
 873   2          }
 874   1      
 875   1          if (Stop)
 876   1              return SdStopCmd();
 877   1      
 878   1          return STATUS_SUCCESS;
 879   1      }
 880          
 881          STATUS SdReadNextSector()
 882          {
 883   1          BYTE    RetryCount;
 884   1      
 885   1          STATUS Status = SdReadNextSectorData();
 886   1          if(Status != STATUS_SUCCESS)
 887   1          {
 888   2              for(RetryCount = 0 ; RetryCount < 5; RetryCount ++)
 889   2              {
 890   3                  Status = SdStopCmd();
 891   3                  if(Status != STATUS_SUCCESS)
 892   3                      continue;
 893   3                  Status = SdReadOneSector();
 894   3                      break;
 895   3              }
 896   2          }
 897   1          SectorStart ++;
 898   1          return Status;
 899   1      }
 900          
 901          
 902          //--------------------------------------------------------------------
 903          // Write one sector of data to SD/MMC
 904          //--------------------------------------------------------------------
 905          STATUS SdWriteOneSector()
 906          {
 907   1          STATUS Status;
 908   1          BYTE CrcSts;
 909   1          int RetryCount1 , RetryCount2;
 910   1          bool ReadyForData;
 911   1      
 912   1          if(SDMI_ST & bmSD_WR_PROTECT)
 913   1              return STATUS_WRITE_PROTECT;
 914   1      
 915   1          SdWaitCard();
 916   1      
 917   1      //    MMCtest ++;
 918   1          for(RetryCount1 = 0; RetryCount1 < 5; RetryCount1++)
 919   1          {
 920   2              ReadyForData = false;
 921   2              for(RetryCount2 = 0; RetryCount2 < 20; RetryCount2++)
 922   2              {
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 16  

 923   3                  *((UINT32 *)(&SdCmdBuf[1])) = RCA;
 924   3                  Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
 925   3                  if(Status != STATUS_SUCCESS)
 926   3                      {//MMCerror1++;
 927   4                      continue;}
 928   3                  if(SdRespBuf[3] & 0x01) // READY_FOR_DATA in Card Status
 929   3                  {
 930   4                      ReadyForData = true;
 931   4                      break;
 932   4                  }
 933   3              }
 934   2              if(!ReadyForData)
 935   2                  {//MMCerror2++;
 936   3                  continue;}
 937   2      
 938   2              //CSRWrite(SD_BASE + SD_BUFFER_BASE,((TDataCast *)&CurrentBuffer)->ucByte[0]);
 939   2              SDMI_BUFBASE=0xEE; //FIFOA0
 940   2      
 941   2              *((UINT32 *)(&SdCmdBuf[1])) =
 942   2                  SectorStart << BYTES_PER_SECTOR_SHIFT;
 943   2      //***********************8
 944   2          if (SectorCount > 1) // Muti-Read.
 945   2              {
 946   3              Status = SdSendCmd(WRITE_MUL_BLOCK, SdCmdBuf);
 947   3              if(Status != STATUS_SUCCESS)
 948   3                  continue;
 949   3              }
 950   2           else
 951   2              {
 952   3      
 953   3              Status = SdSendCmd(WRITE_BLOCK, SdCmdBuf);
 954   3              if(Status != STATUS_SUCCESS)
 955   3                  continue;
 956   3      
 957   3             }
 958   2      //*******************************
 959   2      
 960   2              CrcSts = (SDMI_ST&0x38) >> 3;
 961   2              if(CrcSts != GOOD_CRC16_STS) //MMCerror3++;
 962   2                  continue;
 963   2              else
 964   2                  return STATUS_SUCCESS;
 965   2          }
 966   1      
 967   1      
 968   1          return STATUS_FLASH_ERROR;
 969   1      }
 970          
 971          STATUS SdWriteSector()
 972          {
 973   1          STATUS Status = SdWriteOneSector();
 974   1          SectorStart ++;
 975   1          return Status;
 976   1      }
 977          /*
 978          STATUS SdWriteNextSector()
 979          {
 980              STATUS Status = SdWriteOneSector();
 981              SectorStart ++;
 982              return Status;
 983          }
 984          */
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 17  

 985          
 986          //----------------------------------------------------------------------------
 987          //  Description:
 988          //    Write one sector of data from the SD device
 989          //----------------------------------------------------------------------------
 990          STATUS SdWriteNextSector()
 991          {
 992   1          STATUS Status;
 993   1          BYTE CrcSts;
 994   1          bit Stop;
 995   1      
 996   1      
 997   1          Stop = SectorCount == 1;
 998   1      
 999   1          SdWaitCard();
1000   1          CmdTimer = SD_CMD_TIMEOUT;
1001   1          if (CmdTimer == 0)
1002   1          {
1003   2              return STATUS_FLASH_ERROR;
1004   2          }
1005   1      
1006   1          // CSRWrite(SD_BASE + SD_BUFFER_BASE, Buffer >> 8);
1007   1          // hsin-chang huang
1008   1          //CSRWrite(SD_BASE + SD_BUFFER_BASE, ((TDataCast *)&CurrentBuffer)->ucByte[0]);
1009   1          SDMI_BUFBASE=0xEE; //FIFOA0
1010   1      
1011   1          SDMI_CMD=SD_CMD_TX_DATA_ONLY;
1012   1          if ((Status = SdWaitCmd()) != STATUS_SUCCESS)
1013   1              return Status;
1014   1          CrcSts = (SDMI_ST&0x38) >> 3;
1015   1          if (CrcSts != GOOD_CRC16_STS)
1016   1          {
1017   2              return STATUS_DATA_ERROR;
1018   2          }
1019   1      
1020   1          if (Stop)
1021   1              return SdStopCmd();
1022   1      
1023   1          return STATUS_SUCCESS;
1024   1      }
1025          
1026          //--------------------------------------------------------------------
1027          // Initialization sequence of SD/MMC
1028          //--------------------------------------------------------------------
1029          STATUS SdReadFlashInfo()
1030          {
1031   1          STATUS Status;
1032   1          int RetryCount;
1033   1      
1034   1          for(RetryCount = 0; RetryCount < 5; RetryCount++)
1035   1          {
1036   2              Status = SdReset();
1037   2              if(Status != STATUS_SUCCESS)
1038   2                  continue;
1039   2      
1040   2              Status = SdDetect();
1041   2              if(Status != STATUS_SUCCESS)
1042   2                  continue;
1043   2      
1044   2              Status = SdGoIdentifyState();
1045   2              if(Status != STATUS_SUCCESS)
1046   2                  continue;
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 18  

1047   2      
1048   2              Status = SdGoStandbyState();
1049   2              if(Status != STATUS_SUCCESS)
1050   2                  continue;
1051   2      
1052   2              Status = SdReadCSD();
1053   2              if(Status != STATUS_SUCCESS)
1054   2                  continue;
1055   2      
1056   2              Status = SdGoTransferState();
1057   2              if(Status != STATUS_SUCCESS)
1058   2                  continue;
1059   2              else
1060   2                  return STATUS_SUCCESS;
1061   2          }
1062   1          return STATUS_FLASH_ERROR;
1063   1      }
1064          
1065          #ifdef DEBUG_FLASH_ERASE
              //----------------------------------------------------------------------------
              STATUS SdEraseDevice()
              {
                STATUS Status;
              
              // ERASE_WR__BLK_START.
               *((UINT32 *)(&CmdBuf[1])) = 0;
               SdIssueCmd(32, SD_CMD_SHORT_RSP);
               if ((Status = SdReadRsp(SdRespBuf, RSP_LEN)) != STATUS_SUCCESS)
                  return Status;
              // ERASE_WR__BLK_END.
               *((UINT32 *)(&CmdBuf[1])) = SdAvailableBlocks << BYTES_PER_SECTOR_SHIFT;
               SdIssueCmd(33, SD_CMD_SHORT_RSP);
               if ((Status = SdReadRsp(SdRespBuf, RSP_LEN)) != STATUS_SUCCESS)
                  return Status;
              // ERASE.
               *((UINT32 *)(&CmdBuf[1])) = 0;
               SdIssueCmd(38, SD_CMD_SHORT_RSP);
               if ((Status = SdReadRsp(SdRespBuf, RSP_LEN)) != STATUS_SUCCESS)
                  return Status;
              
                return STATUS_SUCCESS;
              }
              #endif
1090          
1091          //----------------------------------------------------------------------------
1092          // Description:
1093          //   Handle the media change event
1094          //----------------------------------------------------------------------------
1095          void SdMediaChange()
1096          {
1097   1        if (SdCardExist())
1098   1        {
1099   2          BYTE i = MAX_FLASH_RETRY_TIMES;
1100   2      
1101   2          //DebugShow("SD/MMC Card Exist\r\n");
1102   2          //SdCtrlReset(); //2006.07.07
1103   2          //SdPowerOn(); //2006.07.07
1104   2      
1105   2          do
1106   2          {
1107   3            SdMediaStatus = SdReadFlashInfo();
1108   3            i--;
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 19  

1109   3          }while (i && (SdMediaStatus != STATUS_SUCCESS));
1110   2          if (SdMediaStatus == STATUS_SUCCESS)
1111   2            SdMediaStatus = STATUS_MEDIA_CHANGE;
1112   2      
1113   2        }
1114   1        else
1115   1        {
1116   2          //DebugShow("SD/MMC Card Not Exist\r\n");
1117   2          SdStopClk();
1118   2          SdPowerOff();
1119   2          SdAvailableBlocks = 0;
1120   2          SdMediaStatus = STATUS_NO_MEDIA;
1121   2        }
1122   1      }
1123          
1124          //----------------------------------------------------------------------------
1125          // Description:
1126          //   use to change STATUS when device "Start"
1127          //----------------------------------------------------------------------------
1128          void SdStart()
1129          {
1130   1          if(SdCardExist())

⌨️ 快捷键说明

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