Схема картридера своими руками

Схема картридера своими руками

Курс для новичков продолжается ознакомлением с SPI на примере работы с SD/MMC карточками. А поскольку USB-MSC мы уже проходили, то соорудим пародию на картридер. Пользоваться им я категорически запрещаю, т.к. размер карты зашит в коде и при установки другой карты вы можете потерять ваши данные.

Нам понадобится MMC либо SD карточка объемом до 2Гб. SDHC карточка нам не подойдет! С ней пример работать не будет.
Наиболее правильно было бы взять код FatFS от ChaN (У меня нашолся такой архив ffsample.zip, не помню какой свежести) в котором присутствует и определение размера, и работа с SDHC картами. Но код тяжел для начинающих. Желающие могут попробовать самостоятельно подключить правильную реализацию. Я же ограничусь более простой версией.
Так же отмечу, что это довольно сложный урок, и по-хорошему вы уже должны быть не начинающим.

Схема

Используем схему из прошлого урока с подключением USB разъема и добавляем подключение карточки. Для этого нам надо собрать следующую схему:

Можете подпаять проводки либо непосредственно к карточке, которую не жалко, либо как я воспользоваться слотом для карты. Приведённая схема одинакова как для SD так и для MMC карты. Все лишние (не показанные) выводы MMC карты остаются неподключенными.

Дорабатываем код

Задачи универсальности перед собой ставить не станем. Будем делать код под конкретную карту памяти (объем карты). В качестве основы для данного проекта возьмем пример из прошлого урока и доработаем его. Доработка пройдет следующим образом:

  1. Настройка SPI
  2. Код для работы с картой памяти
  3. Доработка функций чтения/записи USB-диска

Для первых двух пунктов обратимся за помощью к библиотеке LPC1343 Code Base.
Кроме этого надо удалить то, что нам не нужно. В директории src проекта удаляем файл diskimg.c и в директории inc файл diskimg.h, т.к. они нам больше не нужны. Для этого у файла вызываем контекстное меню и выбираем пункт Delete. На вопрос удалить ли файл из файловой системы отвечаем положительно.

Настройка SPI

В проекте (не библиотеке, т.к. здесь мы её не подключали) создаем файл ssp.h со следующим содержимым:

Поскольку карта памяти должна инициализироваться на скорости 400кГц, а работать может и на 20МГц, то функцию инициализации напишем с одним параметром, задающим медленный/высокоскоростной режим работы SPI.
Создаём файл ssp.c с реализацией функций. После подключения заголовочных файлов добавляем функции для выбора устройства.
Source File пишем ssp.c и жмем Finish.

Эти функции нам нужны, т.к. мы не будем использовать имеющийся аппаратный контроль, а будем выбирать карточку самостоятельно (ввиду некоторых ограничений в протоколе работы с картой памяти).
Далее реализуем функцию передачи. В ней мы просто заносим данные для передачи в регистр данных DR контроллера SPI. После этого контроллер SPI самостоятельно запускает цикл обмена. Нам же остается только ждать его завершения, о чём сообщит нам второй бит в регистре SR контроллера SPI. По окончании обмена мы извлекаем из регистра данных DR контроллера SPI принятые данные и возвращаем их как результат работы функции.

Теперь приступим к функции инициализации:

Кроме уже известных нам разрешения работы, подаче тактов и выбора для выводов функции для работы с периферией у нас имеется так же:

  • установка в регистр SSPCLKDIV делителя тактовой частоты для контроллера SPI (задание частоты работы контроллера SPI) в 10 или 1, в зависимости от требуемого режима;
  • установка в регистр CR0 формата пакета (подробно в документации к контроллеру) и дополнительного делителя (задание частоты тактовой линии SPI) в 8 либо 1, в зависимости от требуемого режима;;
  • установка в регистр CPSR делителя частоты для опорной частоты тактовой линии SPI в минимальное значение 2;
  • удаление «мусора» из приемного буфера SPI;
  • установка в регистр CR1 работы контроллера в режиме «мастер» и разрешение тем самым работы контроллера SPI;
Читайте также:  Команда редактирования файла в dos

На первый взгляд может показаться сложной система задания частоты шины SPI. По этому попробую описать последовательно. Системная частота делиться на делитель в регистре SSPCLKDIV и эта частота задаётся основной для работы контроллера SPI. Затем она делиться на делитель в регистре CPSR для формирования опорной частоты шины SPI (это ещё не есть частота шины). И, наконец, опорная частота делиться на коэффициент, заданные в поле регистра CR0 (+1) для получения частоты тактового сигнала шины.
Прерывания нам здесь не нужны, мы владелец шины и сами определяем, когда осуществлять передачу. Поэтому здесь всё.

Работа с картой

Подробно рассматриваться не будет (Очень кстати, пока готовился курс, появилась статья от lleeloo). Функции расположены в файле sdcard.c и описаны в файле sdcard.h, которые требуется добавить к проекту.
Отмечу, что в файле sdcard.h содержится определение размера нашей карты памяти:

Всё имена те же, что были в примере. Укажите здесь количество блоков вашей карты памяти в MSC_BlockCount. Ещё раз напомню, что SDHC не поддерживаются и более 2Гб не может быть.
Так же добавился вызов инициализация карты памяти в функции main в файле usbmemrom_main.c:

Функция SetLed предназначена для целей диагностики. Так если при инициализации карты возникла ошибка, то будет зажжен светодиод на плате, индицируя ошибку.

Функции чтения/записи

В файле msccallback.c правим функции чтения и записи блока диска. Но так как размер блока на диске у нас 512 байт, а размер блока USB всего 64 байта, то для чтения одного блока диска функция чтения будет вызвана 8 раз подряд с разным смещением для одного и того же блока. И точно так же для записи. Что бы ни делать несколько чтений одного блока с диска (а тем более записей), добавим кэширование:

После этого функция чтения выглядит крайне просто:

И функция записи так же проста, только добавлен код записи буфера по достижение конца блока:

В коде присутствует вызов той же SetLed, на этот раз с целью индикации обращения к карте.

Запуск

Как обычно компилируем и исправляем ошибки.
После подключения добавленного разъема к компьютеру светодиод начнет мигать, а в системе появиться новый съемный диск.
Если светодиод постоянно ярко светится, что бывает, когда в начале был другой код, который «сбил» инициализацию карте, то обесточьте плату и снова подайте питание.
Если система предлагает вам диск отформатировать, то вероятно у вас в коде не верно указан размер. Хотя возможно просто карточка не была отформатирована.
Я повторно рекомендую не использовать карточки с важными для вас данными. Сам я при экспериментах указывал и меньшие и большие размеры, но кто знает как поведёт себя нестабильная система.

Статистика

Кода в Debug версии у меня получилось 4216 байт кода. Скорость чтения составила 194 кБайт/с, скорость записи 84 кБайт/с.


После переключения в Release версию код уменьшился до 2772 байта. Скорость чтения при этом выросла до 239 кБайт/с, а записи до 95кБайт/с.

Читайте также:  Canon mg2940 как подключить к wifi

Вместо заключения

С сожалением должен признать, что урок получился объемным и непонятным. При этом при всём непосредственно по теме (SPI) пара жалких абзацев. Даже исключение принципов работы с картой памяти хоть и сократило статью, но недостаточно.
Однако, буду надеяться, что изучение прошлых примеров научило вас разбираться в коде.

Что делать, если картридер не видит карту памяти?

Как-то раз с лёгкой руки мне задарили USB-картридер SD-карточек. Сказали, что всё равно плохо работает, возьми, мол, на детали.

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

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

В череде нескольких попыток бывало, что карта памяти читалась, но уж как-то непредсказуемо, со сбоями. А при клике по иконке картридера показывалось вот такое сообщение, хотя SD-карта была подключена.

Не особо разобравшись в причине сбоев, я решил заменить USB-разъём. Поспешил. Проблему это не решило.

Следующая деталь, на которую пал мой пристальный взор, был сам слот памяти. Да, тот самый, с кучей скользящих контактов. Трудность заключалась в том, что к контактам этого разъёма очень трудно подобраться – мешает металлическая крышка.

Но, повертев ридер в руках, я заметил, что крышка слота легко отстёгивается, так как фиксируется на пластмассовом основании защёлками. Чуть подковырнув одну из сторон металлической крышки, я с лёгкостью снял её.

Единственное, что может помешать снятию крышки — это контакт крышки, который припаивается к общему проводу печатной платы. В моём случае контакт этот был плохо пропаян, и поэтому металлическая крышка снялась без проблем. Тогда я не обратил на это особого внимания, и, как оказалось, зря.

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

Второй контакт (2) определяет, включена ли защита от стирания (удаления) файлов на SD-карте.

Как видим, эти 2 контакта служат некими "глазами" для картридера. А металлическая крышка слота под карту памяти служит общим контактом, который подпаивается к общему проводу на печатной плате.

Если эта металлическая крышка плохо контачит с общим проводом на печатной плате, то и возникают сбои. Управляющая микросхема на печатной плате картридера считает, что карты памяти в слоте нет и не "видит" её. Чтобы устранить эту проблему, нужно просто пропаять общий контакт металлической крышки. Вот он на фото.

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

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

Читайте также:  Телефон завис при сбросе к заводским настройкам

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

  • Цена: $0,99
  • Перейти в магазин

Продолжаю цикл обзоров, где для достижения конечной цели нужно немного поработать руками. Героем сегодняшнего обзора стал microSD картридер.
О том, что с ним в итоге произошло, как таким образом можно бороться с маркетингом, а главное — повышать юзабилити — Вы можете прочитать под катом. МНОГО фото!

Более года назад я начал пользоваться телефонами одной только марки — Google. И всё в моём первом нексусе (nexus S) было хорошо, а ещё лучше во втором (galaxy nexus), да вот только отсутствие возможности установки карты памяти немного раздражала. Дальше — больше. «Октябрь месяц на дворе — давайте новый нексус мне!» Так в моём доме появился планшет — Google Nexus 7. На тот момент о версии с 3g или объёмом памяти 32гб ходили только слухи, так что выбирать особо не приходилось.

Идея как-то расширить объём доступной для использования памяти зародилась ещё на этапе покупке. И тут я стал думать. Цеплять флешки через microUSB OTG кабель я даже не рассматривал, решил сделать что-то своё, более компактное.
Основой кончено же должен был стать картридер, заказав его, а также microusb connector (по этому запросу он легко ищется на ebay). Для прочих экспериментов я заказал сразу 10 шт, Вам, наверное и 1 хватит.
Не буду говорить как так вышло, что посылку я получили через 2,5 месяца после заказа — вот, она уже у меня.
Первоначально планировалось с этой самой флешки смотреть фильмы, значит она должна хорошо крепиться и не иметь возможности случайно быть выбита и тем самым убить microusb вход.
И тут мне повезло(?!), под руки попался давно забытый пульт управления плеером от nokia 5800. Как оказалось, его прищепка идеально подходит по длине, чтобы цепляться за прорезь для решётки динамика.

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

Также не нужно забывать о необходимости аппаратной поддержки OTG режима. Для этого спаиваем вместе 4 и 5 пин microusb коннектора.

Примеряем прищепку и коннектор на устройстве

Обрезаем корпус картридера так, чтобы он поместился в прищепку

И припаиваем его к USB выходу

Осталось закрепить коннектор холодной сваркой и произвести косметические улучшения (шлифовка, покраска)

После всех описанных действий получаем вот такой эксклюзивный девайс


Результат превзошёл все ожидания. Девайс крепко сидит на устройстве и реально работает. 2 часа времени были потрачены не впустую =)

Прошла неделька — другая, и захотелось мне довести свою инженерную мысль до нового уровня функциональности.
Сказано — сделано. Всё по полной аналогии с предыдущим девайсом, но проще. Я «приварил» коннектор к самому картридеру, сохранив при этом основную функциональность. (его можно подключать к компьютеру)




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

«Групповое» фото =)

UPD: чуть не забыл. на фотографиях не видно, но в «прищепке» карта памяти, разумеется, съёмная.

Ну и по традиции для моих обзоров: небольшое видео.

Усё) Есть вопросы — буду рад ответить Вам в комментариях.

Ссылка на основную публикацию
Средняя скорость через интеграл
Задачи динамики частицы бывают двух типов. Первый — задано движение частицы, и нужно найти действующую силу. Здесь нет особых трудностей:...
Смартфоны с ик портом на андроид 2018
ТОП-15 телефонов с ИК-портом Возможно, многие помнят первые модели телефонов с цветным экраном, которые ещё не имели технологию блютуза, не...
Создание штриховки в автокаде
Как в Автокаде сделать штриховку? Данная функция часто используется при оформлении чертежей в AutoCAD. На чертежах штрихуют разрезы, сечения и...
Стим расчетный адрес что вводить
При добавлении банковской карты и выборе ее в качестве способа оплаты покупок в Steam кроме стандартной информации о номере карты,...
Adblock detector