Подключение sd карты к ардуино. Xiaomi не видит карту памяти

Вы хотите использовать карту MicroSD в качестве реального расширения памяти и устанавливать приложения на нее? Для этого вам нужно отформатировать её как внутреннюю память. На большинстве телефонов это сделать достаточно просто, но, к сожалению, некоторые производители, такие как Sony, LG или Samsung, не обладают такой функцией по умолчанию. Но если ваш смартфон оснащен Android Marshmallow или новее, то вы можете воспользоваться командной строкой. Правда после этого избегайте обновлений Андроид. Как объединить память грамотно, мы расскажем в этой статье.

Перейти:

Простой способ

Если вам повезет, ваш смартфон позволит вам сделать это, без подключения его к ПК. Этот метод, скорее всего, будет единственной надеждой, если вы используете более новую версию Android (7.0 Nougat или 8.0 Oreo). Вот как проверить:

  • Установите SD-карту в телефон Android и дождитесь ее распознавания
  • Откройте Настройки> Храненилище
  • Коснитесь имени вашей SD-карты.
  • Коснитесь трех вертикальных точек в правом верхнем углу экрана.
  • Нажмите «Настройки» .
  • Выберите Форматировать как внутреннюю память .
  • Нажмите «Очистить и форматировать»
  • Затем Android предложит перенести данные

Если ваш смартфон не позволяет вам это делать, процесс становится более сложным. Мы перейдем к нему ниже.

Что делать, если ваш телефон не позволяет вам форматировать microSD в качестве внутренней памяти

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

Точные шаги варьируются в зависимости от версии Android вашего телефона. Этот метод хорошо cработал с Android 6.0 Marshmallow и Android 8.0 Oreo, однако мы столкнулись с трудностями на Android Nougat.

Для телефонов, использующих Android 6.0 Marshmallow

Когда карта MicroSD отформатирована как внутренняя память, приложения могут быть полностью сохранены на ней. Это означает, что если вы загружаете приложение общим размером 2 ГБ, тогда на SD-карте должно быть 2 ГБ места. Если, однако, карта MicroSD отформатирована только как резервная — памяти не хватит, как пишет PLATYPUS_DIARRHEA в Reddit.

Просто потому, что параметр меню невидим, это не значит, что он не работает. Через несколько дней после публикации в Reddit стало известно, что в командной строке можно также отформатировать карту MicroSD как внутреннюю память в Galaxy S7. Мы успешно протестировали инструкции с Samsung Galaxy S7, Sony Xperia Z5 и LG G4, работая под управлением Android 6.0 Marshmallow.

Все три смартфона работают с завода или после обновления с Android 6.0 Marshmallow и имеют слот для карт MicroSD. Кроме того, отсутствует опция меню для форматирования карты MicroSD как внутренней памяти. Функция доступна только в HTC One A9 и в Motorola на всех смартфонах Moto.

Почему Samsung, LG и Sony спрятали этот пункт? Я подключил каждый из трех смартфонов к компьютеру, и каждый из них имел одну карту MicroSD.

Затем я ввел в команды, описанные в своем блоге. Как только вы откроете окно командной строки и подключите смартфон, вы можете ввести первую команду:

  • adb shell

Теперь командная строка готова к запуску системных команд на вашем смартфоне. В этом случае мы хотим отформатировать SD-карту или её часть в качестве внутренней памяти. Даже если Sony, Samsung и LG откажут нам в такой возможности в графическом интерфейсе пользователя, мы все равно можем выполнить эту команду через консоль. Сначала, однако, нам нужен идентификатор SD-карты. Узнать его можно следующей командой:

  • sm list-disks

В моем случае диск называется 179.64 . Возможно, у вас он другой. Обратите внимание на точный идентификатор. В следующей команде мы будем форматировать и разбивать карту MicroSD. Ваш контент будет удален. Если на карте есть важные файлы, скопируйте их на другой диск или в компьютер. Если вы хотите постоянно держать карту MicroSD в смартфоне, вы можете теперь разбить всю вашу память. Для этого введите:

  • sm partition disk:179,64 private

Операция занимает несколько секунд или минут, в зависимости от емкости карты памяти. Если вы хотите использовать лишь определенный процент, чтобы его могли читать другие устройства, вы должны исключить его из личного раздела. Команда разделения 50:50 выглядит так:

  • sm partition disk:179,64 mixed 50

Это конец руководства Пола О’Брайена, но не конец работы. Если вы теперь хотите использовать переразмеченную память, вы также должны перенести приложения и данные. Это можно сделать через раздел «Хранилище» в меню настроек Android. Выберите карту MicroSD, затем перейдите в верхнюю правую часть меню и нажмите «Переместить данные» . Вы не можете выбрать этот пункт меню перед разделением.

Теперь все загруженные приложения полностью запишутся на карту MicroSD. Только системные приложения и обновления используют внутреннюю память. Это означает, что вы никогда не получите сообщение об ошибке из-за нехватки места.

Смартфоны с Android Oreo

Недавние обновления для Android немного изменили правила, но по-прежнему можно использовать этот метод с ADB. Просто начните работу с ADB по методу выше, но после ввода shell adb вам будет предложено установить определенные значения.

Введите следующие строки, чтобы разблокировать возможность форматирования карт microSD в качестве внутреннего хранилища на вашем телефоне:

G8141:/ $ sm set-force-adoptable true
G8141:/ $ sm list-disks
— disk:179,0
G8141:/ $ sm partition disk:179,0 private
G8141:/ $ sm set-force-adoptable false
G8141:/ $ exit


Мы проверили этот метод на Sony Xperia XZ Premium под управлением Android 8.0 Oreo, и это сработало. На скриншотах ниже вы можете увидеть 16-гигабайтную карту microSD, установленную в качестве внутренней памяти:

Проблемы с обновлениями системы и Nougat

Некоторые читатели сообщили о трудностях при установке обновлений системы в Android 6.0 после использования вышеописанных методов. Обновление для Android 7.0 Nougat не представляется возможным после установки MicroSD в качестве внутренней памяти. Наши тестовые устройства с Android 7.0 Nougat, даже не реагируют на команды консоли, показанные выше.

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

Удалите ненужные приложения и верните данные во внутреннюю память. Затем отформатируйте карту MicroSD как съемный носитель. Только тогда вы сможете безопасно установить обновление для Android.

В чем подвох?

Карты MicroSD работают не так быстро, как встроенная память смартфона. Поэтому не тратьте деньги на более дешевые, а вместо этого покупайте себе карты памяти с разумной пропускной способностью чтения. Extreme Pro и MicroSD от Sandisk оказались, по нашему мнению, лучшими по соотношению цена/качество. При пропускной способности записи 74 Мбайт/с вы не должны испытывать задержек. Такие карты лучше всего подходят для установки в качестве внутренней памяти

Интересно, что только LG G4 смог правильно прочитать расширенную память. Samsung показал неестественно большое количество занятой памяти, а память Sony была даже отрицательной. Тем не менее, у нас не было никаких осложнений, и даже когда мы были подключены к компьютеру, мы смогли получить доступ ко всем нашим данным должным образом, хотя мы могли видеть только общую, а не конкретную часть памяти. Трудности возникли только в случае обновления системы (см. выше).

Увеличение объема памяти: полный успех

Мы подвергли все описанные выше смартфоны единому тесту на выносливость. Мы установили Final Fantasy IX на всех устройствах. Размер игры составляет 1,8 ГБ. После установки легко увидеть, какая из двух видов памяти, внутренняя или SD-карта — использовалась. Во всех случаях, после установки на SD-карту, на 1,8 ГБ меньше места. Успех такой степени не может быть достигнут с SD-картами, отформатированными как внешняя память, поскольку полная миграция данных невозможна.

Сравните значения внутренней памяти и памяти SD-карты на скриншоте для подтверждения.

Что произойдет, если извлечь карту microSD?

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

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

Безопасное удаление внутренней разбитой SD-карты

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

Затем вернитесь к настройкам «Хранилище и USB-накопители» и нажмите «Переместить данные во внутреннюю память» в меню. Затем отформатируйте SD-карту, как внешнюю память. Выполните оба действия (резервное копирование и форматирование), чтобы ваши данные не могли быть утеряны, и вы сможете использовать SD-карту с другими устройствами.

В данном посте я продемонстрирую примитивный способ подключения SD карты к микроконтроллеру .

SD или может microSD?

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

Для того чтобы, не выпаивать каждый раз SD карту для проверки её на компьютере, я рекомендую использовать её младшего брата — microSD с переходником » microSD на SD» .

MicroSD ничем не отличается от обычной SD , различия только в размере. От нас требуется правильно соединить выходы микроконтроллера с переходником «microSD на SD». Данный пост применим как и для SD, так и для microSD.

Какой микроконтроллер?

В качестве микроконтроллер я буду использовать ATmega328P (или Arduino UNO ), но данный подход можно использовать для любого микроконтроллера поддерживающий протокол SPI .

Важно заметить, что данный контроллер (да и многие другие) построен на технологии CMOS. Это означает, что нулевой уровень (логический 0-ль) соответствует 0.1 В , а высокий логический уровень (логическая 1-ца) соответствует напряжению питания . Т.е. каким напряжением будет запитан микроконтроллер, то вы и получите на выходе при логической 1-цы. Если вы используете Arduino, то у вас нет возможности изменять напряжения питания контролера, это означает, что на выходе, в качестве логической единицы, у вас будет ~5 В . Что не соответствует уровню логической 1-цы SD карты, т.е. 2.7-3.6 В. Поэтому напрямую подключить SD (microSD) к разъемам микроконтроллера не получиться, придется делать небольшую развязку, в виде делителей напряжений .

Делители напряжения

Делитель напряжений будем собирать из резисторов , нам необходимо их подобрать таким образом, что бы мы могли, снять с делителя от 2.7 до 3.6 В . Это можно сделать, с помощью резисторов номиналом 1.8 кОм и 3.3 кОм . Можно использовать и другие комбинации, главное попасть в промежуток от 2.7 до 3.6 В на выходе.

В реальности делитель я сделал следующим образом, в разрез провода впаял резистор 1,8 КОм , к концу этого резистора припаял резистор для земли — 3.3 КОм . Надвинул на резисторы и оголенные участки — термоусадочную трубку.

Картинка вверху «без термоусадки «, внизу «с термоусадкой на резисторах и оголенных участках »


Что в итоге? Как подключать?

В итоге, SD карта к микроконтроллеру нужно подключить следующим образом:

P.S. выход DO подключать к делителю нет необходимости , т.к. на него мы ничего не подаем , а только получаем данные с SD карты.
P.S. в данной схеме, я не рекомендую извлекать и вставлять microSD в разъем во время работы микроконтроллера, делайте это только в обесточенном состояние.

Мы выводили картинку на дисплей с sd карточки, но в ней были упущены некоторые моменты, первый - подключение самой карточки, второй - была рассмотрена лишь часть функций библиотеки Petit FatFs , давайте остановимся на этих моментах подробнее.

Общение с карточкой возможно по одному из двух интерфейсов, SPI или SD .



Надо сказать, что SD интерфейс может работать в однобитном и четырёхбитном режимах.

Схема подключения карточки по SPI стандартная и выглядит следующим образом, не используемые выводы карточки нужно с помощью резистора 10К подтянуть к питанию.


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

Надо отметить, что при подключении по SPI карточка очень требовательна к напряжению питания и небольшая просадка питающего напряжения приводит к неработоспособности карточки, это проверено на личном опыте, по поводу SD интерфейса сказать нечего, ещё не пробовал. Это всё писал к тому, что по питанию обязательно ставить конденсаторы . Что касается дросселя, он должен быть рассчитан на ток до 100мА, но ставить его необязательно.

На схемах, изображённых выше видно, что для работы карточке необходимо 3.3 вольта, соответственно, в линиях передачи данных напряжение не должно выходить за диапазон 0 – 3.3 вольт и тут возникает вопрос, что делать если МК питается от 5 вольт?
Ответ прост, надо согласовать линии передачи данных, а сделать это можно с помощью обычного резистивного делителя.


На схеме видно, что линию MISO согласовывать не надо так, как по этой линии данные передаются от карточки к МК .
На самом деле, мало кто подключает карточку напрямую к МК, гораздо удобнее подключить к МК разъём для карточки или купить шилд с разъемом и всей необходимой обвязкой.

С подключением разобрались, давайте теперь рассмотрим как пользоваться библиотекой Petit FatFs , которая предназначена для 8-битных микроконтроллеров с малым размером памяти.

Библиотека состоит из 5 файлов:
integer.h - заголовочный файл в котором описаны основные типы данных.

diskio.h - заголовочный файл в котором объявлены прототипы низкоуровневых функций для работы с диском и статусные коды, которые они возвращают.

diskio.c - в этом файле должны быть реализованы низкоуровневые функции, изначально там "заглушки".

pffсonf.h - конфигурационный файл.

pff.h - заголовочный файл в котором объявлены прототипы функций взаимодействия с файловой системой диска.

pff.c - файл содержит реализации функций для взаимодействия с файловой системой диска.

Видно, что для того чтобы библиотека заработала необходимо реализовать низкоуровневые функции. Но если речь идет о AVR или PIC, для них сайте можно скачать пример работы с библиотекой, в котором есть файл mmc , в нем уже реализованы низкоуровневые функции. Также необходимо задать конфигурацию библиотеки в файле pff.h и написать функции необходимые для работы SPI.

Функции Petit FatFs.

FRESULT pf_mount (FATFS*) - функция монтирует/демонтирует диск. Эту функцию необходимо вызывать до начала работы с диском, если вызвать функцию с нулевым указателем диск демонтируется. Функция может быть вызвана в любой момент времени.

Параметры
FATFS* fs - указатель на объект типа FATFS, описание этой структуры можно посмотреть в файле pff.h. Нам надо всего лишь объявить переменную такого типа.

Возвращаемые значения:
FR_OK (0)
FR_NOT_READY - устройство не может быть инициализировано
FR_DISK_ERR - возникла ошибка во время чтения с диска
FR_NO_FILESYSTEM - на диске нет правильного раздела FAT

FATFS fs;//объявляем объект типа FATFS //монтируем диск if (pf_mount(&fs) == FR_OK) { //диск смонтирован, работаем с ним //демонтируем диск pf_mount(NULL); } else { //не удалось смонтировать диск }

FRESULT pf_open (const char* path) - функция открывает существующий файл. После того как файл открыт с ним можно работать, то есть читать из него и записывать в него. С открытым файлом можно работать до тех пор, пока не будет открыт другой файл. Функция может быть вызвана в любой момент времени.

Параметры
const char* path - указатель на строку, указывающую путь к файлу. Путь надо указывать полностью относительно корневой директории, разделяя директории слэшем.

Возвращаемые значения:
FR_OK (0) - возвращается в случае успешного выполнения функции
FR_NO_FILE - файл не найден
FR_DISK_ERR - ошибка диска
FR_NOT_ENABLED - диск не был смонтирован

FATFS fs;//объявляем объект типа FATFS //монтируем диск if (pf_mount(&fs) == FR_OK) { //открываем файл лежащий в корневой директории if(pf_open("hello.txt") == FR_OK) { //делаем что-то } //открываем файл лежащий в папке new if(pf_open("new/hello.txt") == FR_OK) { //делаем что-то } //демонтируем диск pf_mount(NULL); } else { //не удалось смонтировать диск }

FRESULT pf_read(void* buff, WORD btr, WORD* br) - функция читает указанное количество байт из файла и сохраняет их в буфер. Если количество прочитанных байт меньше чем указано, значит был достигнут конец файла.
#define _USE_READ 1

Параметры:
void* buff - указатель на буфер, в котором сохраняются прочитанные данные
WORD btr - количество байт, которые нужно прочитать
WORD* br - указатель на переменную, в которой хранится количество прочитанных байт.

Возвращаемые значения:
FR_OK (0) - возвращается в случае успешного выполнения функции
FR_DISK_ERR - ошибка диска
FR_NOT_OPENED - файл не был открыт
FR_NOT_ENABLED - диск не был смонтирован

FATFS fs;//объявляем объект типа FATFS BYTE buff;//буфер для чтения файла WORD br; //счетчик прочитанных байт //монтируем диск if (pf_mount(&fs) == FR_OK) { //открываем файл лежащий в корневой директории if(pf_open("hello.txt") == FR_OK) { //читаем из него 10 байт pf_read(buff, 10, &br); if(br != 10) { //если br не равно 10 //значит мы достигли конца файла } } }

FRESULT pf_write(const void* buff, WORD btw, WORD* bw) - функция позволяет записывать данные в открытый файл. Для того чтобы функция работала в файле pffconf.h надо записать
#define _USE_WRITE 1

Параметры:
void* buff - указатель на буфер, который хотим записать, нулевое значение финализирует запись
WORD btw - количество байт, которые хотим записать
WORD* bw - указатель на переменную, хранящий количество байт, которые удалось записать. Анализируя, эту переменную можно узнать был ли достигнут конец файла.

Возвращаемые значения:
FR_OK (0) - возвращается в случае успешного выполнения функции
FR_DISK_ERR - ошибка диска
FR_NOT_OPENED - файл не был открыт
FR_NOT_ENABLED - диск не был смонтирован

Из-за того, что библиотека рассчитана на микроконтроллеры с малым объемом памяти, эта функция имеет ряд ограничений:

  • нельзя создавать новые файлы, а записывать можно только в существующие
  • нельзя увеличивать размер файла
  • нельзя обновить временную метку
  • операцию записи можно начать/остановить только на границе сектора
  • файловый атрибут "только для чтения" не может запретить запись

Для того чтобы понять предпоследний пункт, надо знать, что память карточки разбита на блоки(сектора) по 512 байт и запись можно начать только с начала сектора . Таким образом если мы хотим записать 1000 байт, то первый сектор запишется полностью, а во второй запишется только 488 байт, а оставшиеся 24 байта заполнятся нулями.

Для записи в открытый файл надо выполнить следующие действия:

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

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

FRESULT pf_lseek(DWORD offset) - устанавливает указатель чтения/записи в открытом файле. Устанавливать указатель можно абсолютным или относительным смещением, для абсолютного смещения необходимо передать в функцию число
pf_lseek(5000);
для относительного, передать значение указателя на текущую позицию fs.fptr и величину смещения
pf_lseek(fs.fptr + 3000);
Для того чтобы функция работала в файле pffconf.h надо записать
#define _USE_LSEEK 1

Параметры:
DWORD offset - количество байт, на которые нужно сместить указатель.

Возвращаемые значения:
FR_OK (0) - возвращается в случае успешного выполнения функции
FR_DISK_ERR - ошибка диска
FR_NOT_OPENED - файл не был открыт

Записать данные в файл можно следующим образом.
FATFS fs;//объявляем объект типа FATFS BYTE buff;//буфер для чтения файла WORD br; //счетчик прочитанных байт //монтируем диск if (pf_mount(&fs) == FR_OK) { //открываем файл лежащий в корневой директории if(pf_open("hello.txt") == FR_OK) { //устанавливаем указатель на первый сектор pf_lseek(0); //записываем pf_write(buff, 10, &br); //финализируем запись pf_write(0, 0, &br); } }

Также оставляю тут кусок реально работающего кода, в котором используются все выше описанные функции.
#define F_CPU 8000000UL #define buff_size 10 #include #include #include "diskio.h" #include "pff.h" #include "spi.h" FATFS fs;//объявляем объект типа FATFS BYTE read_buff;//буфер для чтения файла BYTE write_buff = "hello word";////буфер для записи в файл UINT br; //счетчик прочитанных байт int main(void) { //монтируем диск if (pf_mount(&fs) == FR_OK) { //открываем файл лежащий в папке new if(pf_open("new/hello.txt") == FR_OK) { //устанавливаем указатель записи pf_lseek(0); //записываем pf_write(write_buff, buff_size, &br); //финализируем запись pf_write(0, 0, &br); //устанавливаем указатель чтения pf_lseek(0); //читаем то, что записали pf_read(read_buff, buff_size, &br); if(br != buff_size) { //если br не равно buff_size //значит мы достигли конца файла } } //демонтируем диск pf_mount(NULL); } while(1) { } }

FRESULT pf_opendir(DIR* dp, const char * path) - функция открывает существующую директорию и создает указатель на объект типа DIR, который будет использоваться для получения списка файлов открытой директории.
Для того чтобы функция работала в файле pffconf.h надо записать
#define _USE_DIR 1

Параметры:
DIR *dp - указатель на переменную типа DIR.

const char * path - указатель на строку, которая содержит путь к директории, директории разделяются слэшем

Возвращаемые значения:
FR_OK (0) - возвращается в случае успешного выполнения функции
FR_NO_PATH - не удалось найти путь
FR_NOT_READY - не удалось инициализировать диск
FR_DISK_ERR - ошибка диска
FR_NOT_ENABLED - диск не был смонтирован

//объявляем переменные FATFS fs; DIR dir; //монтируем диск pf_mount(&fs); //открываем директорию pf_opendir(&dir, "MY_FOLDER");

FRESULT pf_readdir(DIR* dp, FILINFO* fno) - функцию позволяет прочитать содержимое директории. Для этого нужно открыть директорию с помощью функции pf_opendir() и вызывать pf_readdir(). Каждый раз при вызове функция будет возвращать название объекта(папки/файла) лежащего в указанной директории. Когда она пройдется по всем объектам, вернет нулевую строку в элементе массива fno.fname.
Для того чтобы функция работала в файле pffconf.h надо записать
#define _USE_DIR 1

Параметры:
DIR *dp - указатель на переменную типа DIR, которая должна быть предварительно объявлена

FILINFO *fno - указатель на переменную типа FILINFO, которая должна быть предварительно объявлена.

Возвращаемые значения:
FR_OK - успешное завершение функции
FR_DISK_ERR - ошибка диска
FR_NOT_OPENED - не открыта директория

FATFS fs; FRESULT res; FILINFO fno; DIR dir; //монтируем диск pf_mount(&fs); //открываем директорию res = pf_opendir(&dir, MY_FOLDER); //читаем содержимое директории for(;;){ res = pf_readdir(&dir, &fno); //проверяем не возникло ли ошибок при чтении // и есть ли еще файлы в указанной директории if ((res != FR_OK) || (fno.fname == 0)){ break; } //выводим удобным способом fno.fname usart_sendStr(fno.name); usart_sendStr(/r); }

Ну и напоследок оставлю тут рабочий проект

Если ваш телефон или планшет на Android 6.0 или 7 Nougat имеет разъем для подключения карты памяти, то вы можете использовать карту памяти MicroSD в качестве внутренней памяти вашего устройства, такая возможность впервые появилась именно в Android 6.0 Marshm .

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

Использование карты памяти SD в качестве внутренней памяти

Прежде чем приступать к настройке, перенесите все важные данные с вашей карты памяти куда-либо: в процессе она будет полностью отформатирована.

Дальнейшие действия будут выглядеть следующим образом (вместо первых двух пунктов можно нажать по «Настроить » в уведомлении о том, что обнаружена новая SD-карта, если вы ее только что установили и такое уведомление отображается):

1. Зайдите в Настройки - Хранилище и USB-накопители и нажмите по пункту «SD-карта » (На некоторых устройствах пункт настроек накопителей может находится в разделе «Дополнительно », например, на ZTE).

2. В меню (кнопка справа вверху) выберите «Настроить ». Если в меню присутствует пункт «Внутренняя память », сразу нажмите по нему и пропустите пункт 3.

3. Нажмите «Внутренняя память ».

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

5. Дождитесь окончания процесса форматирования.

6. Если по завершении процесса вы увидите сообщение «SD-карта работает медленно », это говорит о том, что вы используете карту памяти Class 4, 6 и подобную - т.е. действительно медленную. Ее можно будет использовать в качестве внутренней памяти, но это отразится на скорости работы вашего Android телефона или планшета (такие карты памяти могут работать до 10 раз медленнее чем обычная внутренняя память). Рекомендуется использовать карты памяти UHS Speed Class 3 (U3).

7. После форматирования вам будет предложено перенести данные на новое устройство, выберите «Перенести сейчас » (до переноса процесс не считается завершенным).

8. Нажмите «Готово ».

9. Рекомендуется сразу после окончания форматирования карты как внутренней памяти перезагрузить ваш телефон или планшет - нажмите и удерживайте кнопку питания, затем выберите пункт «Перезагрузить », а если такой отсутствует - «Отключить питание » или «Выключить », а после выключения - снова включите устройство.

На этом процесс завершен: если зайти в параметры «Хранилище и USB накопители », то вы увидите, что место, занятое во внутренней памяти уменьшилось, на карте памяти - увеличилось, а общий объем памяти также увеличился.

Однако, в работе функции использования SD-карты как внутренней памяти в Android 6 и 7 есть некоторые особенности, которые могут сделать использование такой возможности нецелесообразным.

Особенности работы карты памяти в качестве внутренней памяти Android

Можно предположить, что когда к внутренней памяти Android объемом N присоединяется объем карты памяти M, общий доступный объем внутренней памяти должен стать равным N+M. Более того, примерно это отображается и в информации о хранилище устройства, однако по факту все работает несколько иначе:

  • Всё, что возможно (за исключением некоторых приложений, системных обновлений) будет помещаться на внутреннюю память, находящуюся на SD-карте, без предоставления выбора.
  • При подключении Android устройства к компьютеру в данном случае вы будете «видеть » и иметь доступ только к внутренней памяти на карте. То же самое и в файловых менеджерах на самом устройстве.

Как итог - после того, момента, когда SD карта памяти стала использоваться как внутренняя память, у пользователя нет доступа к «настоящей» внутренней памяти, а если предположить, что собственная внутренняя память устройства была больше чем память MicroSD, то объем доступной внутренней памяти после описываемых действий не увеличится, а уменьшится.

Форматирование карты памяти для использования в качестве внутреннего хранилища в ADB

Для Android устройств, где функция недоступна, например, на Samsung Galaxy S7, существует возможность отформатировать SD карту в качестве внутренней памяти с помощью ADB Shell.

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

Сами же необходимые команды будут выглядеть следующим образом (карта памяти должна быть подключена):

  • adb shell
  • sm list-disks (в результате выполнения этой команды обратите внимание на выданный идентификатор диска вида disk:NNN,NN - он потребуется в следующей команде )
  • sm partition disk:NNN,NN private

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

Как вернуть обычное функционирование карты памяти

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

Выберите пункт «Портативный носитель » и, следуя указаниям, выполните форматирование карты памяти.



В устройствах на микроконтроллерах для хранения больших объемов данных используется внешняя память. Если требуется хранить единицы мегабайт, то подойдут микросхемы последовательной флэш памяти. Однако для больших объемов (десятки -сотни мегабайт) обычно применяются какие-нибудь карты памяти. В настоящий момент наибольшее распространение получили 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-х битном режимах.

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