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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
mark3101
Родился
Сообщения: 2
Зарегистрирован: Ср апр 20, 2016 16:06:33

Подключение 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 ГБ. И если команду инициализации отправлять после каждого ответа, тоже приходит ерунда.
Надеюсь на любую помощь, исчерпал все идеи по этой проблеме.
Реклама
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

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

Сообщение mas123 »

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

В инете гуглится диаграмма "побудки", вроде похожая на правду - точнее не скажу, т.к. дома мне дока по SD не нужна...
СпойлерИзображение
Кстати, на форуме уже неоднократно SD-карточка обсуждалась...
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

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

Сообщение YS »

Я когда-то писал статью про подключение SD-карточки, там есть ссылки, которые могут быть полезны.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
mark3101
Родился
Сообщения: 2
Зарегистрирован: Ср апр 20, 2016 16:06:33

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

Сообщение mark3101 »

Удалось прочитать блок информации с сд карты на 8 Гб. Теперь вопрос в следующем. Я задумал устройство считывания текстовой информации с сд карты. Файловая система на карте FAT32. Искал информацию по этой файловой системе, доходчиво пишут только о FAT16, как с этой системой работать я понял, а в чем отличие FAT32. Для работы с картой мне нужно знать, по какому адресу находятся таблицы FAT и корневой каталог, чтоб читать имя текстового документа и адрес его первого кластера. Может кто помочь с информацией по fat32 ???
Реклама
Эиком - электронные компоненты и радиодетали
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

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

Сообщение 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
Реклама
MisHel64
Опытный кот
Сообщения: 773
Зарегистрирован: Пн сен 01, 2014 20:38:54

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

Сообщение MisHel64 »

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

mas123 Разве что, вначале нужно прочитать "Boot Sector", и уже через него "найти" сектор с BPB. Бред. "Boot Sector" всегда содержит в себе и загрузочный код и BPB, и всегда(!) находится в первом секторе тома (раздела). Может ты с MBR перепутал?
Тогда действительно нужно считывать 1й сектор диска(!) анализировать его структуру.
Реклама
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

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

Сообщение mas123 »

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

А на современных SDHC (точнее, которые в продаже с прошлой осени) ещё необходимо тщательно выдерживать передачу dummy-байт.
Впрочем, только на высоких скоростях можно "залипнуть" с сектором кратным 0x1F.
maks50
Родился
Сообщения: 5
Зарегистрирован: Ср июл 13, 2016 11:59:54

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

Сообщение 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.
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

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

Сообщение mas123 »

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

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

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

Сообщение 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 много раз - не понимаю.
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

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

Сообщение 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:
maks50
Родился
Сообщения: 5
Зарегистрирован: Ср июл 13, 2016 11:59:54

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

Сообщение 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:
Вы правы, я ссылался именно на эту статью. Попробую внести в программу изменение в соответствии с указанной в статье картинкой.
Спасибо за обсуждение.
Аватара пользователя
SpaceStar
Родился
Сообщения: 10
Зарегистрирован: Чт июл 21, 2016 16:42:31

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

Сообщение SpaceStar »

Здравствуйте, товарищи. А у меня следующий вопрос. Пишу код в cvavr, везде пишут, что для работы с картой памяти необходимо каждые 10мс вызывать некую функцию disk_timerproc(). Не могли бы вы объяснить суть этого явления? То есть что вообще выполняет функция и зачем нужна. Постоянно ли должна вызываться или в целях энергосбережения можно прекратить этот ddos, пока не пишу ничего. И если у меня запись в карту идёт в прерывании таймера, то данная функция на момент записи вызываться не будет. Это плохо?
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

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

Сообщение mas123 »

SpaceStar писал(а):везде пишут,
"Везде" - это где?
Про такую функцию ничего не написано ни в так мною любимой документации на SD, ни в упомянутых тут статьях по работе с SD.
SpaceStar писал(а):То есть что вообще выполняет функция и зачем нужна.
Почитать документацию на используемую библиотеку?
Как говорят интернеты при поиске: Disk_Timerproc() просто отвечает за таймауты, т.е. в нём реализованы обычные программные таймеры.
Изучи код используемой библиотеки, лучше тебя никто не разберется в твоих вопросах.
В противном случае, строго выполняй требование библиотеки, в том числе и с плане периодического вызова нужных функций.
SpaceStar писал(а):И если у меня запись в карту идёт в прерывании таймера
Это как? :shock:
Процедура общения с SD довольно долгая по времени. Работать с SD в прерывании - несколько опрометчиво.
maks50
Родился
Сообщения: 5
Зарегистрирован: Ср июл 13, 2016 11:59:54

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

Сообщение 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?
mas123
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

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

Сообщение 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
maks50
Родился
Сообщения: 5
Зарегистрирован: Ср июл 13, 2016 11:59:54

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

Сообщение 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
Спасибо.
sbhidden
Родился
Сообщения: 9
Зарегистрирован: Сб сен 01, 2012 19:00:10
Откуда: Иваново

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

Сообщение sbhidden »

Просто оставлю это здесь...
Мало ли кому пригодится...
Вложения
sdinit.png
(20.43 КБ) 779 скачиваний
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

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

Сообщение Oxford »

В блок схеме есть небольшие ошибки.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
sbhidden
Родился
Сообщения: 9
Зарегистрирован: Сб сен 01, 2012 19:00:10
Откуда: Иваново

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

Сообщение sbhidden »

Где именно ошибки?
Схема не моя, но я ей пользовался и все получалось.
Ответить

Вернуться в «Периферия»