Перекопал весь инет, но так и не нашел в какую сторону смотреть. Суть проблемы в том, что карта SDSC 2 гига не работает, а карты от 8 гигов до 64 работают без проблем. Частота обмена с картой 4Мб (пока на проводах, больше скорость не поднять).
Сам интерфейс работает в POLLING режиме (ДМА пока без надобности).
Инициализация всех карт проходит на ура. А вот чтение 0 блока SDSC проваливает. Самое грустное, что в отладке не совсем ясна причина, в зависимости как быстро шагаешь или вылетаешь по флагу RXOVERR или в цикле чтения зависаешь, потому как флаги не взлетают
Код:
|
SD_Error SD_ReadBlockS(uint8_t *readbuff, uint32_t ReadAddr, uint32_t NumberOfBlocks, uint16_t BlockSize){
TransferError = SD_OK;
TransferEnd = 0;
StopCondition = 0;
SD_Error errorstatus = SD_OK;
// uint32_t errorstate;
uint32_t count, data, dataremaining;
uint32_t add = ReadAddr;
uint8_t *tempbuff = readbuff;
if(NULL == readbuff)
{
return SD_INVALID_PARAMETER;
}
TransferError = SD_OK;
if((add + NumberOfBlocks) › (SDCardInfo.LogBlockNbr))
{
errorstatus = SD_ADDR_MISALIGNED;
return SD_REQUEST_NOT_APPLICABLE;
}
/* Initialize data control register */
SDMMC1-›DCTRL = 0U;
if(SDCardInfo.CardType != CARD_SDHC_SDXC)
{
add *= 512U;
}
/* Configure the SD DPSM (Data Path State Machine) */
SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BLOCKSIZE;
SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_512b;
SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;
SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
SDIO_DataConfig(&SDIO_DataInitStructure);
/* Read block(s) in polling mode */
if(NumberOfBlocks › 1U)
{
SDCardInfo.Context = SD_CONTEXT_READ_MULTIPLE_BLOCK;
/* Read Multi Block command */
errorstatus = SDMMC_CmdReadMultiBlock(add);
}
else
{
SDCardInfo.Context = SD_CONTEXT_READ_SINGLE_BLOCK;
/* Read Single Block command */
errorstatus = SDMMC_CmdReadSingleBlock(add);
}
if(errorstatus != SD_OK)
{
/* Clear all the static flags */
__SDMMC_CLEAR_FLAG(SDMMC_STATIC_FLAGS);
SDCardInfo.Context = SD_CONTEXT_NONE;
return SD_ERROR;
}
/* Poll on SDMMC flags */
dataremaining = SDIO_DataInitStructure.SDIO_DataLength; //config.DataLength;
while(!(SDMMC1-›STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND)))
{
if(SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) && (dataremaining › 0U))
{
/* Read data from SDMMC Rx FIFO */
for(count = 0U; count ‹ 8U; count++)
{
data = SDMMC1-›FIFO;
*tempbuff = (uint8_t)(data & 0xFFU);
tempbuff++;
dataremaining--;
*tempbuff = (uint8_t)((data ›› 8U) & 0xFFU);
tempbuff++;
dataremaining--;
*tempbuff = (uint8_t)((data ›› 16U) & 0xFFU);
tempbuff++;
dataremaining--;
*tempbuff = (uint8_t)((data ›› 24U) & 0xFFU);
tempbuff++;
dataremaining--;
}
}
}
/* Send stop transmission command in case of multiblock read */
if((SDMMC1-›STA & SDIO_FLAG_DATAEND) && (NumberOfBlocks › 1U))
{
if(SDCardInfo.CardType ‹ SDIO_SECURE_DIGITAL_IO_CARD)
{
/* Send stop transmission command */
errorstatus = SDMMC_CmdStopTransfer();
if(errorstatus != SD_OK)
{
/* Clear all the static flags */
__SDMMC_CLEAR_FLAG(SDMMC_STATIC_FLAGS);
SDCardInfo.Context = SD_CONTEXT_NONE;
return errorstatus;
}
}
}
/* Get error state */
if(SDMMC1-›STA & SDIO_FLAG_DTIMEOUT)
{
/* Clear all the static flags */
__SDMMC_CLEAR_FLAG(SDMMC_STATIC_FLAGS);
SDCardInfo.Context = SD_CONTEXT_NONE;
return SD_DATA_TIMEOUT;
}
else if(SDMMC1-›STA & SDIO_FLAG_DCRCFAIL)
{
/* Clear all the static flags */
__SDMMC_CLEAR_FLAG(SDMMC_STATIC_FLAGS);
SDCardInfo.Context = SD_CONTEXT_NONE;
return SD_DATA_CRC_FAIL;
}
else if(SDMMC1-›STA & SDIO_FLAG_RXOVERR)
{
/* Clear all the static flags */
__SDMMC_CLEAR_FLAG(SDMMC_STATIC_FLAGS);
SDCardInfo.Context = SD_CONTEXT_NONE;
return SD_RX_OVERRUN;
}
else
{
/* Nothing to do */
}
/* Clear all the static flags */
__SDMMC_CLEAR_FLAG(SDMMC_STATIC_DATA_FLAGS);
return SD_OK;
} |
В принципе 2 гиговые карточки уже тяжело найти, но все таки не нравится когда что-то идет не совсем так, может у кого встречалась чудная проблема.