Мой компьютер

Распиновка sd разъема. Подключение SD карты к микроконтроллеру. Распиновка SD и microSD карт

Как видно из рисунка после передачи кадра команды необходимо продолжать чтение байтов (Ncr) от microSD до получения ответа (R1), при этом уровень CS должен быть активным "0".

В зависимости от индекса команды ответ может быть не только R1 (см. набор основных команд) на CMD58 ответ R3 (R1 и завершающее 32-битное значение OCR), а некоторым командам нужно больше времени NCR и они ответ будет R1b . Это ответ R1, за которым идет флаг занятости (сигнал на линии "DO" удерживается картой в низком уровне, пока продолжается внутренний процесс). Контроллер хоста должен ждать окончания процесса, пока "DO" не перейдет в состояние высокого уровня (т.е. дождаться 0xFF). А так же R2 при запросе состояния регистра STATUS.

Ответ R1 содержит 1 байт, его структуру можно посмотреть в таблице ниже. Ответ R2 состоит из двух байт, первый байт R1 и второй R2 (см. таблицу структуры R2). А ответ R3 соответственно из 5 байт.


Ответ R1 при значении 0х00 означает успешное завершение команды, иначе будет установлен соответствующий флаг.

Структура ответа R1.


Структура ответа R2.


Инициализации в режиме SPI.

После сброса и подачи питания карта по умалчиванию устанавливается в режим работы по протоколу MMC (Serial Peripheral Interface), для перевода в режим SPI необходимо сделать следующее:

  1. После достижения питания 2.2 В, подождать не менее миллисекунды, установить на линиях DI и CS высокий уровень и выдать около 80 импульсов на вывод CLK. После такой процедуры карта будет готова принять родную команду.
  2. Послать команду CMD0 (программный сброс). Карта должна ответить (R1) с установленным битом ожидания (0x01).
  3. Послать команду CMD1 (для начала инициализации карты). Ждать ответа 0х00 для подтверждения завершения процесса инициализации.

Напомню, что команда CMD0 должна содержать корректное поле CRC. Рассчитывать нет смысла, так как аргументов в этой команде нет, по этому оно постоянно и имеет значение 0х95. Когда карта войдет в режим SPI, функция CRC будет отключена и не будет проверяться. Опция CRC может быть снова включена командой CMD59.

В результате команда CMD0 будет выглядеть так: 0х40,0х00,0х00,0х00,0х00,0х95.

  • индекс команды - 0х40.
  • аргумент- 0х00,0х00,0х00,0х00.
  • CRC-0х95.

Что касается 80 импульсов, то их можно сформировать передавая по SPI значение 0хFF 10 раз подряд при установленных высоких уровнях на линиях DI и CS.

После простоя более 5 мс карта памяти переходит в энергосберегающий режим, и способна принимать только команды CMD0, CMD1 и CMD58. По этому процесс инициализации (CMD1) необходимо практически каждый раз повторять при чтении/записи блока данных или делать проверку состояния карты.

Для SDC-карт в случае отклонения команды CMD1 рекомендуется использовать команду ACMD41.

Сам процесс инициализации может занять относительно длительное время (в зависимости от объема карты) и может достигать сотен миллисекунд.

Чтение и запись блока данных.

По умолчанию в режиме SPI обмен между микроконтроллером и картой ведется блоками по 512 байт, по этому для записи даже одного байта придется сначала прочитать весь блок и изменив байт перезаписать обратно. Размер блока может быть изменен в регистре CSD карты памяти.

Воизбежания ошибки адресации при выполнении команд чтения/записи необходимо что бы адрес указывался четко начала сектора. Для этого можно сбрасывать бит "0" 3 байта адреса сектора, т.е. делать его четным, а младший всегда должен иметь значение 0х00.

Чтение блока данных.

Алгоритм чтения блока данных следующий:

  • После подтверждения инициализации передаем команду CMD17 (ответ R1), с адресом необходимого сектора.
  • Передаем 0xFF до получения стартового байта 0xFE .
  • Принимаем блок данных (по умалчиванию 512 байт) и 2 байта CRC.

Значение CRC не обязательно, но процедура принятия (передача 0хFF от МК) необходима.

Чтение блока.


Запись блока данных.

Алгоритм записи блока данных следующий:

  • Если простой карты был более 5 мс передаем команду CMD1 (ответ R1).
  • После подтверждения инициализации передаем команду CMD24 (ответ R1), с адресом необходимого сектора.
  • Передаем стартовый байт 0xFE .
  • Передаем блок данных (по умалчиванию 512 байт) и 2 байта CRC.
  • Получаем байт подтверждения записи.
  • Ждем окончания записи (изменения байта 0х00).

Блок данных может быть меньше 512 байт при изменении длины блока командой CMD16.

Значение CRC не обязательно, но процедура передачи любыми значениями необходима.

Оценку простоя можно программно и не делать, а сразу давать команду инициализации. При программной реализации столкнулся с некорректной записью, почему то все байты были записаны в сектор со сдвигом влево. Проблему удалось решить, только передавая стартовый бит (0xFЕ) два раза.

Запись блока.


Байт подтверждения при записи блока данных.


Запись/чтение нескольких блоков подряд.

При помощи команд CMD18 , CMD25 можно прочитать/записать несколько блоков подряд или так называемое многоблочное чтение/запись. Если не было задано количество блоков, то процесс чтения/записи можно остановить командами CMD12 при чтении, а так же передачей маркера "Stop Tran " при записи соответственно.

Практическое применение.

Практическое применение карт памяти довольно широко. В последней своей конструкции задействовал microSD для записи показаний с различных датчиков (температуры, сигнализации) в течении дня каждый час. Данные сохраняются следующим образом:

  • Год берется последние две цифры - это соответствует первому (главному) байту адреса сектора карты памяти.
  • Месяц, две цифры - это соответствует второму, старшему байту адреса сектора карты памяти.
  • День, две цифры умножаются на 2 (во избежание наезда вне границы сектора) - это третий, средний байт адреса сектора карты памяти.
  • Младший, четвертый байт соответственно всегда "0".

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

Кому надо скину фрагмент кода на ассемблере для 18 пиков.

Вопросы можно задать на ..

Несколько лет назад в мае 2011 создателем культовой игры «Elite» Дэвидом Бребеном был представлен первый концепт одноплатного компьютера Raspberry Pi. Этот момент стал переломным в моей жизни. Идея сделать компьютер размером с флеш-накопитель лежала на поверхности, но большой размах получила лишь с помощью компании Raspberry Pi Foundation.

Уже 25 июля 2011 в производство отдается альфа версия компьютера. К сожалению, у проекта изменился концепт, и теперь он позиционируется как компьютер размером с кредитную карту. Несмотря на это обстоятельство за ним следили миллионы людей. Эффекту толпы повиновался и я, ежедневно проверяя официальную страницу проекта. Началось длительное и мучительное ожидание «чуда», которое случилось 29 февраля 2012 года – старт продаж.

Купить Raspberry Pi можно было через сеть Farnell либо у RS Components . Как оказалось, 29 февраля можно было сделать лишь предзаказ. В наличии этих плат не было ни у одной из контор. Первая партия устройств составляла всего 10000 экземпляров, поэтому, учитывая ажиотаж вокруг проекта, оформить заказ было очень тяжело. Однако, преодолев все трудности, в 14:06 того же дня компьютер был куплен за 46.73 фунтов стерлингов у Farnell’а.

Так долго не выполняли ни один из моих зарубежных заказов. Меня крайне огорчил тот момент, что Farnell, взяв за доставку 20 фунтов, отправил посылку 29 мая 2012 года (спустя 2 месяца) обычной почтой без номера для отслеживания. На удивление, симбиоз Королевской и Российской почты доставил посылку в целости и сохранности уже 22 июня. Это была самая желанная посылка за последние несколько месяцев, поэтому, не выдержав напряжения, мне пришлось отпроситься с работы и бежать на почту.

Рассказывать про то, как настраивать Raspberry Pi для первого запуска нет смысла. Со статьей на эту тему я опоздал на пару лет, уже много строк об этом написано на других ресурсах, а на Youtube выложено достаточное количество видеоматериалов. Я же хочу рассказать о существенном для меня недостатке в конструкции – неудобном расположении разъема для SD карты. Когда карта вставлена, она сильно выпирает за пределы платы, что портит вид самодельного корпуса.

Есть два варианта решения этой проблемы: подпаять переходник SD->microSD параллельно разъему, установленному на Raspberry Pi (как сделать такую операцию можно почитать в статье на Хабре), или использовать переходник Low-profile MicroSD->SD. Первый вариант для меня просто недопустим – ну не поднимается рука паять плату, т.к. боюсь испортить товарный вид своей Малинки. Считаю, что оптимальным выбором является все же использование Low-profile переходника.

Изначально было решено приобрести такой переходник в одном из зарубежных интернет магазинов. Выбор есть, но стоимость на такие безделушки просто запредельная. Самые дешевые экземпляры стоят 10 долларов, причем некоторые образцы откровенно выглядят самоделками. Окончательное решение о самостоятельном изготовлении переходника, было принято после посещения сайта DIYGadget , обратите внимание, как просто повторить их творение .

Готовы? Переходим от слов к делу. Чтобы правильно сделать переходник, изучим спецификацию на SD и microSD карты. Все, что необходимо для изготовления я попытался систематизировать в таблице 1, 2.

Таблица 2: Цоколевка карт памяти SD

Соединив соответствующие контакты на картах памяти, и, объединив Vss1, Vss2, получаем электрическую принципиальную схему переходника.

Чтобы изготовить переходник нам потребуется:
1) Держатель для microSD (CF TFC-WPCE-08 MICROSD CARD) – 52.22 руб.
2) Кусок двустороннего фольгированного стеклотекстолита площадью порядка 4 см 2 (2% от позиции СТЕКЛОТЕКСТОЛИТ ФОЛЬГИР.1.5ММ 2-Х СТОРОН) – 3 руб.
3) Материалы для монтажа (хлорное железо, олово, флюс) – 10 руб.

Тогда себестоимость проекта составит 65 рублей 22 копейки и некоторое количество свободного времени. Для того чтобы удешевить конструкцию можно заменить держатель карты microSD на CF TFC-WPCER-08 MICROSD CARD . К сожалению, этой позиции не оказалось в наличии на складе ЗАО «Промэлектроника», поэтому я приобрел более дорогой вариант. Обращаю Ваше внимание на то, что если Вы замените тип держателя, то воспользоваться моим шаблоном для ЛУТ (лазерно-утюжной технологии) у Вас может не получиться.

Для проектирования печатной платы я использовал Autocad, т.к. мой любимый SprintLayout не смог порадовать наличием нужного шаблона. Для любителей видоизменить печатную плату Вы можете скачать исходник в формате DWG , а если такой необходимости нет, то – заготовку в формате PDF (рекомендую перед нанесением шаблона из PDF сверить размеры).

После того, как шаблон перенесен на плату, рекомендую просверлить отверстия диаметром 0,5 мм для перехода с одного слоя на другой.

Переход со слоя на слой я произвожу с помощью тонкого провода, предварительно облудив дорожки будущего переходника. В тех местах, где отверстия находятся под держателем microSD, необходимо надфилем сточить капли олова, чтобы он установился без перекоса. В последнюю очередь производим монтаж держателя. Если в процессе изготовления платы использовались различные флюсы, то перед тем как толкать её в Ваш Raspberry Pi обязательно промойте плату.

Делать переходник самим или покупать – выбирать Вам. Чтобы выбор был более осознанным, специально для Вас я подобрал несколько ссылок для покупки:
1) Raspberry Pi Premium Low-profile MicroSD (TF) to SD Card Adapter. Protect Board.
2) Raspberry Pi Low-profile MicroSD to SD Card Adapter, SD card won"t get damaged!!
3) MicroSD to "short" SD / RS-MMC adapter. For Everdrive carts, Raspberry Pi, etc.
4) Low-profile MicroSD to SD Card Adapter for Raspberry Pi.
5) SD card adapter for Raspberry pi REV2 +free shipping.

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

Для самостоятельной сборки устройства Вам необходимо скачать следующие файлы:
1. Исходник платы для ЛУТ в формате DWG
2. Плата для ЛУТ в формате PDF

Удачи в Ваших начинаниях!!!

  • AndReas говорит:

    Собрать адаптер Memory Stick своими руками не составляет особого труда при знании назначения функциональных выводов той или иной карты памяти. Обычно зовут распиновкой карты памяти или, например, микросхемы, чипа и т.п. Вообще технология проста. Вырезается макет карты памяти MMC (MultiMedia Card) из текстолита. На макете вырезаются 7 дорожек (MMC имеет 7 выводов). Затем, в соответствии с приведенной на рисунке ниже распиновкой, дорожки припаиваются к выводам карты памяти SD (имеет 9 выводов, из которых 2 не используются), microSD (имеет 8 выводов, из которых тоже не используются 2, но обратите внимание, что у карты памяти microSD нет вывода Vcc) или microM2 (распиновка microM2 в смежной теме Адаптер Memory Stick Micro M2). Вот и всё. Адаптер Memory Stick готов.

    P.S. У нас в наличии имеются карты памяти MMC на 1 и 2 Гб. Стоимость, соответственно, 285 и 360 руб. Доставка включена в указанную цену.

    Также можно дешево купить следующие типоразмеры карт памяти:
    - Memory Stick и Memory Stick M2;
    - Secure Digital (SD);
    - Mini SD;
    - Micro SD (TF);
    - Compact Flash;
    - XD;
    - USB Flash Drives различных исполнений и емкости.
    Например, такие:

  • slava говорит:

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

  • AndReas говорит:

    Вот так будет выглядеть адаптер miсroSD to MMC:

  • slava говорит:
  • Сколько себя помню всегда любил читать, но на дворе 21 век и порой необходимую литературу можно найти только в интернете. Да и читать электронные книги можно на электронном устройстве типа планшет, компьютер или ридер. В итоге получилось небольшое устройство, которое может читать текстовые файлы с SD или microSD карты и выводить их содержимое на экран.

    Мозгом устройства служит микроконтроллер Atmega32 работающий на частоте 8МГц. МК тактируется от внешнего кварца на 8МГц, в качестве экрана устройства я применил небольшой ЖК индикатор WH1604A на контроллере HD44780 разрешением 4 строки по 16 знакомест каждая. Кнопки использовал обычные тактовые, что касается SD карты для её подключения к микроконтроллеру я использовал резисторные делители чтобы согласовать логические уровни.

    Принципиальная схема устройства:

    На схеме распиновка верна только для SD карты или SD адаптера, для подключения других карт пользуйтесь их распиновкой!

    Устройство поддерживает SD, miniSD и microSD карты памяти размером до 4ГБ отформатированные в файловой системе FAT, FAT16. Следует помнить что устройство не поддерживает каталоги поэтому все файлы нужно записывать только в корень флешки. Текстовые файлы должны быть в обычном txt формате и без форматирования, имена файлов должны быть не длинее 8 знаков (не считая расширения).

    При включении устройства на дисплее появится заставка:

    Если SD карта не установлена в устройство, неправильно подключена, или ещё чего то появится следующие сообщение:

    Если же всё в порядке, то появится главное меню:

    Пользуясь кнопками вы можете войти в пункт "Обзор файлов" где можете выбрать нужный вам для прочтения файл.

    В пункте "Настройки" вы можете выбрать с каким расширением файлы отображать в "Обзоре файлов".

    И в последнем пункте "О системе..." вы можете почитать информацию об устройстве, его авторе и т.д.

    Прошивку для устройства я писал в среде BASCOM-AVR с использованием библиотеки AVRDOS, прошивка занимает всего 30% программной памяти микроконтроллера поэтому есть место для творчества. Внутри устройство собрано на двух печатных платах: на одной расположен МК с обвесом, на другой разъём под SD карту и согласующие цепочки логических уровней.

    Вот фото устройства внутри:

    Для питания я использовал Ni-Cd аккумулятор на 4.8В, 600мАч. После прошивки микроконтроллера необходимо установить следующие фьюз-биты:

    Список радиоэлементов

    Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
    U1 МК AVR 8-бит

    ATmega32

    1 В блокнот
    D1, D2 Выпрямительный диод

    1N4001

    2 В блокнот
    С1, С2 Конденсатор 22 пФ 2 В блокнот
    С3 Электролитический конденсатор 100 мкФ 1 В блокнот
    С4 Конденсатор 100 нФ 1 В блокнот
    R1 Резистор

    10 кОм

    1 В блокнот
    R2-R4 Резистор

    4.7 кОм

    3 В блокнот
    R5-R7 Резистор

    1 кОм

    3 В блокнот
    LCD1 LCD-дисплей LM014L 1 В блокнот
    X1 Кварц 8 МГц 1 В блокнот
    Кнопка 4 В блокнот
    Выключатель 1

    В устройствах на микроконтроллерах для хранения больших объемов данных используется внешняя память. Если требуется хранить единицы мегабайт, то подойдут микросхемы последовательной флэш памяти. Однако для больших объемов (десятки -сотни мегабайт) обычно применяются какие-нибудь карты памяти. В настоящий момент наибольшее распространение получили SD и microSD карты, о них я и хотел бы поговорить в серии материалов. В этой статье речь пойдет о подключении SD карт к микроконтроллеру, а в следующих мы будет разбираться как читать или записывать на них данные.

    Распиновка SD и microSD карт

    SD карты могут работать в двух режимах - SD и SPI . Назначение выводов карт и схема подключения зависит от используемого режима. У 8-и разрядных микроконтроллеров AVR нет аппаратной поддержки SD режима, поэтому карты с ними обычно используются в режиме SPI. В 32-х разрядных микроконтроллерах на ядре ARM, например AT91SAM3, интерфейс для работы с картами в SD режиме есть, поэтому там можно использовать любой режим работы.

    Назначение контактов SD карты в SD режиме


    Назначение контактов SD карты в SPI режиме

    Назначение контактов microSD карты в SD режиме



    Назначение контактов microSD карты в SPI режиме



    Подключение SD и microSD карт к микроконтроллеру в SPI режиме

    Напряжение питания SD карт составляет 2.7 - 3.3 В. Если используемый микроконтроллер запитывается таким же напряжением, то SD можно подключить к микроконтроллеру напрямую. Расово верная схема, составленная путем изучения спецификаций на SD карты и схем различных отладочных плат, показана на рисунке ниже. По такой схеме подключены карты на отладочных платах фирм Olimex и Atmel .

    На схеме обозначены именно выводы SD карты, а не разъема.


    L1 - феррит или дроссель, рассчитанный на ток >100 мА. Некоторые его ставят, некоторые обходятся без него. А вот чем действительно не стоит пренебрегать, так это полярным конденсатором C2. Потому что при подключении карты происходит бросок тока, напряжение питания "просаживается" и может происходить сброс микроконтроллера.

    По поводу подтягивающих резисторов есть некоторая неоднозначность. Поскольку SD карты выпускаются несколькими производителями, на них существует несколько спецификаций. В одних документах четко указана необходимость подтягивающих резисторов (даже для неиспользуемых линий - 8, 9), в других документах этих указаний нет (или я не нашел).

    Упрощенный вариант схемы (без подтягивающих резисторов) показан на рисунке ниже. Эта схема проверена на практике и используется в платах фирмы Microelectronika. Также она используется во многих любительских проектах, которые можно найти в сети.



    Здесь сигнальные линии SD карты удерживаются в высоком состоянии микроконтроллером, а неиспользуемые линии (8, 9) никуда не подключены. По идее они должны быть подтянуты внутри SD карты. Далее я буду отталкиваться от этой схемы.

    Если микроконтроллер запитывается напряжением отличным от напряжения питания SD карты, например 5 В, то нужно согласовать логические уровни . На схеме ниже показан пример согласования уровней карты и микроконтроллера с помощью делителей напряжения. Принцип согласования уровней простой - нужно из 5-и вольт получить 3.0 - 3.2 В.



    Линия MISO - DO не содержит делитель напряжения, так как данные по ней передаются от SD карты к микроконтроллеру, но для защиты от дурака можно добавить аналогичный делитель напряжения и туда, на функционировании схемы это не скажется.

    Если использовать для согласования уровней буферную микросхему, например CD4050 или 74AHC125, этих недостатков можно избежать. Ниже приведена схема, в которой согласование уровней выполняется с помощью микросхемы 4050. Это микросхема представляет собой 6 неинвертирующих буферов. Неиспользуемые буферы микросхемы "заглушены".

    Подключение microSD карт аналогичное, только у них немного отличается нумерация контактов. Приведу только одну схему.



    На схемах я рассматривал подключение SD карт к микроконтроллеру напрямую - без разъемов. На практике, конечно, без них не обойтись. Существует несколько типов разъемов и они друг от друга немного отличаются. Как правило, выводы разъемов повторяют выводы SD карты и также содержать несколько дополнительных - два вывода для обнаружения карты в разъеме и два вывода для определения блокировки записи. Электрически эти выводы с SD картой никак не связаны и их можно не подключать. Однако, если они нужны, их можно подключить как обычную тактовую кнопку - один вывод на землю, другой через резистор к плюсу питания. Или вместо внешнего резистора использовать подтягивающий резистор микроконтроллера.

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

    Ну и для полноты картины приведу схему подключения SD карты в ее родном режиме. Он позволяет производить обмен данными на большей скорости, чем SPI режим. Однако аппаратный интерфейс для работы с картой в SD режиме есть не у всех микроконтроллеров. Например у Atmel`овских ARM микроконтроллеров SAM3/SAM4 он есть.



    Шина данных DAT может использоваться в 1 битном или 4-х битном режимах.

    Продолжение следует...