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

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

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

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

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

Схема

Используем схему из прошлого урока с подключением USB разъема и добавляем подключение карточки. Для этого нам надо собрать следующую схему:
Как сделать картридер своими руками
Можете подпаять проводки либо непосредственно к карточке, которую не жалко, либо как я воспользоваться слотом для карты. Приведённая схема одинакова как для SD так и для MMC карты. Все лишние (не показанные) выводы MMC карты остаются неподключенными.

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

Настройка SPI

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

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

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

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

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

Подробно рассматриваться не будет (Очень кстати, пока готовился курс, появилась статья от 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-картридер.

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

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

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

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

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

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

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

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

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

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

Источник

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

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

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

Схема

Используем схему из прошлого урока с подключением USB разъема и добавляем подключение карточки. Для этого нам надо собрать следующую схему:
Как сделать картридер своими руками
Можете подпаять проводки либо непосредственно к карточке, которую не жалко, либо как я воспользоваться слотом для карты. Приведённая схема одинакова как для SD так и для MMC карты. Все лишние (не показанные) выводы MMC карты остаются неподключенными.

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

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

Для первых двух пунктов обратимся за помощью к библиотеке 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 принятые данные и возвращаем их как результат работы функции.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

«Групповое» фото =)
Как сделать картридер своими руками

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

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

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

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

Источник

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

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