Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Интерфейс SD-карты.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
JohnKorsh
Пытаюсь работать с SD картой, в первый раз используя известную библиотеку FATFS.
Не поможет ли кто разобраться?
У меня версия FATFS R0.09 24 Jan 2013.
Не инициализируется карта (Ппоцедура disk_initialize (0)).
Прописал физическое соединение в модуле mmcbb.c.
Обмен по SPI идёт - посылается 80 тактов при CS=1, затем CS=0.
Посылается команда CMD0 с параметром 0x0, ответ 1.
Посылается команда CMD8 с параметром 0x01AA, ответ 0x000001AA.
Далее, карта не выходит из Iddle состояния, в ответ на циклически посылаемую команду ACMD41 с аргументом 1UL << 30 получаю 01, а не 0.
Менял скорость обмена. Менял карты. Форматировал карты на PC. Тот же эффект.
Стал ковыряться в исходниках FATFS и спецификации на SD.
Как то странно в FATFS выглядит функция посылки команды, точнее её часть, относящаяся к приёму ответа:

Код
    /* Receive command response */
    if (cmd == CMD12) rcvr_mmc(&d, 1);    /* Skip a stuff byte when stop reading */
    n = 10;                                /* Wait for a valid response in timeout of 10 attempts */
    do
        rcvr_mmc(&d, 1);
    while ((d & 0x80) && --n);

    return d;            /* Return with the response value */


по спецификации на команду ACMD41 должен быть 6-байтный ответ. Бит окончания инициализации - старший во втором байте. А приведённый код, насколько я понимаю, вернёт последний из 6 байт.
Вопроса у меня два:
1. В чём причина того, что нет имнициализации карты?
2. Не даст ли кто ссылку на последнюю версию спецификации на SD?
JohnKorsh
.Добрый день!
Отвечаю сам себе - может кому пригодится, чтобы не наступали на те же грабли.
Всё дело в компиляторе Keil и в особенностях команд SD-карт. Команда ACMD41 на самом деле представляет из себя две последовательно посылаемые команды: (это верно для всех команд, начинающихся на "A")
CMD55 - эта команда говорит карте, что следующая команда специфическая и
CMD41 - собственно команды.
В библиотеке FatFS эта особенность реализована рекурентнтным вызовом. Компилятор Keil требует какого то
служебного слова перед функциями, вызываемыми рекурентно. (Кстати, я в Help не Keil не нашёл, может, кто подскажет, что
за слово).
Я просто переписал функцию для посылки команд без вызова самой себя, хорошо, что рекурентность всего два.
etoja
А вы используйте GNU C компилятор (ццц.yagarto.de)
и вот эти исходники для LPC1343: ццц.universalair.co.uk/tags/forebrainfirmware
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.