Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DMA пересылка и SD карта на LPC3250
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
scorp2011
Здравствуйте.
Есть 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?
AlexandrY
Не понял, этот код вы сами написали или он шел с операционкой?
scorp2011
Цитата(AlexandrY @ Mar 3 2011, 11:05) *
Не понял, этот код вы сами написали или он шел с операционкой?

Это драивер котории шел с фаиловои системои PowerPac в комплекте с операционкои
dima222
smile3046.gif Похоже что у меня та же байда( И код у меня похожий! В перенос буферов IRAM помог?

"Есть LPC3250 с подключенной SD картой в 4битном режиме. Всё скопировано с Phytec платы(на ней кстати такая же проблема). "
У Phytec косячёк нет 5 притяжек на линиях данных и команд у меня это приводило к снижению скорости записи( Номинал притяжек от 10К до 100К! за то 22ОМ стоят зачем-то)



"В перенос буферов IRAM помог?" Т е внутренних буферов файловой)
AlexandrY
Нет там никаких проблем IRAM/RAM, но возможно нарушена целостность сигналов к внешней RAM у тех кто имеет проблемы на LPC3250 c SD картами.
Вот рабочий проект где LPC3250 показывает рекорды скорости чтения с SD карт.
http://eewiki.ru/wiki/Example_SDFATSpeed_for_ARMGS10

При работе с DMA надо еще помнить о том, что буфер обмена должен быть некэшированный и небуферизируемый.

Недавно, кстати, обнаружил китайские microSD карты которые отзывались на CMD0 очень медленно, так медленно что истекал таймаут у файловой системы от KEIL-а, ну и файловая соответственно не поднималась.
dima222
Цитата(AlexandrY @ Apr 5 2011, 23:52) *
Нет там никаких проблем IRAM/RAM, но возможно нарушена целостность сигналов к внешней RAM у тех кто имеет проблемы на LPC3250 c SD картами.
Вот рабочий проект где LPC3250 показывает рекорды скорости чтения с SD карт.
http://eewiki.ru/wiki/Example_SDFATSpeed_for_ARMGS10

При работе с DMA надо еще помнить о том, что буфер обмена должен быть некэшированный и небуферизируемый.

Недавно, кстати, обнаружил китайские microSD карты которые отзывались на CMD0 очень медленно, так медленно что истекал таймаут у файловой системы от KEIL-а, ну и файловая соответственно не поднималась.


Нет проблемы есть( Если и у меня виснет в той же строке кода! У двоих сразу нарушена "целостность сигналов к внешней RAM"? Достаточно глянуть в ES_LPC3250.pdf и видно что с DMA не всё так гладко! " надо еще помнить о том, что буфер обмена должен быть некэшированный и небуферизируемый" тут полностью согласен) "Недавно, кстати, обнаружил китайские microSD" а я вот не китайские найти не могу)

А про скорости интересно) AlexandrY сами проверяли? А то скорости прям ну очень хорошие) Был случай что карточка китайка 32К почти 1 секунду писала) С HSUART тоже проблемы( почти 3 года после выхода проца и на тебе! по факту он не пашет(
AlexandrY
Цитата(dima222 @ Apr 6 2011, 19:42) *
А про скорости интересно) AlexandrY сами проверяли?


Ну чем мне вас убедить?!
Купите GeoSpyder GSM и сами убедитесь.
У меня там скорость обмена с сопроцессором по HUSART ровно 1428561 бит/сек. Нулевые предделители.
Все UART-ы непрерывно логятся на предмет ошибок, так сутками идет обмен и ни одной ошибки.
DMA задействован в это время по полной. Идет запись/чтение SD карты и запись/чтение в аудиокодеки.
И еще одновременно работает несколько TCP соединений по PPP по UART через GSM модем и работает GPS модуль по UART.



scorp2011
При переносе всех буферов в IRAM проблема исчезла, но на самом деле проблема была в другом. я понизил в 2 раза скорость шины HCLK со 104 до 52. Когда вернул, то всё заработало даже в SDRAM
dima222
AlexandrY мне GeoSpyder GSM пока не нужен))) Но разработка хорошая сразу видно. У меня с HSUART2 на 921600 проблемы постоянно в RX-е крутиться и не передаёт! Может руки у меня кривые( Вы на этой скорости побывали? Я использовал код из NXP CDL. Взял просто UART5 всё отлично пашет) но вот с HSUART2 на 921600 просто беда, а нужна именно эта скорость( может что подскажите)



И ещё. вы с Кейлом работаете как я понял. А с RVDS не работали?
AlexandrY
Цитата(dima222 @ Apr 7 2011, 21:59) *
У меня с HSUART2 на 921600 проблемы постоянно в RX-е крутиться и не передаёт! Может руки у меня кривые( Вы на этой скорости побывали?...

И ещё. вы с Кейлом работаете как я понял. А с RVDS не работали?


Пробовал конечно и на скорости 921600 когда опасался что на большей скорости работать не будет.
Но только у меня правило не использовать либ от демок для KIT-ов.
Их же пишут студенты, а тестируют покупатели KIT-ов. Поэтому вопросы касающиеся всяких левых либ я не комментирую в основном.
Мой пример с FS от Keil-а и китайской картой (до этого юзали тайваньские с абсолютно той же маркировкой) просто для того чтобы показать
какие причудливые баги могут создавать вместе некачественный софт и железо.

Могу только сказать, что для HUSART я DMA не использую, ибо использую программное XON/XOFF управление потоком.
Но за то применяю кольцевые буферы по 16К.
Вообще если ваша проблема легко воспроизводится то ее цена - десять минут работы с JTAG-ом. Странно что она вас так долго беспокоит.

С RVDS не работаю если имеется в виду cреда разработки. А компилятор один и тот же - RVCT.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.