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

📄 sd.c

📁 增强型51单片机fs7821sd卡、mmc卡读写程序
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -