Контроллер карты памяти: Чинить нельзя выбросить, или Кое-что о ремонте флешек. Часть 2: Программные проблемы / Мастерская

Восстанавливаем карты памяти и флешки SanDisk — EasyRecover.ru

Работа с ПК предполагает обмен данными, который не всегда можно реализовать посредством интернет. Поэтому большинство пользователей используют флешки для резервного копирования или переноса файлов. Высокая скорость записи и доступная цена только добавляют им популярности. Другая разновидность флеш-накопителей – карты памяти – широко используется в смартфонах, цифровых камерах и других гаджетах. Но флешки, как любые сложные устройства, могут поломаться. Чаще поломка носит программный, а не аппаратный характер, что обеспечивает достаточно простое восстановление работоспособность карты или флешки.

Содержание:

  • Причины выхода флешки из строя
  • Восстановление флешек и SD-карт путем форматирования
  • org/ListItem»> Восстановление путем прошивки контроллера
  • Восстановление карт памяти

Читать основной способ о том как восстановить флеш карту

Причины выхода флешки из строя

Самой распространенной причиной, по которой выходит из строя накопитель, является его небезопасное извлечение из порта USB. Если вытащить накопитель во время процесс чтения или записи, возможен сбой файловой системы. Считают: если файлы на флешке закрыты и не запущено процессов копирования с (или на) флешку, то ее можно смело доставать из порта. Однако работать с файловой системой накопителя могут фоновые программы, антивирусы или, наоборот, зловредное ПО. Поэтому полностью безопасно извлечь флешку SanDisk можно лишь после нажатия пиктограммы «Безопасное извлечение устройства» на панели задач и выбора карты памяти в списке USB устройств, подключенных к компьютеру. Чтобы предотвратить проблемы работы SD и флеш-карт, следует аналогично поступать и с подключенным к ПК гаджетами (смартфонами, фотоаппаратами).

Восстановление флешек и SD-карт путем форматирования

Это самый простой и быстрый способ, применимый когда ОС распознает вставленное устройство и позволяет запустить форматирование. Это действие вполне осуществимо без сторонних утилит. Отформатировать можно как флешку, так и карту памяти SanDisk, вставленную в картридер. Запускается процедура просто: щелчок правой кнопкой на флеш-устройстве и выбор пункта меню «Форматирование».

После этого остается выбрать тип файловой системы, способ форматирования и нажать кнопку «Начать».

Если стандартный способ не помогает, можно использовать утилиту HDD Low Level Format Tool. Она выполняет низкоуровневое форматирование любых дисковых накопителей, поэтому пользоваться ею надо осторожно: при неверном выборе диска можно отформатировать HDD вместо флешки.

Еще один вариант – восстановление программой HDD Regenerator. Утилита может восстановить поврежденные сектора на флеш-накопителе и HDD и поддерживает низкоуровневый формат файловой системы SD карты. Также с ее помощью возможно «спасение» данных, потерянных в результате ошибочного форматирования диска.

Восстановление путем прошивки контроллера

Чтобы прошить контроллер, необходимо установить его точную модель флешки SanDisk и скачать ПО для прошивки. Это можно сделать по VID и PID носителя. Определить их легко. Единственное условие – компьютер должен распознать вставленное оборудование. Не обязательно как накопитель, достаточно определения в качестве USB-устройства.

Для определения кодов устройства этого заходим в «Диспетчер устройств», выбираем «запоминающее устройство для USB» и открываем его свойства. Коды VID и PID видны в разделе «Сведения» после выбора в выпадающем меню пункта «Коды (ID) оборудования».

Двух полученных кодов достаточно, чтобы на сайте FlashBoot.ru найти необходимые утилиты для прошивки контроллера. Зная название программы, нетрудно найти ее через поисковик и скачать. Утилит для прошивки существует много, даже для флешек одного производителя (SanDisk) существует несколько программ прошивки. Использовать данные приложения легко, все управление осуществляется одной-двумя кнопками, поэтому запутаться в них сложно. Если причина поломки была в прошивке, вы получите рабочую флешку. Некоторые утилиты обеспечивают восстановление прошивки контроллера без удаления данных и форматирования SD карты. В этом случае следует сохранить данные, а сам флеш-диск отформатировать перед дальнейшим использованием.

Если утилита не сработала, можно найти другую более соответствующую вашей модели накопителя. Иногда приходится перебрать 2-3 утилиты, прежде чем флешка заработает.

Восстановление карт памяти

При неисправности карт памяти (SD, микро-SD), можно попробовать отформатировать их в другом гаджете. Если формат не дал результата – не отчаивайтесь. Стоит попробовать несколько устройств, так как все они отличаются параметрами работы с картой памяти. По моему опыту, с проблемами карт памяти отлично справляются именно топовые модели разных брендов.

Карты памяти, в отличии от флешек, не имеют VID и PID. Восстановление путем подбора на основе этих данных «персональной» программы нереализуемо. Для низкоуровневого форматирования карт SanDisk можно использовать универсальные программы – SD Formatter, HDD Low Level Format Tool.

Важно: восстановление карт памяти не следует проводить, используя встроенный картриадер. Он не предназначен для работы с неисправными micro-SD и их форматирования. Лучше использовать продвинутую USB-модель картриадера.

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

И помните, что никакой флеш-накопитель, независимо от цены, не дает гарантии сохранения ваших файлов. Любое устройство может поломаться в самый неподходящий момент, навсегда уничтожив содержимое. Поэтому не надо «класть яйца в одну корзину». Обязательно делайте резервные копии карт памяти и важных данных флешек в облачном сервисе, на жестком диске или DVD. Только так можно обезопасить важную информацию. Чем больше резервных копий – тем меньше вероятность необратимой утраты файлов.

Помогла статья? Оцените её

Загрузка…

Комментировать

Микроша. Глава первая. Контроллер SD карты / Хабр

Многие помнят эту замечательную ПЭВМ. У меня такая появилась, когда мне было 11. Прошло 28 лет и сейчас я решил в порядке хобби сделать устройства расширения, которых мне так не хватало тогда.

В сети я видел несколько вариантов SD загрузчиков для подобных ПЭВМок, мне не нравилось наличие в них микроконтроллеров, хотелось сделать по «винтажной, теплой DIPовой» схемотехнике, именно поэтому я решил делать на отечественной логике «КР1533».

В качестве доп. ОЗУ я применил UT62256. Это единственная импортная микросхема в проекте. Конечно, можно было поставить КР537РУ10 или КР537РУ25А, но во-первых, их бы пришлось ставить не одну, а две (я планировал 4 кБ доп. ОЗУ), а во-вторых UT62256 у меня была, а КР537 не было, и заказывать не хотелось. Поэтому я позволил себе вольность поставить импорт, и тогда пришла идея использовать все 32кБ доп.ОЗУ, со страничным переключением.


Для ПЗУ выбрал КР573РФ5, как раз было две чистых.

Посидев за чашкой чая, я нарисовал вот такую блок-схему.

Здесь микросхема ОЗУ, микросхема ПЗУ, и блок «ПОРТ». Блок «ПОРТ» есть параллельный интерфейс, имеющий 8 входов и 8 выходов. При записи по адресу EFFF, записываемый код выставляется на выходах, а при чтении из этого же адреса, прочитанное значение соответствует состоянию входов. Три из выходов и один из входов подключены к SD карте через преобразователь уровней.

ОЗУ представлено микросхемой UT62256 и имеет 32кБ памяти. Поскольку диапазон адресов E000-EFFE есть почти 4кБ (4095 байт), то получается 8 страниц, которые выбираются блоком «ПОРТ», битами 1,2 и 3. То есть запись по адресу EFFF приводит к установке страницы в соответствии с этими тремя битами. Также чтение из этого порта показывает какая страница сейчас выбрана (в этих же битах). Итого, мы имеем 32760 байт дополнительного ОЗУ (4095×8стр).

Микросхема ПЗУ есть КР573РФ5. Она подключена в адресное пространство F000-F7FF, и содержит код БСВВ (BIOS), задача этого кода инициализировать SD карту, загрузить с нее OS и передать ей управление.

Соответственно после включения ПЭВМ, набираем в Системном Мониторе GF000 и нажимаем ВК.

В дальнейшем есть идея доработать родное ПЗУ Системного Монитора, для автоматической загрузки OS с SD карты, и ПЭВМ выходит в стандартное приглашение Монитора если загрузка не удалась или была прервана, например, нажатием какой-то клавиши.

Об этом еще подумаю.

Примерно 2-3 часа за компьютером, и я нарисовал в EAGLE следующую схему.


Увеличить

Рисовал опираясь на те микросхемы, которые у меня были. Возможно, что число микросхем логики можно сократить, если использовать другие вентили, но у меня были только такие. И в дальнейшем, я скорее всего оптимизирую схему.

Низкоуровневый разбор схемы…

…убрал под спойлер, думаю мало кому интересны эти дебри.

Посмотрим на ячейку И V3/1, к ней подключены линии A14 и A15 шины адреса, значит на выводе N3 появится логическая единица, когда эти оба сигнала адреса находятся в лог.1. Через инвертор V1/2 формируется сигнал с условным названием G, который приходит на дешифратор IC2. Входы этого дешифратора A и B, подключены к линиям A12 и A13 соответственно. Значит, получается, что дешифратор активируется от наличия единиц на A14 и A15, а его выходы показывают код на линиях A12 и A13. Нас интересует только один вариант — 1110,

то есть A15-1; A14-1; A13-1; A12-0. Такой сигнал получается на выходе дешифратора N2. Поскольку ячеек дешифратора две, то этот сигнал должен появляться на выводах 5 и 11, но из-за того, что каждая из ячеек имеет еще один вход С, то от состояния этого входа будет зависеть какая из ячеек будет активна. Вход 1С активирует выход 5, а вход 2С активирует выход 11. Эти входы спаралелены, но вход 1C прямой, а вход 2C инверсный, значит при наличии лог.1 на них активируется вывод 5, а при лог.0 — вывод 11.

Подытожим: При наличии на шине адреса кода Exxx и С=1, формируется сигнал «PORT», а при наличии на шине адреса кода Exxx и C=0, формируется сигнал «RAM».

Сигнал «C» образуется за счет функции логического И, из всех младших адресов (A0-A11). Когда на шине выставлен код xFFF, то С=1, а иначе С=0. Итого: сигнал «PORT» вызывается адресом EFFF, а сигнал «RAM» адресами E000-EFFE.

Сигнал «RAM» приходит на вход CS микросхемы IC3, это микросхема ОЗУ, и значит, что запись по адресам E000-EFFE приведет к записи в эту микросхему. Также чтение по адресам E000-EFFE приведет к чтению из этой микросхемы. При записи по адресу EFFF код будет записан в регистр IC4, и защелкнется на его выходах. Сигнал записи формируется из сигналов «PORT» и «WR» c помощью элементов V1/5, V1/6 и V3/4.

Чтение по адресу EFFF приведет к считыванию данных из буфера IC5, и код будет зависеть
от состояния входов B0-B7.

Микросхема ПЗУ включена в адресное пространство ПЭВМ с помощью штатного адресного дешифратора. Для этого из порта «Внутренний Интерфейс» берется сигнал CS3 и он подключен к линии CS микросхемы ПЗУ.


Сейчас травить плату в домашних условиях у меня возможности нет, и я, взяв кусок фольгированного двухстороннего текстолита, выпилил из него необходимый прямоугольник.

Этот прямоугольник плотно вставлялся в слот «внутренний интерфейс» ПЭВМ, не болтался и не сдвигался. Далее я процарапал контактные площадки с задней и передней сторон. Получилось неплохо. Затем грубая расстановка микросхем и сверлежка отверстий. С лицевой стороны рассверлил крупным сверлом, чтобы выводы микросхем не контактировали с лицевой фольгой. С обратной стороны отцарапал периметр каждого контактного ряда и разделил на контактные площадки.

Следующим этапом поставил все микросхемы (и панельку) и пропаял с обратной стороны. Много времени отнял монтаж, который я вел тонким МГТФом.

Вел проводки с обоих сторон, с лицевой подпаивал прямо к ножкам микросхем, с обратной к площадкам.

Когда процесс пайки был окончен, я решил уделить внимание преобразователю уровней сигналов. Дело в том, что SD карта работает с напряжением 3,3в., а микросхемы КР1533АП6 и КР1533ИР22 ТТЛ 5в. Поэтому пришлось сделать небольшую платку переходника, на котором уровни ограничивались стабилитронами.

Сигнал идущий от SD карты к контроллеру я просто подтянул к источнику 3,3в. резистором 10к. Как показала практика, этот сигнал в преобразовании не нуждается.

Хотя в конечном варианте я, наверное, сделаю обратный преобразователь на основе компаратора.

В качестве держателя карты использовал переходник microSD в SD.

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

Первым делом я проверил работу ОЗУ, записал в область E000-EFFE с помощью директивы «F» Системного Монитора паттерны «AA», «55», «F0» и «0F» и проверил их с помощью директивы «D». Все оказалось в норме.

Далее директивой «M» начал записывать в адрес EFFF разные значения, и смотреть мультиметром изменения на ножках регистра КР1533ИР22, состояния соответствовали записаным кодам. Также при чтении из этого порта в коде содержалась выбранная страница, в соответствии с задуманным, и еще при замыкании MISO сигнала на землю в младшем бите оказывался 0, а при размыкании 1.

Даже было как-то подозрительно, что все микросхемы исправны и монтаж удался без ошибок.

Конечно никаких специальных инструментов для написания программ под КР580ВМ80А у меня не было. Пришлось писать программу в блокноте (notepad), затем переводить в коды вручную.
Создал файл в редакторе под DOS «HIEW» и начал заполнять кодами. Для основы взял свой проект под AVR, в котором имелась стандартная инициализация SD карты. Проект был старый, и в нем не использовалось никакой файловой системы, просто логгер.

Сначала написал низкоуровневую функцию программного интерфейса SPI, а потом высокоуровневую подпрограмму инициализации SD карты.

Получился примерно такой алгоритм…

…который убран под спойлер, думаю, он и так всем известен.

1. Взвести счетчик попыток (СП) на 90;
2. Выставить CS в лог.1 и отправить 10 раз FF;
3. Выставить CS в лог.0;

4. Отправить CMD0;
5. Если читается 01, тогда переход на 7;
6. Уменьшить СП. Если СП=0, то выход с ошибкой, иначе переход на 2;
7. Отправить CMD8;
8. Отправить ACMD41;
9. Если читается 00, тогда переход 11
10. Уменьшить СП. Если СП=0, то выход с ошибкой, иначе переход на 8;
11. Отправить CMD58.
12. Прочитать 2й байт ответа и записать по адресу EFFE.
13. Инициализация закончена.

В подпрограмме инициализации также читался регистр OCR карты, и 2й байт в нем записывался по адресу EFFE. Это было нужно для определения типа карты.

В случае SDSC — 80h, а в случае SDHC — C0h.

Если инициализация не проходила, то выводилось сообщение «ОШИБКА SD КАРТЫ» и затем происходил выход в Монитор без сброса.

Такую БСВВ я конвертировал в WAV и загружал в ПЭВМ через магнитофонный вход, затем отлаживал, правил исходник и снова загружал.

Теперь у меня есть дополнительное ОЗУ, размером 32760 байт, разделенное на 8 страниц. Но как осуществлять переход между страницами? Как программа, выполняющаяся в первой странице, может вызвать подпрограмму, находящуюся в четвертой?

Для решения этой задачи я предусмотрел программные мосты. Мост — это небольшая область в ПЗУ, которая является посредником при передаче управления.

Например, выполняющийся код должен передать управление на страницу номер 3, в адрес E4B5. Тогда, выполняющийся код помещает младшие 12 бит (4B5) в регистровую пару HL процессора, а в старшие четыре бита помещает значение 3 — номер страницы. Теперь в регистровой паре HL записано значение 34B5. И код делает прыжок (JMP) в область ПЗУ, которая называется JMP-Bridge, это просто переход по фиксированному адресу в ПЗУ. Код в этой области извлекает номер страницы из старших битов регистровой пары HL и записывает их в регистр блока «ПОРТ» по адресу EFFF. Теперь в область E000-EFFE отображается третья страница ОЗУ. Программа JMP-Bridge обнуляет четыре старших бита регистровой пары HL и записывает туда «E». Теперь в регистровой паре HL находится уже физический адрес E4B5, и вот на него программа JMP-Bridge передает управление.

Таким образом передается управление между страницами.

Есть мост CALL-Bridge, он нужен для вызова подпрограммы с возвратом, и отличается от JMP-Bridge сохранением текущей страницы в стеке, и обратной процедуры для возврата.

Следующие два моста STA-Bridge и LDA-Bridge. Как следует из названий, первый записывает регистр Аккумулятор по логическому адресу (в HL), а второй читает в этот регистр данные из логического адреса.

Благодаря этим двум мостам, программа исполняющаяся из какой-то страницы, может хранить данные в другой.

Если взглянуть на загрузочный сектор SD карты, то можно заметить, что по адресам 1AC-1D4 расположен текст «Disk error, press any key to restart».

Да, так странно как на фото он выглядит, потому-что кодировка символов Микроши не совпадает с ASCII.

Я решил использовать эту область, чтобы расположить там данные для загрузки ПЭВМ.

Первым делом я поставил код 00 в позицию 1BA, и тем самым урезал запись. Теперь, должно выводиться просто «Disk error» и все. Остальные байты мои. Принцип простой, 6 байт сигнатура «MicrOS», и 4 байта адрес на SD карте начала файла с OS. В БСВВ я записал, после получения загрузочного сектора с SD карты, проверяется сигнатура, и если она есть, то взять 4 следующих байта и использовать в качестве адреса сектора для загрузки OS.

Если сигнатура отсутствует, то выводится сообщение «ОШИБКА ЗАГРУЗКИ OS» и происходит выход в Системный Монитор без сброса.

И вот, наконец-то все, работает. БСВВ написана, но мне еще требуется записать ее в ПЗУ.

А для этого мне нужно отредактировать все адреса вызовов подпрограмм и переходов, так-как в этом процессоре абсолютная адресация. А я писал БСВВ для области 6000-67FF, чтобы грузить в ОЗУ. Но теперь надо поменять все 6xxx на Fxxx.

Кроме того, я в «попаданецких» условиях. Программатор ПЗУ у меня есть, но он старенький, под LPT порт. И нет ни одного компьютера с LPT. Но есть пара Atmega32A, в PDIP40 корпусе и макетная плата. Возможно придется эмулировать LPT с помощью AVR. Но может все обойдется…

На этом, пока, все. Спасибо за внимание! Продолжение следует…

Update: Продолжение

: контроллер SD -карты :: opencores

Содействия проектам

  • Edvardsson, ADAM

Подробная информация

Имя: SDCARD_MASS_STORAGER_CONTROLLER
Создано: 27 марта 2009 г.
Обновлен: FEB 11, 2017
SVN. SVN: Обзор
Последняя версия: загрузка (может занять некоторое время, чтобы начать…)
Статистика: Просмотр
Ошибки: 16 сообщений / 7 решенных

Star38вам нравится: пометьте!

Другое имущество проекта

Категория:Контроллер связи
Язык:Verilog
Статус разработки:Стабильный
Дополнительная информация:Дизайн выполнен, FPGA проверен, Спецификация выполнена
Совместимость с WishBone: Да
Версия WishBone: нет данных
Лицензия: LGPL

Card Controller» — это хост-контроллер Secure Digital Card, основной задачей которого является обеспечение быстрого и простого интерфейса для карт SD/SDHC. Одна из основных целей этого проекта заключается в том, чтобы контроллер можно было использовать в качестве системного диска, содержащего файловую систему. Поэтому ядро ​​было разработано с функциями, от которых выиграет система с операционной системой. Дизайн также включает упрощенную модель SD-карты для тестирования.
http://www.opencores.org/?do=project&who=sdcard_mass_storage_controller&page=overview 20 мая 2009 г.

Описание

Ядро представляет собой комбинированный контроллер SD/SDHC для карт Secure Digital. Доступны две конструкции: одно полнофункциональное ядро, использующее DMA, и одно меньшего размера для PIO.
Идея полнофункционального дизайна заключается в том, что он должен обеспечивать максимально возможную производительность. Поэтому он построен так, чтобы как можно меньше останавливать ЦП и разгружать его некоторые вычисления, это заархивировано:

  • Контроль ошибок и потока осуществляется в основном аппаратно, т. е. пользователь указывает при отправке команды, какую проверку ошибок он хочет выполнить. Затем результат устанавливается в регистрах ответа, также можно настроить генерацию прерывания.
  • Генерация команды на запись/чтение блока данных осуществляется аппаратно
  • Дескрипторы буфера используются для постановки в очередь передачи данных чтения/записи (меньше задержка между передачей данных)
  • DMA для минимального прерывания ЦП.

Небольшой дизайн использует универсальный FIFO вместе с 4 регистрами управления для работы.

Особенности

Полнофункциональное ядро ​​

  • 32-битный интерфейс Wishbone
  • Прямой доступ к памяти
  • Дескриптор буфера
  • Соответствует спецификации хост-контроллера SD версии 2.0
  • Поддержка 4-битного режима SD
  • Прерывание по завершению передачи данных и команд
  • Запись/чтение FIFO с переменным размером
  • Внутренняя реализация CRC16 для строк данных и CRC7 для командной строки

Ядро Small-FIFO

  • 8-битный интерфейс Wishbone
  • ПИО
  • Соответствует спецификации хост-контроллера SD версии 2. 0
  • Поддержка 4-битного режима SD
  • Простой программный интерфейс, 4 FIFO + 4 регистра

Ограничения

Длина блока данных фиксирована до 512 байт
Нет 1-битного режима SD
Нет режима SPI
Нет горячей вставки (т. е. вставки карты при работающей шине)
Нет операций с несколькими блоками/предварительного стирания

Взаимодействие микроконтроллеров с SD-картой

Перейти к содержимому

Защищенная цифровая карта (SD) — это недорогой формат энергонезависимой памяти, разработанный SD Card Association. С момента своего появления в начале века спрос на эти энергосберегающие и компактные запоминающие устройства среднего размера рос быстрыми темпами. Поэтому, чтобы соответствовать требованиям рынка, SDA была создана как некоммерческая организация для продвижения и создания стандартов SD-карт. Существуют различные темы, связанные с SD-картой, такие как различные семейства устройств, классы скорости, смарт-карты, безопасность карт и т. д., и они используются на различных рынках, таких как цифровые камеры, персональные компьютеры и встроенные системы. Некоторые из стандартных вариантов включают SD, SDHC, SDXC, SD-сверхвысокая скорость и т. д. MicroSD — это миниатюрный формат карты памяти SD с малым форм-фактором, который широко используется в различных электронных устройствах.
Мы собираемся изучить использование SD-карт во встроенной системе. Если быть точным, мы будем иметь дело с использованием SD-карт в небольших встроенных системах.

Цепь и интерфейс

SD-карта имеет собственный хост-интерфейс, кроме режима SPI для связи с ведущими устройствами. Родной интерфейс использует четыре линии для передачи данных, где микроконтроллер имеет модуль контроллера SD-карты, и для его использования требуется отдельная лицензия. Поскольку SPI является широко используемым протоколом и доступен в большинстве недорогих микроконтроллеров, режим SPI является широко используемым интерфейсом в недорогих встраиваемых системах. Диапазон рабочих напряжений семейства SD составляет от 2,7 В до 3,6 В, что указывается в регистре рабочих условий (OCR).

Разводка SD-карты

Разводка карты MicroSD

Большинство микроконтроллеров используют протокол связи SPI для взаимодействия с SD-картами. SD-карты имеют микроконтроллер, который показывает их доступность главному контроллеру (микроконтроллеру). Микроконтроллер видит SD-карту как адресуемый сектор, на котором возможны функции чтения/записи. Когда микроконтроллер находится в режиме SPI, связь между ведущим и ведомым осуществляется через 4 контакта, а именно. часы, выбор чипа, ввод и вывод данных. Следует иметь в виду, что на протяжении всей связи между двумя устройствами микроконтроллер будет отправлять часы.
Большинство макетных плат имеют специальный слот для SD-карты. Но чтобы понять связи, разберем эту довольно простую схему.

Цепь

Если логический уровень микроконтроллера отличается от уровня SD-карты, необходимо использовать переключатель уровня для преобразования линейных напряжений.
Контакт MISO (ведущий последовательный выход) должен быть подключен к контакту SDI (последовательный ввод данных) на микроконтроллере.
Вывод MOSI (последовательный вывод главного устройства) должен быть подключен к выводу SDO (вывод последовательных данных) на микроконтроллере.
Вывод SCK (последовательные часы) должен быть подключен к выводу SCK (последовательные часы) на микроконтроллере.
Вывод CS (выбор микросхемы) должен быть подключен к соответствующему выводу CS на микроконтроллере или к любому цифровому выводу ввода-вывода на микроконтроллере. Предусмотрена общая площадка.

ВАЖНОЕ ПРИМЕЧАНИЕ : При подключении источника питания убедитесь, что источник питания 3,3 В, так как питание 5 В приведет к тому, что ваша карта загорится дымом.

Интерфейс

После того, как соединения установлены, мы готовы связать наше оборудование с программным обеспечением.
Правильно установите направление каждого из четырех контактов. При активации режима SPI идеальной конфигурацией должен быть режим (0,0) и фаза с выборкой входных данных в середине выходных данных. Кроме того, тактовая частота должна быть установлена ​​в диапазоне от 100 кГц до 400 кГц до инициализации карты. Как только инициализация выполнена, часы могут быть установлены на более желаемую частоту.

SD-команды

Далее идет сложная часть, инициализация SD-карты и выполнение передачи необработанных данных. Систематический подход к программированию программного обеспечения сделал бы задачу довольно легкой.
Но сначала важно узнать, как микроконтроллер активирует SD-карту. Существует фиксированный набор команд и ответов, которым необходимо следовать, чтобы создать структуру команды для ответа в нашей программе. Данные передаются в байт-ориентированном формате с определенной длиной.
В следующей таблице показаны необходимые команды на карту и соответствующий ответ от карты.

Каждая команда имеет постоянную длину 6 байт.
Первый байт — это сложение номера команды и числа 64.
Пример :
Для CMD0: номер команды 0 + 64 = 64 = 0x40 в шестнадцатеричном формате.
Для CMD1: номер команды 1 + 64 = 65 = 0x41 в шестнадцатеричном формате.
И так далее.
За этим следует набор из четырех байтов, известных как аргументы. Эти аргументы обычно содержат адрес данных или длину блока.
Последний байт — это байт CRC (Cyclic Redundancy Check). Большинство команд в режиме SPI не требуют контрольного байта, если функция CRC не включена. Для некоторых команд, таких как CMD0, CRC равен 0x95, и в большинстве случаев отправляется 0xFF. Включение CRC требует от микроконтроллера отправки правильного контрольного байта. Итак, убедитесь, что функция CRC включена или отключена.
Командный фрейм выглядит следующим образом:

Карта получит команду, когда на вывод DO (выход данных) подается высокий уровень, как показано выше. Вывод CS (выбор чипа) должен быть переведен из высокого в низкий перед отправкой команды и должен оставаться на низком уровне во время процесса. Время между командой и ее ответом известно как время ответа на команду (NCR). Как упоминалось ранее, что касается тактовых импульсов от микроконтроллера, соответствующий байт ответа, отправленный обратно с карты на микроконтроллер, должен управляться последовательными тактовыми импульсами микроконтроллера. Существует вероятность того, что байт ответа от карты может быть пропущен микроконтроллером из-за отсутствия управляющего тактового импульса. Следовательно, необходимо убедиться, что 8-битный тактовый импульс отправляется на карту вскоре после отправки кадра команды (см.0056 ТЕХНИЧЕСКОЕ ПРИМЕЧАНИЕ ниже). Кроме того, при получении байта с карты на контакт DI (вход данных) должен быть установлен высокий уровень.

Кроме того, давайте проанализируем различные типов ответов, которые мы получаем от карты, и что они означают.

Ответ R1, 0x01 означает, что команда, отправленная до ответа, привела к переходу карты в состояние ожидания.
Байт ответа 0x00 означает, что команда принята и карта будет ожидать выполнения предложенного события. Если установлены какие-либо другие биты в ответе R1, это результат ошибки, и он будет уменьшен до коэффициента, указанного в каждом бите ответа R1 на рисунке.

Инициализация SD-карты

Теперь, что касается отправки команд, существует порядок, в котором они должны быть отправлены. Только команды CMD0, CMD1, ACMD41, CMD58 и CMD59 будут приняты, когда карта находится в состоянии ожидания. Отправка любой другой команды, скорее всего, приведет к недопустимому ответу.

ТЕХНИЧЕСКОЕ ПРИМЕЧАНИЕ : После подключения карты микроконтроллер всегда должен отправлять набор байтов, которые мы будем называть фиктивными байтами. Один фиктивный байт равен 0xFF. Эти фиктивные байты имеют простую, но важную цель. Перед инициализацией карта должна знать частоту, с которой передаются данные. Отправив примерно 75 фиктивных битов (фиктивный байт * 10 раз = 80 бит), карта будет готова к обмену данными. Кроме того, даже после отправки каждой команды рекомендуется отправлять хотя бы один фиктивный байт. Логическим объяснением этого является то, что связь управляется тактовым импульсом микроконтроллера. Тактовый импульс отправляется только при заполнении буфера данных. После отправки каждого ответа и перед следующей командой или между командой и ответом SCK перестанет генерировать импульсы из-за пустого буфера данных. Чтобы обеспечить непрерывную передачу тактовых импульсов между каждой командой, заполните буфер данных ненужным значением, например фиктивным байтом. Чтобы создать фиктивную байтовую функцию с количеством циклов в качестве аргумента.

Первая команда , которая должна быть отправлена ​​на карту, — это команда CMD0 . Структура любой другой команды-ответа должна основываться на этой модели.

  • Установите высокий уровень на выводе DO.
  • Переместите вывод CS с высокого уровня на низкий.
  • Отправить фиктивный байт.
  • Затем последовательно отправьте следующую 6-байтовую команду
    Первый байт: 0x40
    Следующие четыре байта: 0x00000000
    Байт CRC: 0x95
  • Отправьте еще один фиктивный байт или столько, сколько требуется, чтобы сгенерировать SCK, дающий SD-карте время ответить на командный запрос.
  • Дождитесь установки бита флага приема, а затем прочитайте ответ с SD-карты или создайте цикл для чтения ответа несколько раз. Ответ должен вернуться в течение времени от команды до ответа (Ncr). Или что-то должно быть не так.
  • Требуемый ответ — 0x01, что означает, что карта находится в состоянии ожидания и все готово.

Отправьте команду CMD8 , чтобы проверить версию вашей SD-карты.
Разница в 6-байтовых командах
Первый байт: 0x48
Следующие четыре байта: 0x000001AA
Байт CRC: 0x87

Мы ищем две возможности в нашем ответном байте. Либо 0x01, либо 0x05.

Ответ 0x01 означает, что у вас SD-карта версии 2. За ответом 0x01 следуют 4 байта 0x00, 0x00, 0x01, 0xAA в порядке их передачи с SD-карты, что, по сути, является аргументом, который вы отправляете в своей команде.

Если ответ 0x05, это означает, что используется карта версии 1 или карта MMC. Если карта на самом деле является SD-картой версии 2, то этот ответ является результатом недопустимой команды. Кроме того, карта сейчас находится в состоянии ожидания.

После выполнения двух вышеуказанных команд (CMD0 и CMD8) можно с уверенностью сказать, что наша SD-карта работает в хорошем состоянии и готова к чтению/записи данных.
Кроме того, чтобы убедиться, что SD-карта работает при правильном рабочем напряжении, отправьте команду CMD58 .

Затем мы должны инициировать процесс инициализации i . Для этого отправьте команду CMD1 и дождитесь ответа 0x00, что означает, что бит состояния ожидания очищен.
Если вы используете SDC или с целью создания общего кода, рекомендуется отправить ACMD41 , чтобы начать процесс инициализации, а затем отправить команду CMD1 , если ACMD41 отклонен.
В любом случае процесс инициализации может занять несколько сотен миллисекунд, поэтому рекомендуется выполнить несколько итераций для проверки байта ответа.

Предположим, что ответ CMD8 привел к 0x05, необходимо сделать несколько соображений относительно процедуры инициализации. Карты версии 1 могут не поддерживать команду ACMD41. И даже если они поддерживают команду ACMD41, отправьте команду CMD55 и проверьте ответ, который будет 0x05 вместо 0x01, а затем вместо отправки команды CMD41 отправьте команду CMD1 для завершения процесса инициализации.

Чтение/запись SD-карта

Теперь мы готовы к чтению/записи необработанных данных.

Первое, что нужно сделать здесь, это установить размер блока чтения/записи.
Для этого отправьте команду CMD16 . Аргументы этой команды должны указывать длину блока.
Пример : Чтобы установить длину блока 512 байт, отправьте 4-байтовый аргумент как 0x00000200.
Отправьте 0xFF в качестве байта CRC и дождитесь ответного байта 0x00.

Что касается команд чтения/записи, то общая структура отправки команд такая же, но с некоторыми дополнительными деталями.

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

Отправьте команду CMD17 для блока чтения as s ingle read и дождитесь ожидаемого ответа 0x00. Как только это будет сделано, подождите, пока SD-карта отправит другой ответ, 0xFE. Этот ответ, передаваемый SD-картой, указывает на начало непрерывной передачи блока данных. В конце отправьте фиктивный байт или два, и процесс будет завершен.

Временная диаграмма чтения одного блока

Временная диаграмма многоблочного чтения

Этот контент предназначен только для зарегистрированных пользователей. Создайте бесплатную учетную запись для доступа к контенту.

SignUp/SignIn

В случае CMD18 для блока многократного чтения выполните процедуру до ответа 0xFE. После этого карта будет передавать блоки данных до тех пор, пока не получит команду CMD12 , которая указывает микроконтроллеру на завершение чтения блока.

В случае выполнения одноблочной записи или многоблочной записи отправьте CMD24 или CMD25 соответственно и дождитесь ответа 0x00. Для каждой записи блока требуется начальный токен 0xFE в случае записи одного блока и 0xFC в случае записи нескольких блоков, чтобы карта могла начать запись одного блока данных в указанный сектор. Убедитесь, что 0xFC отправляется для каждой блочной записи во время многоблочной записи. После записи каждого блока должен быть выдан токен остановки 0xFD (не требуется в случае записи одного блока). После завершения записи всего блока данных появляется Команда CMD13 обязательна .
Не забывайте отправлять фиктивные байты между ответами, а также перед отправкой стартовых токенов.

Временная диаграмма записи отдельного блока

Этот контент предназначен только для зарегистрированных пользователей. Создайте бесплатную учетную запись для доступа к контенту.

Регистрация/Вход в систему


Многоблочная диаграмма времени записи

Этот контент предназначен только для наших зарегистрированных пользователей. Создайте бесплатную учетную запись для доступа к контенту.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *