Перейти к содержанию
    

FatFS файловая система от ChaN

Здравствуйте!

Портировал 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-памяти), ведь основной хватает. Могло ли это повлиять?

Буду рад полезной информации на данную тему.

Изменено пользователем rezident
Оформление цитаты исходника.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В экзампле от 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)

Изменено пользователем M_Andrey

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Благодарю за подсказку

написал так

 /* 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...