реклама на сайте
подробности

 
 
> DMA пересылка и SD карта на LPC3250, Клинит контроллер DMA
scorp2011
сообщение Mar 2 2011, 19:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 29-01-11
Пользователь №: 62 559



Здравствуйте.
Есть LPC3250 с подключенной SD картой в 4битном режиме. Всё скопировано с Phytec платы(на ней кстати такая же проблема). Запускаю простую програмку (В RTOS PowerPac с одной задачей и файловой системой как в примере). В бесконечном цикле открываю файл, записываю пару килобайт, закрываю файл. Если программу с данными запустить в IRAM то проблем нет. Если же в SDRAM то через некоторое время код виснет в этой функции:
int FS_MMC_HW_X_WriteData(U8 Unit, const void * pBuffer, unsigned NumBytes, unsigned NumBlocks) {
int r;
U32 * pFifoReg;
U32 * p;

pFifoReg = (void *)MCI_FIFO_ADDR;
NumBytes *= NumBlocks;
p = (U32 *)pBuffer;
if (((U32)pBuffer & 0x1f) || (NumBytes & 0x1f)) {
p = _GetBufferAddr();
FS_MEMCPY(p, pBuffer, NumBytes);
}
OS_ARM_DCACHE_CleanRange(p, (NumBytes + 0x1f) & ~0x1f);
_DMAStart(pFifoReg, p, NumBytes, MEMORY_TO_PERIPHAL);
_WriteControlReg(Unit);
r = 0; // No error so far
while ((GPDMA_RAW_INT_TCSTAT & 0x01) == 0); Виснит тут
GPDMA_INT_TCCLR = 1;
if (MCI_STATUS & (1 << 1)) {
MCI_CLEAR = (1 << 1);
return FS_MMC_CARD_WRITE_CRC_ERROR;
}
if (MCI_STATUS & (1 << 4)) {
MCI_CLEAR = (1 << 4);
return FS_MMC_CARD_WRITE_CRC_ERROR;
}
while((MCI_STATUS & (1 << 10)) == 0);
MCI_CLEAR = (1 << 10);
while((MCI_STATUS & (1 << 8)) == 0);
MCI_CLEAR = (1 << 8);
return r;
}
Пробовал буфер, откуда пишу в файл, организовать в IRAM. Заметил что виснет когда в функцию передается адрес памяти в SDRAM, видимо файловая система использует внутренние буферы из стека для записи системной информации.
Ну вообщем вопрос вот в чем, почему DMA клинит? Как его настроить? Вроде в описании LPC3250 нет как перешивать приоритеты. Как бы понятно что происходит конфликт DMA и самого кода. Какой выход? Один из вариантов, организовать все буферы для файловой системы в IRAM, но есть опасения что файловая система для буферов использует стек который в SDRAM по любому. Кто что может посоветовать?
Подумал может это контроллер SD карты не отвечает на запросы DMA(If a peripheral performs a split or retry,
the DMA Controller stalls and waits until the transaction can complete), но почему тогда всё работает когда код в IRAM?

Сообщение отредактировал scorp2011 - Mar 2 2011, 21:45
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 11:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016