Страница 1 из 2

Подключение SD карты к микроконтроллеру

Добавлено: Ср апр 20, 2016 16:25:08
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 ГБ. И если команду инициализации отправлять после каждого ответа, тоже приходит ерунда.
Надеюсь на любую помощь, исчерпал все идеи по этой проблеме.

Re: Подключение SD карты к микроконтроллеру

Добавлено: Ср апр 20, 2016 18:43:02
mas123
mark3101 писал(а):СД карту
MMC, SD ver1, SD ver2, SDHC - какую именно карту?
У них у всех отличается алгоритм "побудки". И как раз в районе команды CMD41 / ACMD41.
Даташит на протокол SD изучался? Там есть истинная диаграма инициализации.

В инете гуглится диаграмма "побудки", вроде похожая на правду - точнее не скажу, т.к. дома мне дока по SD не нужна...
СпойлерИзображение
Кстати, на форуме уже неоднократно SD-карточка обсуждалась...

Re: Подключение SD карты к микроконтроллеру

Добавлено: Пт апр 22, 2016 21:10:21
YS
Я когда-то писал статью про подключение SD-карточки, там есть ссылки, которые могут быть полезны.

Re: Подключение SD карты к микроконтроллеру

Добавлено: Вс апр 24, 2016 14:10:40
mark3101
Удалось прочитать блок информации с сд карты на 8 Гб. Теперь вопрос в следующем. Я задумал устройство считывания текстовой информации с сд карты. Файловая система на карте FAT32. Искал информацию по этой файловой системе, доходчиво пишут только о FAT16, как с этой системой работать я понял, а в чем отличие FAT32. Для работы с картой мне нужно знать, по какому адресу находятся таблицы FAT и корневой каталог, чтоб читать имя текстового документа и адрес его первого кластера. Может кто помочь с информацией по fat32 ???

Re: Подключение SD карты к микроконтроллеру

Добавлено: Вс апр 24, 2016 14:32:35
mas123
mark3101 писал(а):Искал информацию по этой файловой системе,
Можно взглянуть на ключи запросов в поиске?
А то у меня всё нашлось...
mark3101 писал(а):а в чем отличие FAT32.
- Для указания номера кластера в FAT-таблице используется не 16 бит (2 байта), а 32 бита (4 байта).
- Корневой каталог размещается не по фиксированному номеру сектора и не имеет ограничения для длину. Т.е. в FAT-16 в корне может быть всего... ммм... сколько-то файлов/каталогов, а в FAT-32 - нет ограничения.
- у FAT-32 есть структура FSInfo, где можно хранить свободный размер диска... ну и параметры для поиска следующего свободного кластера. :)
mark3101 писал(а):по какому адресу находятся таблицы FAT и корневой каталог
В главной записи диска, тоже самое, как в FAT-16.
Разве что, вначале нужно прочитать "Boot Sector", и уже через него "найти" сектор с BPB.

http://pogugli.com/?122425
https://google.gik-team.com/?q=fat32+source

Re: Подключение SD карты к микроконтроллеру

Добавлено: Пн апр 25, 2016 18:32:59
MisHel64
Самый качественный (и наверно единственный) почти официальный документ по FAT32 называется: fatgen103.doc, лежит в недрах сайта мелкомягких. У мню он есть на англицком. Бонусом там же описана vFAT.
Немного изменена структура BOOT сектора, точнее таблицы BPB, и так по мелочам, типа дублирования и сдвигов.
Корневой каталог теперь обычный файл, адрес которого лежит по смещению 44 в BPB.
Ну и главное отличие, теперь для номера кластера используется не 16, а 28бит.

mas123 Разве что, вначале нужно прочитать "Boot Sector", и уже через него "найти" сектор с BPB. Бред. "Boot Sector" всегда содержит в себе и загрузочный код и BPB, и всегда(!) находится в первом секторе тома (раздела). Может ты с MBR перепутал?
Тогда действительно нужно считывать 1й сектор диска(!) анализировать его структуру.

Re: Подключение SD карты к микроконтроллеру

Добавлено: Пн апр 25, 2016 19:18:06
mas123
MisHel64 писал(а):Может ты с MBR перепутал?
Тогда действительно нужно считывать 1й сектор диска(!) анализировать его структуру.
Да, наверное перепутал, не спорю.
Анализировать 0-й сектор нужно обязательно - либо там будет boot-сектор, либо MBR. 50/50.
Какой либо логики "почему на этой SD так, а на этих - вот так" я не нашел. :)

А на современных SDHC (точнее, которые в продаже с прошлой осени) ещё необходимо тщательно выдерживать передачу dummy-байт.
Впрочем, только на высоких скоростях можно "залипнуть" с сектором кратным 0x1F.

Re: Подключение SD карты к микроконтроллеру

Добавлено: Ср июл 13, 2016 21:05:42
maks50
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 карты к микроконтроллеру

Добавлено: Пт июл 15, 2016 12:59:13
mas123
maks50 писал(а):далее тупик - в ответ на CMD1 приходит 0xFF. Буду благодарен за помощь или подсказку.
Документация на SD изучалась?
Можно узнать, где написано о подаче CMD1 сразу после CMD0?

Да что там документация, эта тема изучалась? :facepalm:
См. моё сообщение от "Ср апр 20, 2016 18:43:02" - там приведена диаграмма "побудки" карточки!

Re: Подключение SD карты к микроконтроллеру

Добавлено: Пн июл 18, 2016 10:08:27
maks50
mas123 писал(а):
maks50 писал(а):далее тупик - в ответ на CMD1 приходит 0xFF. Буду благодарен за помощь или подсказку.
Документация на SD изучалась?
Можно узнать, где написано о подаче CMD1 сразу после CMD0?

Да что там документация, эта тема изучалась? :facepalm:
См. моё сообщение от "Ср апр 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 карты к микроконтроллеру

Добавлено: Пн авг 01, 2016 08:10:57
mas123
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" - там есть ссылка на алгоритм пробуждения, поразительно знакомая картинка... :facepalm:

Re: Подключение SD карты к микроконтроллеру

Добавлено: Пт авг 12, 2016 14:56:30
maks50
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" - там есть ссылка на алгоритм пробуждения, поразительно знакомая картинка... :facepalm:
Вы правы, я ссылался именно на эту статью. Попробую внести в программу изменение в соответствии с указанной в статье картинкой.
Спасибо за обсуждение.

Re: Подключение SD карты к микроконтроллеру

Добавлено: Вс авг 14, 2016 20:19:33
SpaceStar
Здравствуйте, товарищи. А у меня следующий вопрос. Пишу код в cvavr, везде пишут, что для работы с картой памяти необходимо каждые 10мс вызывать некую функцию disk_timerproc(). Не могли бы вы объяснить суть этого явления? То есть что вообще выполняет функция и зачем нужна. Постоянно ли должна вызываться или в целях энергосбережения можно прекратить этот ddos, пока не пишу ничего. И если у меня запись в карту идёт в прерывании таймера, то данная функция на момент записи вызываться не будет. Это плохо?

Re: Подключение SD карты к микроконтроллеру

Добавлено: Вт авг 16, 2016 18:58:24
mas123
SpaceStar писал(а):везде пишут,
"Везде" - это где?
Про такую функцию ничего не написано ни в так мною любимой документации на SD, ни в упомянутых тут статьях по работе с SD.
SpaceStar писал(а):То есть что вообще выполняет функция и зачем нужна.
Почитать документацию на используемую библиотеку?
Как говорят интернеты при поиске: Disk_Timerproc() просто отвечает за таймауты, т.е. в нём реализованы обычные программные таймеры.
Изучи код используемой библиотеки, лучше тебя никто не разберется в твоих вопросах.
В противном случае, строго выполняй требование библиотеки, в том числе и с плане периодического вызова нужных функций.
SpaceStar писал(а):И если у меня запись в карту идёт в прерывании таймера
Это как? :shock:
Процедура общения с SD довольно долгая по времени. Работать с SD в прерывании - несколько опрометчиво.

Re: Подключение SD карты к микроконтроллеру

Добавлено: Пн сен 19, 2016 20:44:19
maks50
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" - там есть ссылка на алгоритм пробуждения, поразительно знакомая картинка... :facepalm:[/quote]

Здравствуйте. Прочитал вашу статью и алгоритм, описанный в ней. В соответствии с этим алгоритмом после команды CMD0 необходимо подать команду CMD8. Каково значение CRC для CMD8?

Re: Подключение SD карты к микроконтроллеру

Добавлено: Вт сен 20, 2016 13:44:04
mas123
maks50 писал(а):значение CRC для CMD8?
if (cmd == GO_IDLE_STATE) crc = 0x95; // correct crc for CMD0 with arg 0
if (cmd == SEND_IF_COND) crc = 0x87; // correct crc for CMD8 with arg 0X1AA

Re: Подключение SD карты к микроконтроллеру

Добавлено: Вт сен 20, 2016 18:50:46
maks50
mas123 писал(а):
maks50 писал(а):значение CRC для CMD8?
if (cmd == GO_IDLE_STATE) crc = 0x95; // correct crc for CMD0 with arg 0
if (cmd == SEND_IF_COND) crc = 0x87; // correct crc for CMD8 with arg 0X1AA
Спасибо.

Re: Подключение SD карты к микроконтроллеру

Добавлено: Вс дек 11, 2016 19:37:53
sbhidden
Просто оставлю это здесь...
Мало ли кому пригодится...

Re: Подключение SD карты к микроконтроллеру

Добавлено: Вс дек 11, 2016 20:06:14
Oxford
В блок схеме есть небольшие ошибки.

Re: Подключение SD карты к микроконтроллеру

Добавлено: Вт дек 13, 2016 16:34:27
sbhidden
Где именно ошибки?
Схема не моя, но я ей пользовался и все получалось.