?? sd.c
字號:
if(!ReadyForData)
continue;
CSRWrite(SD_BASE + SD_BUFFER_BASE,
((TDataCast *)&CurrentBuffer)->ucByte[0]);
*((UINT32 *)(&SdCmdBuf[1])) =
SectorStart << BYTES_PER_SECTOR_SHIFT; //在Cmd Buffer中設置將要讀取的扇區地址
if(SectorCount > 1) //如果是讀取多個扇區,則向SD/MMC卡發送讀取多個扇區命令
{ CSRWrite(SD_BASE + SD_CLK_CTRL, CSRRead(SD_BASE + SD_CLK_CTRL) | SD_CLK_AUTO_DIS);
Status = SdSendCmd(READ_MUL_BLOCK, SdCmdBuf);
if(Status != STATUS_SUCCESS)
continue;
}
else
{
Status = SdSendCmd(READ_BLOCK, SdCmdBuf); //如果是一個扇區,則向SD/MMC卡發送讀取一個扇區的命令
if(Status != STATUS_SUCCESS)
continue;
}
if(CSRRead(SD_BASE + SD_IE) & SD_CRC16_ERR) //讀取SD/MMC卡的中斷寄存器,檢查讀取的數據的CRC校驗碼是否有錯,有錯則重試讀取過程,最多5次。
{
CSRWrite(SD_BASE + SD_IE, ~SD_CRC16_ERR);
continue;
}
else
return STATUS_SUCCESS;
}
return STATUS_FLASH_ERROR;
}
STATUS SdReadSector()
{
STATUS Status = SdReadOneSector();
SectorStart ++;
return Status;
}
STATUS SdReadNextSector()
{
STATUS Status;
bit Stop;
Stop = SectorCount == 1;
CSRWrite(SD_BASE + SD_BUFFER_BASE, ((TDataCast *)&CurrentBuffer)->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);
if ((Status = SdWaitCmd()) != STATUS_SUCCESS)
return Status;
if (CSRRead(SD_BASE + SD_IE) & SD_CRC16_ERR)
{
CSRWrite(SD_BASE + SD_IE, ~SD_CRC16_ERR);
return STATUS_DATA_ERROR;
}
if (Stop)
return SdStopCmd();
return STATUS_SUCCESS;
}
//--------------------------------------------------------------------
// Write one sector of data to SD/MMC
//--------------------------------------------------------------------
STATUS SdWriteOneSector()
{
STATUS Status;
BYTE CrcSts;
int RetryCount1 , RetryCount2;
bool ReadyForData;
if(!(CSRRead(SD_BASE + SD_STATUS) & SD_WPD))
return STATUS_WRITE_PROTECT;
SdWaitCard();
for(RetryCount1 = 0; RetryCount1 < 5; RetryCount1++)
{
ReadyForData = false;
for(RetryCount2 = 0; RetryCount2 < 20; RetryCount2++) //讀取SD/MMC卡的狀態,SD/MMC卡沒準備好發送數據則循環重試20次
{
*((UINT32 *)(&SdCmdBuf[1])) = RCA;
Status = SdSendCmd(SEND_STATUS, SdCmdBuf); //發送帶一個response的命令,以得到當前SD/MMC卡的狀態
if(Status != STATUS_SUCCESS)
continue;
if(SdRespBuf[3] & 0x01) // READY_FOR_DATA in Card Status
{
ReadyForData = true;
break;
}
}
if(!ReadyForData)
continue;
CSRWrite(SD_BASE + SD_BUFFER_BASE,
((TDataCast *)&CurrentBuffer)->ucByte[0]);
*((UINT32 *)(&SdCmdBuf[1])) =
SectorStart << BYTES_PER_SECTOR_SHIFT; //在Cmd Buffer中設置將要寫入的扇區地址
if (SectorCount > 1) //如果是寫入多個扇區,則向SD/MMC卡發送寫多個扇區命令
{
Status = SdSendCmd(WRITE_MUL_BLOCK, SdCmdBuf);
if(Status != STATUS_SUCCESS)
continue;
}
else
{
Status = SdSendCmd(WRITE_BLOCK, SdCmdBuf); //若為寫一個扇區,則向SD/MMC卡發送寫一個扇區的命令
if(Status != STATUS_SUCCESS)
continue;
}
CrcSts = (CSRRead(SD_BASE + SD_STATUS) & SD_CRC16_STS) >> 3; //讀取SD/MMC卡返回的CRC狀態信息,以判斷寫入過程是否正確
if(CrcSts != GOOD_CRC16_STS)
continue;
else
return STATUS_SUCCESS;
}
return STATUS_FLASH_ERROR;
}
STATUS SdWriteSector()
{
STATUS Status = SdWriteOneSector();
SectorStart ++;
return Status;
}
STATUS SdWriteNextSector()
{
STATUS Status;
BYTE CrcSts;
bit Stop;
Stop = SectorCount == 1;
SdWaitCard();
CmdTimer = SD_CMD_TIMEOUT;
if (CmdTimer == 0)
{
return STATUS_FLASH_ERROR;
}
// CSRWrite(SD_BASE + SD_BUFFER_BASE, Buffer >> 8);
// hsin-chang huang
CSRWrite(SD_BASE + SD_BUFFER_BASE, ((TDataCast *)&CurrentBuffer)->ucByte[0]);
CSRWrite(SD_BASE + SD_COMMAND, SD_CMD_TX_DATA_ONLY);
if ((Status = SdWaitCmd()) != STATUS_SUCCESS)
return Status;
CrcSts = (CSRRead(SD_BASE + SD_STATUS) & SD_CRC16_STS) >> 3;
if (CrcSts != GOOD_CRC16_STS)
{
return STATUS_DATA_ERROR;
}
if (Stop)
return SdStopCmd();
return STATUS_SUCCESS;
}
//--------------------------------------------------------------------
// Initialization sequence of SD/MMC
//--------------------------------------------------------------------
STATUS SdReadFlashInfo()
{
STATUS Status;
int RetryCount;
for(RetryCount = 0; RetryCount < 5; RetryCount++)
{
Status = SdReset();
if(Status != STATUS_SUCCESS)
continue;
Status = SdDetect();
if(Status != STATUS_SUCCESS)
continue;
Status = SdGoIdentifyState();
if(Status != STATUS_SUCCESS)
continue;
Status = SdGoStandbyState();
if(Status != STATUS_SUCCESS)
continue;
Status = SdReadCSD();
if(Status != STATUS_SUCCESS)
continue;
Status = SdGoTransferState();
if(Status != STATUS_SUCCESS)
continue;
else
return STATUS_SUCCESS;
}
return STATUS_FLASH_ERROR;
}
//----------------------------------------------------------------------------
// Description:
// Handle the media change event
//----------------------------------------------------------------------------
void SdMediaChange()
{
if (SdCardExist())
{
BYTE i = MAX_FLASH_RETRY_TIMES;
SdCtrlReset();
SdPowerOn();
do
{
SdMediaStatus = SdReadFlashInfo();
i--;
}while (i && (SdMediaStatus != STATUS_SUCCESS));
if (SdMediaStatus == STATUS_SUCCESS)
SdMediaStatus = STATUS_MEDIA_CHANGE;
}
else
{
SdStopClk();
SdPowerOff();
SdAvailableBlocks = 0;
SdMediaStatus = STATUS_NO_MEDIA;
}
}
//----------------------------------------------------------------------------
// Description:
// use to change STATUS when device "Start"
//----------------------------------------------------------------------------
void SdStart()
{
if(SdCardExist())
SdMediaStatus = STATUS_SUCCESS;
}
//----------------------------------------------------------------------------
// Description:
// use to change STATUS when device "eject"
//----------------------------------------------------------------------------
void SdEject()
{
SdMediaStatus = STATUS_NO_MEDIA;
}
//----------------------------------------------------------------------------
// Description:
// Query the current device information
// *NumScsiBlocks = 0 means that the device does not exist now
//----------------------------------------------------------------------------
STATUS SdQueryDevice()
{
STATUS OrgStatus = SdMediaStatus;
// DebugPrint("<SdQueryDevice> Status = %bu\r\n", SdMediaStatus);
if (SdMediaStatus == STATUS_NO_MEDIA)
return SdMediaStatus;
if (SdMediaStatus == STATUS_MEDIA_CHANGE)
SdMediaStatus = STATUS_SUCCESS;
DeviceInfo.TotalBlocks = SdAvailableBlocks;
DeviceInfo.BlockSize = BYTES_PER_SECTOR;
if (CardType == CARD_SD)
DeviceInfo.WriteProtect = SdWriteProtect();
else
DeviceInfo.WriteProtect = false;
return OrgStatus;
}
//----------------------------------------------------------------------------
// Description:
// The SD interrupt handler
//----------------------------------------------------------------------------
void SdIntHandler(BYTE Event)
{ Event=Event;
SdGetFlashInfoTimer = GET_FLASH_INFO_DELAY;
}
//----------------------------------------------------------------------------
// Description:
// Make the SD device into suspend mode
//----------------------------------------------------------------------------
void SdSuspend()
{
SdStopClk();
SdPowerOff();
}
//----------------------------------------------------------------------------
// Description:
// Make the CF device resume
//----------------------------------------------------------------------------
void SdResume()
{
if (SdCardExist())
{
SdPowerOn();
SdReadFlashInfo();
}
}
//----------------------------------------------------------------------------
// Description:
// Initiate the SD device
//----------------------------------------------------------------------------
void SdInit()
{
if (SdCardExist())
{
SdMediaChange();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -