|
DMA пересылка и SD карта на LPC3250, Клинит контроллер DMA |
|
|
|
Mar 2 2011, 19:50
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Apr 5 2011, 19:21
|
Группа: Новичок
Сообщений: 3
Регистрация: 5-04-11
Пользователь №: 64 154

|
 Похоже что у меня та же байда( И код у меня похожий! В перенос буферов IRAM помог? "Есть LPC3250 с подключенной SD картой в 4битном режиме. Всё скопировано с Phytec платы(на ней кстати такая же проблема). " У Phytec косячёк нет 5 притяжек на линиях данных и команд у меня это приводило к снижению скорости записи( Номинал притяжек от 10К до 100К! за то 22ОМ стоят зачем-то) "В перенос буферов IRAM помог?" Т е внутренних буферов файловой)
|
|
|
|
|
Apr 6 2011, 16:42
|
Группа: Новичок
Сообщений: 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 года после выхода проца и на тебе! по факту он не пашет(
|
|
|
|
|
Apr 6 2011, 17:30
|

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.
|
|
|
|
|
Apr 7 2011, 10:10
|
Участник

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

|
При переносе всех буферов в IRAM проблема исчезла, но на самом деле проблема была в другом. я понизил в 2 раза скорость шины HCLK со 104 до 52. Когда вернул, то всё заработало даже в SDRAM
Сообщение отредактировал scorp2011 - Apr 7 2011, 10:11
|
|
|
|
|
Apr 7 2011, 18:59
|
Группа: Новичок
Сообщений: 3
Регистрация: 5-04-11
Пользователь №: 64 154

|
AlexandrY мне GeoSpyder GSM пока не нужен))) Но разработка хорошая сразу видно. У меня с HSUART2 на 921600 проблемы постоянно в RX-е крутиться и не передаёт! Может руки у меня кривые( Вы на этой скорости побывали? Я использовал код из NXP CDL. Взял просто UART5 всё отлично пашет) но вот с HSUART2 на 921600 просто беда, а нужна именно эта скорость( может что подскажите)
И ещё. вы с Кейлом работаете как я понял. А с RVDS не работали?
Сообщение отредактировал dima222 - Apr 7 2011, 19:03
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|