Картридер для карт своими руками

Лайфхак — портативный картридер

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

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

При разборе оказалось, что штатный картовод моего рабочего компьютера (Ginzzu GR-139UR) подключен к двум портам USB на материнской плате через двухрядный шштырьковый разъём. При этом один порт выводится на внешний разъём USB на лицевой стороне картовода, а второй используется для подключения контроллера карт памяти картовода (как раз он отвечает в картоводе за чтение всяких SD/CF/MicroSD и прочих карт).

То есть, всё, что нам нужно, чтобы обеспечить портативность нашего картовода, — это переделать разъём для подключения к USB-портам таким образом, чтобы контроллер карт памяти можно было подключить напрямую к стандартному USB-порту (второй USB-порт можно не подключать). Стандартная распиновка USB-разъёма показана на рисунке слева.

Далее я взял обломок нужной длины от разъёма IDE, стандартный USB-разъём (вилка A) от сломанной флешки и с помощью паяльной станции и термоклея соорудил вот такую конструкцию:

Теперь, соединив эту конструкцию с разъёмом картовода я могу подключать картовод к стандартному USB-порту ноутбука, а отключив её от разъёма, — могу снова подключить картовод напрямую к материнке стационарного компа:

На этом на сегодня всё, надеюсь эта конструкция поможет сэкономить время, нервы и деньги ещё кому-нибудь кроме меня.

Источник

LPCXpresso Урок 11. USB+SPI. Делаем картридер.

Курс для новичков продолжается ознакомлением с 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;

На первый взгляд может показаться сложной система задания частоты шины 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кБайт/с.

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

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

Источник

USB Micro SD Card Reader или универсальная флешка своими руками

Продолжаю цикл обзоров, где для достижения конечной цели нужно немного поработать руками. Героем сегодняшнего обзора стал 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: чуть не забыл. на фотографиях не видно, но в «прищепке» карта памяти, разумеется, съёмная.

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

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

Источник

Оцените статью
Своими руками