Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC2478+SD/MMC card interface
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
LiloQQ
Доброго дня!

Нужен совет по использованию периферийного модуля LPC2478 для работы с SD/MMC картами.
Ситуация такова: используется microSD QUMO 2Gb, карта исправно проходит инициализацию и нормально отвечает на любые команды, но чтение/запись произвести не удаётся. Фактически после посылки CMD17 и перевода модуля на приём получаю MCISTATUS -> RXOVERRUN, при этом MCIFIFOCNT = 0, MCIFIFO0-MCIFIFO15 = 0.

Последовательность инициализации: CMD0 -> ACMD41 -> CMD2 -> CMD3 -> CMD9 -> CMD7 -> ACMD6(на этом этапе включается 4х битный интерфейс) -> CMD16(блок 512 байт) -> CMD17 на этом этапе приходит подтверждение, что команда получена и карта находится в TRANSFER STATE, но вцелом тишина и переполнение очереди в MCISTATUS.

За основу взят популярный пример из состава Keil переложенный в IAR. DMA пока не использую.

CODE

// Чтение одного блока
uint32 MCI_Read_Block(uint32 blockNum)
{
uint32 i;
uint32 DataCtrl = 0;

MCICLEAR = 0x7FF;
MCIDATACTRL = 0;

for (i = 0; i < 0x10; i++);

if (MCI_CheckStatus() != TRUE)
{
MCI_Send_Stop();

return(FALSE);
}


MCIDATATIMER = DATA_TIMER_VALUE;
MCIDATALENGTH = BLOCK_LENGTH;

if (MCI_Send_Read_Block(blockNum) == FALSE)
{
return (FALSE);
}

DataCtrl |= ((1 << 0) | (1 << 1) | (DATA_BLOCK_LEN << 4));


MCIDATACTRL = DataCtrl;

for (i = 0; i < 0x10; i++);

return (TRUE);
}

int main()
{

...

if (MCI_FullCardInitialization())
{


if (MCI_Read_Block(1))
{
while (!(MCISTAUS & MCI_RX_HALF_FULL)) {}; // зацикливает
}
else
{
// fatal error
}

}

}

KAlex
Цитата(LiloQQ @ Mar 26 2011, 14:17) *
Последовательность инициализации: CMD0 -> ACMD41 -> CMD2 -> CMD3 -> CMD9 -> CMD7 -> ACMD6(на этом этапе включается 4х битный интерфейс) -> CMD16(блок 512 байт) -> CMD17 на этом этапе приходит подтверждение, что команда получена и карта находится в TRANSFER STATE, но вцелом тишина и переполнение очереди в MCISTATUS.


Не знаю как там в примере реализовано, а у меня так:
После выдачи CMD17 я респонс не читаю, а просто клокаю по линии CLK пока на DAT0 не появится лог 0 и начинаю читать.

Как показывает практика многие карты ведут себя довольно странно. Некоторым нужно до 1000 клоков при первом использовании CMD17, пока на DAT0 не появится 0.
У меня таймаут стоит на 1024 клока.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.