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

 
 
> 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
 
Start new topic
Ответов
dima222
сообщение Apr 5 2011, 19:21
Сообщение #2





Группа: Новичок
Сообщений: 3
Регистрация: 5-04-11
Пользователь №: 64 154



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

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



"В перенос буферов IRAM помог?" Т е внутренних буферов файловой)
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Apr 5 2011, 19:52
Сообщение #3


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



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

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

Недавно, кстати, обнаружил китайские microSD карты которые отзывались на CMD0 очень медленно, так медленно что истекал таймаут у файловой системы от KEIL-а, ну и файловая соответственно не поднималась.
Go to the top of the page
 
+Quote Post
dima222
сообщение Apr 6 2011, 16:42
Сообщение #4





Группа: Новичок
Сообщений: 3
Регистрация: 5-04-11
Пользователь №: 64 154



Цитата(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 года после выхода проца и на тебе! по факту он не пашет(
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Apr 6 2011, 17:30
Сообщение #5


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(dima222 @ Apr 6 2011, 19:42) *
А про скорости интересно) AlexandrY сами проверяли?


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



Go to the top of the page
 
+Quote Post
scorp2011
сообщение Apr 7 2011, 10:10
Сообщение #6


Участник
*

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



При переносе всех буферов в IRAM проблема исчезла, но на самом деле проблема была в другом. я понизил в 2 раза скорость шины HCLK со 104 до 52. Когда вернул, то всё заработало даже в SDRAM

Сообщение отредактировал scorp2011 - Apr 7 2011, 10:11
Go to the top of the page
 
+Quote Post
dima222
сообщение Apr 7 2011, 18:59
Сообщение #7





Группа: Новичок
Сообщений: 3
Регистрация: 5-04-11
Пользователь №: 64 154



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



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

Сообщение отредактировал dima222 - Apr 7 2011, 19:03
Go to the top of the page
 
+Quote Post



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

 


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


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