?? sdmmc_mci.c
字號:
/// Addressed card sends its card-specific
/// data (CSD) on the CMD line.
/// Returns the command transfer result (see SendCommand).
/// \param pSd Pointer to a SD card driver instance.
//------------------------------------------------------------------------------
static unsigned char Cmd9(SdCard *pSd)
{
SdCmd *pCommand = &(pSd->command);
unsigned char error;
TRACE_DEBUG("Cmd9()\n\r");
memset(pCommand, 0, sizeof(SdCmd));
// Fill command information
pCommand->cmd = AT91C_SEND_CSD_CMD;
pCommand->arg = pSd->cardAddress << 16;
pCommand->resType = 2;
pCommand->pResp = pSd->csd;
// Set SD command state
pSd->state = SD_STATE_STBY;
// Send command
error = SendCommand(pSd);
return error;
}
//------------------------------------------------------------------------------
/// Forces the card to stop transmission
/// \param pSd Pointer to a SD card driver instance.
/// \param pStatus Pointer to a status variable.
//------------------------------------------------------------------------------
static unsigned char Cmd12(SdCard *pSd)
{
SdCmd *pCommand = &(pSd->command);
unsigned char error;
unsigned int response;
TRACE_DEBUG("Cmd12()\n\r");
memset(pCommand, 0, sizeof(SdCmd));
// Fill command information
pCommand->cmd = AT91C_STOP_TRANSMISSION_CMD;
pCommand->conTrans = MCI_NEW_TRANSFER;
pCommand->resType = 1;
pCommand->pResp = &response;
// Set SD command state
pSd->state = SD_STATE_STBY;
// Send command
error = SendCommand(pSd);
return error;
}
//------------------------------------------------------------------------------
/// Addressed card sends its status register.
/// Returns the command transfer result (see SendCommand).
/// \param pSd Pointer to a SD card driver instance.
/// \param pStatus Pointer to a status variable.
//------------------------------------------------------------------------------
static unsigned char Cmd13(SdCard *pSd, unsigned int *pStatus)
{
SdCmd *pCommand = &(pSd->command);
unsigned char error;
TRACE_DEBUG("Cmd13()\n\r");
memset(pCommand, 0, sizeof(SdCmd));
// Fill command information
pCommand->cmd = AT91C_SEND_STATUS_CMD;
pCommand->arg = pSd->cardAddress << 16;
pCommand->resType = 1;
pCommand->pResp = pStatus;
// Set SD command state
pSd->state = SD_STATE_STBY;
// Send command
error = SendCommand(pSd);
return error;
}
//------------------------------------------------------------------------------
/// In the case of a Standard Capacity SD Memory Card, this command sets the
/// block length (in bytes) for all following block commands (read, write, lock).
/// Default block length is fixed to 512 Bytes.
/// Set length is valid for memory access commands only if partial block read
/// operation are allowed in CSD.
/// In the case of a High Capacity SD Memory Card, block length set by CMD16
/// command does not affect the memory read and write commands. Always 512
/// Bytes fixed block length is used. This command is effective for LOCK_UNLOCK command.
/// In both cases, if block length is set larger than 512Bytes, the card sets the
/// BLOCK_LEN_ERROR bit.
/// \param pSd Pointer to a SD card driver instance.
/// \param blockLength Block length in bytes.
//------------------------------------------------------------------------------
static unsigned char Cmd16(SdCard *pSd, unsigned short blockLength)
{
SdCmd *pCommand = &(pSd->command);
unsigned char error;
unsigned int response;
TRACE_DEBUG("Cmd16()\n\r");
memset(pCommand, 0, sizeof(SdCmd));
// Fill command information
pCommand->cmd = AT91C_SET_BLOCKLEN_CMD;
pCommand->arg = blockLength;
pCommand->resType = 1;
pCommand->pResp = &response;
// Set SD command state
pSd->state = SD_STATE_STBY;
// Send command
error = SendCommand(pSd);
return error;
}
//------------------------------------------------------------------------------
/// Continously transfers datablocks from card to host until interrupted by a
/// STOP_TRANSMISSION command.
/// \param pSd Pointer to a SD card driver instance.
/// \param blockSize Block size (shall be set to 512 in case of high capacity).
/// \param pData Pointer to the application buffer to be filled.
/// \param address SD card address.
//------------------------------------------------------------------------------
static unsigned char Cmd18(SdCard *pSd,
unsigned short nbBlock,
unsigned char *pData,
unsigned int address)
{
SdCmd *pCommand = &(pSd->command);
unsigned char error;
unsigned int response;
TRACE_DEBUG("Cmd18()\n\r");
memset(pCommand, 0, sizeof(SdCmd));
// Fill command information
pCommand->cmd = AT91C_READ_MULTIPLE_BLOCK_CMD;
pCommand->arg = address;
pCommand->blockSize = SD_BLOCK_SIZE;
pCommand->nbBlock = nbBlock;
pCommand->pData = pData;
pCommand->isRead = 1;
pCommand->conTrans = MCI_NEW_TRANSFER;
pCommand->resType = 1;
pCommand->pResp = &response;
// Set SD command state
pSd->state = SD_STATE_DATA;
// Send command
error = SendCommand(pSd);
return error;
}
//------------------------------------------------------------------------------
/// Write block command
/// \param pSd Pointer to a SD card driver instance.
/// \param blockSize Block size (shall be set to 512 in case of high capacity).
/// \param pData Pointer to the application buffer to be filled.
/// \param address SD card address.
//------------------------------------------------------------------------------
static unsigned char Cmd25(SdCard *pSd,
unsigned short nbBlock,
unsigned char *pData,
unsigned int address)
{
SdCmd *pCommand = &(pSd->command);
unsigned char error;
unsigned int response;
TRACE_DEBUG("Cmd25()\n\r");
memset(pCommand, 0, sizeof(SdCmd));
// Fill command information
pCommand->cmd = AT91C_WRITE_MULTIPLE_BLOCK_CMD;
pCommand->arg = address;
pCommand->blockSize = SD_BLOCK_SIZE;
pCommand->nbBlock = nbBlock;
pCommand->pData = (unsigned char *) pData;
pCommand->conTrans = MCI_NEW_TRANSFER;
pCommand->resType = 1;
pCommand->pResp = &response;
// Set SD command state
pSd->state = SD_STATE_RCV;
// Send command
//return SendCommand(pSd);
error = SendCommand(pSd);
return error;
}
//------------------------------------------------------------------------------
/// Initialization delay: The maximum of 1 msec, 74 clock cycles and supply
/// ramp up time.
/// Returns the command transfer result (see SendCommand).
/// \param pSd Pointer to a SD card driver instance.
//------------------------------------------------------------------------------
static unsigned char Cmd55(SdCard *pSd)
{
SdCmd *pCommand = &(pSd->command);
unsigned char error;
unsigned int response;
TRACE_DEBUG("Cmd55()\n\r");
memset(pCommand, 0, sizeof(SdCmd));
// Fill command information
pCommand->cmd = AT91C_APP_CMD;
pCommand->arg = (pSd->cardAddress << 16);
pCommand->resType = 1;
pCommand->pResp = &response;
// Set SD command state
pSd->state = SD_STATE_STBY;
// Send command
//return SendCommand(pSd);
error = SendCommand(pSd);
return error;
}
//------------------------------------------------------------------------------
/// SPI Mode, Reads the OCR register of a card
/// Returns the command transfer result (see SendCommand).
/// \param pSd Pointer to a SD card driver instance.
/// \param pOcr OCR value of the card
//------------------------------------------------------------------------------
static unsigned char Cmd58(SdCard *pSd, unsigned int *pOcr)
{
SdCmd *pCommand = &(pSd->command);
unsigned char error;
unsigned int response[2];
TRACE_DEBUG("Cmd58()\n\r");
memset(pCommand, 0, sizeof(SdCmd));
// Fill command information
pCommand->cmd = AT91C_READ_OCR_CMD;
pCommand->resType = 3;
pCommand->pResp = &response[0];
// Set SD command state
pSd->state = SD_STATE_STBY;
// Send command
error = SendCommand(pSd);
return error;
}
//------------------------------------------------------------------------------
/// SPI Mode, Set CRC option of a card
/// Returns the command transfer result (see SendCommand).
/// \param pSd Pointer to a SD card driver instance.
/// \param option CRC option, 1 to turn on, 0 to trun off
//------------------------------------------------------------------------------
static unsigned char Cmd59(SdCard *pSd, unsigned char option)
{
SdCmd *pCommand = &(pSd->command);
unsigned char error;
unsigned int response;
TRACE_DEBUG("Cmd59()\n\r");
memset(pCommand, 0, sizeof(SdCmd));
// Fill command information
pCommand->cmd = AT91C_CRC_ON_OFF_CMD;
pCommand->arg = (option & 0x1);
pCommand->resType = 1;
pCommand->pResp = &response;
// Set SD command state
pSd->state = SD_STATE_STBY;
// Send command
error = SendCommand(pSd);
return error;
}
//------------------------------------------------------------------------------
/// Defines the data bus width (
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -