Здравствуйте. Есть 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
|