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