📄 sd.lst
字号:
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 + -