Tanker 0 15 февраля, 2010 Опубликовано 15 февраля, 2010 (изменено) · Жалоба Здравствуйте! Портировал FatFS на IAR для LPC2364. Смог прочитать CID и CSD карты disk_initialize, карты инициализируются нормально, делаю выводы о правильности хардваре и софтваре. Перехожу к чтению 0-сектора SD-карты, через disc_read, там есть участок кода: ready_reception(count, 512); /* Ready to receive data blocks */ cmd = (count > 1) ? CMD18 : CMD17; /* Transfer type: Single block or Multiple block */ if (send_cmd(cmd, sector, 1, &resp) /* Start to read */ && !(resp & 0xC0580000)) { rp = 0; do { while ((rp == XferWp) && !(XferStat & 0xC)) { /* Wait for block arrival */ } if (XferStat & 0xC); break;/* Abort if any error has occured */ СЮДА СТАБИЛЬНО ВЫПАДАЮ!!! Поскольку XferStat изменяется в прерывании DMA (которое срабатывает, там стоит счётчик и я вижу что он увеличивается при попытках что-то прочитать из секторов карты) делаю вывод, что что-то неправильно у меня в настройке DMA. Неужели придётся разбираться с DMA ?!! там же чёрт ногу сломит (какие-то связанные списки и др. муть) а я начинающий ;-) В экзампле от FatFS, буферы для DMA находятся в USB-memory, я указал "обычную память" (вернее убрал атрибут того что массив находится в области usb-памяти), ведь основной хватает. Могло ли это повлиять? Буду рад полезной информации на данную тему. Изменено 15 февраля, 2010 пользователем rezident Оформление цитаты исходника. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 5 15 февраля, 2010 Опубликовано 15 февраля, 2010 · Жалоба http://www.siwawi.arubi.uni-kl.de/avr_proj...anfat_lpc2k_mci Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
M_Andrey 0 15 февраля, 2010 Опубликовано 15 февраля, 2010 (изменено) · Жалоба В экзампле от FatFS, буферы для DMA находятся в USB-memory, я указал "обычную память" (вернее убрал атрибут того что массив находится в области usb-памяти), ведь основной хватает. Могло ли это повлиять? Буду рад полезной информации на данную тему. Вот как-раз зря это сделал! DMA работает только с определенными областями памяти, USB-memory как раз в их числе! См. "user.manual.lpc23xx.pdf" стр. 628: Memory region Address range Memory Type On-chip RAM 0x7FD0 0000 - 0x7FD0 1FFF USB RAM (8 kB) Изменено 15 февраля, 2010 пользователем M_Andrey Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanker 0 15 февраля, 2010 Опубликовано 15 февраля, 2010 · Жалоба Благодарю за подсказку написал так /* Block transfer buffer (located in USB RAM) */ __no_init DWORD DmaBuff[N_BUF][128] @ "USB_DMA_RAM"; // Block transfer FIFO __no_init DWORD LinkList[N_BUF][4] @ "USB_DMA_RAM"; // DMA link list и заработало... но не сразу, там ещё есть интересные функции блочной записи/чтения данных написанные на AS (Store_Block и Load_Block) На Store_Block прога вешалась, не стал в асме разбираться (скорее всего портак допустил при портировании из GCC в IAR) заменил на memcpy, после чего пошли сектора читаться. Теперь (как любитель лёгкой жизни) жду от добрых людей портированные на IAR функции Store_Block и Load_Block Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться