Подключение SD карты к микроконтроллеру
Подключение SD карты к микроконтроллеру
Здравствуйте, суть темы такова. Решил я подключить к PIC контроллеру СД карту, пишу код сам на ассемблере. Проблема заключается в том, что не удается инициализировать карточку. Вот порядок моих действий:
1) Посылаю 80 тактов СД карте
2) Посылаю команду сброса CMD0, ответ приходит правильный 0х01
3) Затем CMD8, первый байт ответа 0х01, стало быть карта версии 2
4) Отправляем CMD55, ответ 0х01
5) Затем CMD41, и с этого момента начинается фигня, а именно после команды я опрашиваю карту до тех пор пока не придет ответ отличный от FF, приходит FE.
В общем чего только не перепробовал, от CMD1 ответа 0х00 нет, пробую карты на 2ГБ и 8 ГБ. И если команду инициализации отправлять после каждого ответа, тоже приходит ерунда.
Надеюсь на любую помощь, исчерпал все идеи по этой проблеме.
1) Посылаю 80 тактов СД карте
2) Посылаю команду сброса CMD0, ответ приходит правильный 0х01
3) Затем CMD8, первый байт ответа 0х01, стало быть карта версии 2
4) Отправляем CMD55, ответ 0х01
5) Затем CMD41, и с этого момента начинается фигня, а именно после команды я опрашиваю карту до тех пор пока не придет ответ отличный от FF, приходит FE.
В общем чего только не перепробовал, от CMD1 ответа 0х00 нет, пробую карты на 2ГБ и 8 ГБ. И если команду инициализации отправлять после каждого ответа, тоже приходит ерунда.
Надеюсь на любую помощь, исчерпал все идеи по этой проблеме.
- Реклама
Re: Подключение SD карты к микроконтроллеру
MMC, SD ver1, SD ver2, SDHC - какую именно карту?mark3101 писал(а):СД карту
У них у всех отличается алгоритм "побудки". И как раз в районе команды CMD41 / ACMD41.
Даташит на протокол SD изучался? Там есть истинная диаграма инициализации.
В инете гуглится диаграмма "побудки", вроде похожая на правду - точнее не скажу, т.к. дома мне дока по SD не нужна...
Спойлер

Re: Подключение SD карты к микроконтроллеру
Я когда-то писал статью про подключение SD-карточки, там есть ссылки, которые могут быть полезны.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Подключение SD карты к микроконтроллеру
Удалось прочитать блок информации с сд карты на 8 Гб. Теперь вопрос в следующем. Я задумал устройство считывания текстовой информации с сд карты. Файловая система на карте FAT32. Искал информацию по этой файловой системе, доходчиво пишут только о FAT16, как с этой системой работать я понял, а в чем отличие FAT32. Для работы с картой мне нужно знать, по какому адресу находятся таблицы FAT и корневой каталог, чтоб читать имя текстового документа и адрес его первого кластера. Может кто помочь с информацией по fat32 ???
Re: Подключение SD карты к микроконтроллеру
Можно взглянуть на ключи запросов в поиске?mark3101 писал(а):Искал информацию по этой файловой системе,
А то у меня всё нашлось...
- Для указания номера кластера в FAT-таблице используется не 16 бит (2 байта), а 32 бита (4 байта).mark3101 писал(а):а в чем отличие FAT32.
- Корневой каталог размещается не по фиксированному номеру сектора и не имеет ограничения для длину. Т.е. в FAT-16 в корне может быть всего... ммм... сколько-то файлов/каталогов, а в FAT-32 - нет ограничения.
- у FAT-32 есть структура FSInfo, где можно хранить свободный размер диска... ну и параметры для поиска следующего свободного кластера.
В главной записи диска, тоже самое, как в FAT-16.mark3101 писал(а):по какому адресу находятся таблицы FAT и корневой каталог
Разве что, вначале нужно прочитать "Boot Sector", и уже через него "найти" сектор с BPB.
http://pogugli.com/?122425
https://google.gik-team.com/?q=fat32+source
- Реклама
Re: Подключение SD карты к микроконтроллеру
Самый качественный (и наверно единственный) почти официальный документ по FAT32 называется: fatgen103.doc, лежит в недрах сайта мелкомягких. У мню он есть на англицком. Бонусом там же описана vFAT.
Немного изменена структура BOOT сектора, точнее таблицы BPB, и так по мелочам, типа дублирования и сдвигов.
Корневой каталог теперь обычный файл, адрес которого лежит по смещению 44 в BPB.
Ну и главное отличие, теперь для номера кластера используется не 16, а 28бит.
mas123 Разве что, вначале нужно прочитать "Boot Sector", и уже через него "найти" сектор с BPB. Бред. "Boot Sector" всегда содержит в себе и загрузочный код и BPB, и всегда(!) находится в первом секторе тома (раздела). Может ты с MBR перепутал?
Тогда действительно нужно считывать 1й сектор диска(!) анализировать его структуру.
Немного изменена структура BOOT сектора, точнее таблицы BPB, и так по мелочам, типа дублирования и сдвигов.
Корневой каталог теперь обычный файл, адрес которого лежит по смещению 44 в BPB.
Ну и главное отличие, теперь для номера кластера используется не 16, а 28бит.
mas123 Разве что, вначале нужно прочитать "Boot Sector", и уже через него "найти" сектор с BPB. Бред. "Boot Sector" всегда содержит в себе и загрузочный код и BPB, и всегда(!) находится в первом секторе тома (раздела). Может ты с MBR перепутал?
Тогда действительно нужно считывать 1й сектор диска(!) анализировать его структуру.
Re: Подключение SD карты к микроконтроллеру
Да, наверное перепутал, не спорю.MisHel64 писал(а):Может ты с MBR перепутал?
Тогда действительно нужно считывать 1й сектор диска(!) анализировать его структуру.
Анализировать 0-й сектор нужно обязательно - либо там будет boot-сектор, либо MBR. 50/50.
Какой либо логики "почему на этой SD так, а на этих - вот так" я не нашел.
А на современных SDHC (точнее, которые в продаже с прошлой осени) ещё необходимо тщательно выдерживать передачу dummy-байт.
Впрочем, только на высоких скоростях можно "залипнуть" с сектором кратным 0x1F.
Re: Подключение SD карты к микроконтроллеру
Здравствуйте.mark3101 писал(а):Здравствуйте, суть темы такова. Решил я подключить к PIC контроллеру СД карту, пишу код сам на ассемблере. Проблема заключается в том, что не удается инициализировать карточку. Вот порядок моих действий:
1) Посылаю 80 тактов СД карте
2) Посылаю команду сброса CMD0, ответ приходит правильный 0х01
3) Затем CMD8, первый байт ответа 0х01, стало быть карта версии 2
4) Отправляем CMD55, ответ 0х01
5) Затем CMD41, и с этого момента начинается фигня, а именно после команды я опрашиваю карту до тех пор пока не придет ответ отличный от FF, приходит FE.
В общем чего только не перепробовал, от CMD1 ответа 0х00 нет, пробую карты на 2ГБ и 8 ГБ. И если команду инициализации отправлять после каждого ответа, тоже приходит ерунда.
Надеюсь на любую помощь, исчерпал все идеи по этой проблеме.
У меня аналогичная проблема. Пытаюсь подключить SDC-карту к микроконтроллеру ATiny2313, программу пишу на ассемблере. На команду CMD0 приходит ответ 0x01, далее тупик - в ответ на CMD1 приходит 0xFF. Буду благодарен за помощь или подсказку.
maks50.
Re: Подключение SD карты к микроконтроллеру
Документация на SD изучалась?maks50 писал(а):далее тупик - в ответ на CMD1 приходит 0xFF. Буду благодарен за помощь или подсказку.
Можно узнать, где написано о подаче CMD1 сразу после CMD0?
Да что там документация, эта тема изучалась?
См. моё сообщение от "Ср апр 20, 2016 18:43:02" - там приведена диаграмма "побудки" карточки!
Re: Подключение SD карты к микроконтроллеру
Добрый день.mas123 писал(а):Документация на SD изучалась?maks50 писал(а):далее тупик - в ответ на CMD1 приходит 0xFF. Буду благодарен за помощь или подсказку.
Можно узнать, где написано о подаче CMD1 сразу после CMD0?
Да что там документация, эта тема изучалась?![]()
См. моё сообщение от "Ср апр 20, 2016 18:43:02" - там приведена диаграмма "побудки" карточки!
Применяю карту типа SDHC (San Disk), документацию на нее не изучал.
Последовательность команд CMD0 - CMD1 взята из статьи Chan, "How to Use MMC/SDC". Такая же последовательность
приведена в программе автора "vakula" (в статье "SD/MMC карта памятии микроконтроллер AVR (часть 1). Базовые операции).
Ваше сообщение прочитал, попробую в ней разобраться (я не специалист в программировании).
Кстати, как в переводе статьи Chen`а, выполненной PIClist_RUS, так и программе "vakula" команда CMD1 подается непрерывно,
до тех пор пока не получим ответ R1 = 0x00. Казалось бы, логичнее, послать CMD1 один раз, а потом посылать 0xFF и ожидать
ответ R1 = ox00. Почему надо посылать CMD1 много раз - не понимаю.
Re: Подключение SD карты к микроконтроллеру
Потому что в спящем режиме или в режиме "пробуждения" карточка не отвечает на команду или "не видит" команду.maks50 писал(а):Казалось бы, логичнее, послать CMD1 один раз, а потом посылать 0xFF и ожидать
ответ R1 = ox00. Почему надо посылать CMD1 много раз - не понимаю.
Гм-гм-гм.maks50 писал(а):Последовательность команд CMD0 - CMD1 взята из статьи Chan, "How to Use MMC/SDC".
Это оно? --- http://elm-chan.org/docs/mmc/mmc_e.html
Раздел "SPI Command Set" - приведен СПИСОК применяемых команд.
Раздел "Initialization Procedure for SPI Mode" - там есть ссылка на алгоритм пробуждения, поразительно знакомая картинка...
Re: Подключение SD карты к микроконтроллеру
Вы правы, я ссылался именно на эту статью. Попробую внести в программу изменение в соответствии с указанной в статье картинкой.mas123 писал(а):Потому что в спящем режиме или в режиме "пробуждения" карточка не отвечает на команду или "не видит" команду.maks50 писал(а):Казалось бы, логичнее, послать CMD1 один раз, а потом посылать 0xFF и ожидать
ответ R1 = ox00. Почему надо посылать CMD1 много раз - не понимаю.
Разве ответ R1=0x01 не свидетельствует о том, что карта готова принять следующую команду?! Если нет, то должен быть какой-то признак, свидетельствующий о неготовности карты - например ноль на линии Out. Если это не предусмотрено протоколом, то логично было бы подождать, например, 1.0 сек и только потом посылать команду CMD1.
Гм-гм-гм.maks50 писал(а):Последовательность команд CMD0 - CMD1 взята из статьи Chan, "How to Use MMC/SDC".
Это оно? --- http://elm-chan.org/docs/mmc/mmc_e.html
Раздел "SPI Command Set" - приведен СПИСОК применяемых команд.
Раздел "Initialization Procedure for SPI Mode" - там есть ссылка на алгоритм пробуждения, поразительно знакомая картинка...
Спасибо за обсуждение.
Re: Подключение SD карты к микроконтроллеру
Здравствуйте, товарищи. А у меня следующий вопрос. Пишу код в cvavr, везде пишут, что для работы с картой памяти необходимо каждые 10мс вызывать некую функцию disk_timerproc(). Не могли бы вы объяснить суть этого явления? То есть что вообще выполняет функция и зачем нужна. Постоянно ли должна вызываться или в целях энергосбережения можно прекратить этот ddos, пока не пишу ничего. И если у меня запись в карту идёт в прерывании таймера, то данная функция на момент записи вызываться не будет. Это плохо?
Re: Подключение SD карты к микроконтроллеру
"Везде" - это где?SpaceStar писал(а):везде пишут,
Про такую функцию ничего не написано ни в так мною любимой документации на SD, ни в упомянутых тут статьях по работе с SD.
Почитать документацию на используемую библиотеку?SpaceStar писал(а):То есть что вообще выполняет функция и зачем нужна.
Как говорят интернеты при поиске: Disk_Timerproc() просто отвечает за таймауты, т.е. в нём реализованы обычные программные таймеры.
Изучи код используемой библиотеки, лучше тебя никто не разберется в твоих вопросах.
В противном случае, строго выполняй требование библиотеки, в том числе и с плане периодического вызова нужных функций.
Это как?SpaceStar писал(а):И если у меня запись в карту идёт в прерывании таймера
Процедура общения с SD довольно долгая по времени. Работать с SD в прерывании - несколько опрометчиво.
Re: Подключение SD карты к микроконтроллеру
Гм-гм-гм.maks50 писал(а):Последовательность команд CMD0 - CMD1 взята из статьи Chan, "How to Use MMC/SDC".
Это оно? --- http://elm-chan.org/docs/mmc/mmc_e.html
Раздел "SPI Command Set" - приведен СПИСОК применяемых команд.
Раздел "Initialization Procedure for SPI Mode" - там есть ссылка на алгоритм пробуждения, поразительно знакомая картинка...
Здравствуйте. Прочитал вашу статью и алгоритм, описанный в ней. В соответствии с этим алгоритмом после команды CMD0 необходимо подать команду CMD8. Каково значение CRC для CMD8?
Re: Подключение SD карты к микроконтроллеру
if (cmd == GO_IDLE_STATE) crc = 0x95; // correct crc for CMD0 with arg 0maks50 писал(а):значение CRC для CMD8?
if (cmd == SEND_IF_COND) crc = 0x87; // correct crc for CMD8 with arg 0X1AA
Re: Подключение SD карты к микроконтроллеру
Спасибо.mas123 писал(а):if (cmd == GO_IDLE_STATE) crc = 0x95; // correct crc for CMD0 with arg 0maks50 писал(а):значение CRC для CMD8?
if (cmd == SEND_IF_COND) crc = 0x87; // correct crc for CMD8 with arg 0X1AA
Re: Подключение SD карты к микроконтроллеру
Просто оставлю это здесь...
Мало ли кому пригодится...
Мало ли кому пригодится...
- Вложения
-
- sdinit.png
- (20.43 КБ) 779 скачиваний
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Подключение SD карты к микроконтроллеру
В блок схеме есть небольшие ошибки.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Подключение SD карты к микроконтроллеру
Где именно ошибки?
Схема не моя, но я ей пользовался и все получалось.
Схема не моя, но я ей пользовался и все получалось.


