Как использовать карты памяти MMC/SDC Печать
Перевод сделан Microsin онлайн версия перевода   

Перевод замечательной статьи, рассказывающей про тонкости применения популярных карт памяти (MMC, SD, SDHC, SDC, miniSD, microSD) в малых встраиваемых проектах на микроконтроллерах.

Карты FLASH памяти Secure Digital Memory Card (далее сокращенно SDC) являются стандартом де-факто для расширения памяти мобильных устройств. SDC были разработаны с учетом обратной совместимости с картами памяти Multi Media Card (далее сокращенно MMC). SDC-совместимое оборудование может также использовать во многих случаях и карты MMC (причем в слот для карты SD обычного размера можно установить карту MMC). Имеются также версии карт уменьшенного посадочного размера, известные как RS-MMC, miniSD и microSD, которые функционируют точно так же, как и карты большого размера. Карты MMC/SDC имеют встроенный микроконтроллер. Управление памятью flash (очистка erase, чтение, запись, обработка ошибок и выравнивание износа ячеек - wearleveling) полностью осуществляются внутри карты памяти. Данные передаются между картой памяти и внешним управляющим контроллером (host controller) в виде блоков данных по 512 байт (минимальная единица информации карты памяти), так что карту можно рассматривать как простой стандартный привод жесткого диска с точки зрения слоев ввода-вывода верхнего уровня. В настоящее время для карт памяти применяется файловая система FAT12/16 по правилам создания разделов FDISK. Файловая система FAT32 применяется только для карт памяти высокой емкости (>= 4 гигабайта).

В этой статье рассмотрены основные знания и различные тонкости, которые нужно учитывать при использовании MMC/SDC вместе с малой встраиваемой системой (small embedded system) на микроконтроллере. Автор надеется, что эта информация окажется полезной как указания по быстрому старту людям, которые начинают использовать MMC/SDC в своих собственных самодельных проектах.

Цоколевка карт памяти

SDC/MMC contact surface

 

FatFS-mini contact

 

FatFS-micro contact

 

 

В качестве образца для подключения карты SD (или SDHC, или MMC) можно взять схему из макетной платы Olimex SAM7-EX256.

SD-SDHC-card-connect

На фотографии показана контактная поверхность карты памяти SDC/MMC (а также карт miniSD и microSD). MMC имеет 7 контактов, а SDC имеет 9 контактов, из которых два добавочных по сравнению с MMC. 3 контакта назначены для подключения питания (power supply), так что количество сигналов данных составляет 4 для MMC и 6 для SDC. Таким образом, обмен данными между хостом и картой осуществляется через синхронный последовательный интерфейс.

Рабочее питающее напряжение индицируется через регистр корректных операций (operation conditions register, OCR), который должен быть прочитан, чтобы удостовериться, что питающее напряжение находится в допустимом рабочем диапазоне. Однако, питающее напряжение может быть зафиксировано на уровне 3.0/3.3 вольта, потому что все карты MMC/SDC работают в диапазоне питающих напряжений от 2.7 до 3.6 вольта как минимум. Потребление тока на операциях записи может достигать нескольких десятков милиампер, поэтому система хоста (куда подключена карта) должна обеспечить мощность питающего напряжения 100 мА для питания карты.

Режим SPI (SPI Mode)

Этот документ описывает протокол для управления картами MMC/SDC в режиме SPI (SPI mode). Режим SPI является алтернативным вариантом функционирования, который определен для использования с MMC/SDC без специального интефейса хоста (native host interface). Протокол коммуникации для режима SPI прост в сравнении с обычным режимом работы (native operating mode). Карта MMC/SDC может быть подключена к микроконтроллеру хоста через стандартный интерфейс SPI или обычные порты ввода/вывода GPIO. Таким образом, режим SPI хорошо подходит для недорогих встраиваемых приложений. Специально нет необходимости пытаться использовать native mode с дешевым микроконтроллером, так как у него наверняка не окажется соответствующего native host interface. Для карт SDC режим SPI mode 0 определен как собственный режим SPI. Для MMC нет тайминга SPI, оба действия фиксации и сдвига заданы по фронту сигнала SCLK, однако это также работает в SPI mode 0 для режима SPI. Таким образом, режим SPI Mode 0 (CPHA=0, CPOL=0) является правильной установкой для интерфейса MMC/SDC, но режим SPI mode 3 также хорошо работает во многих случаях.

Команда (Command) и ответ (Response)

В режиме SPI mode направление данных на сигнальных линиях фиксировано и данные передаются через байт-ориентированное последовательное соединение. Фрейм команды от хоста к карте фиксирован по длине (6 байт) пакета, который показан ниже. Когда фрейм команды передается в карту, то обратно из карты передается ответ на команду (R1, R2 или R3). Поскольку передача данных тактируется от хоста по специальной линии SCLK (выход хоста, вход карты), хост должен продолжать читать байты пока идет прием любого допустимого ответа карты. Сигнал DI (вход карты, выход хоста) должен удерживаться на высоком уровне во время передачи чтения (путем передачи хостом 0xFF и получения принятых данных). Ответ от карты посылается обратно в течение времени ответа на команду command response time (NCR), от 0 до 8 байт для SDC, и от 1 до 8 байт для MMC. Сигнал CS (выборка карты) должен быть установлен в низкий уровень перед отправкой фрейма команды и удерживаться в нижнем уровне в течение транзакции (command, response и передача данных data transfer, если таковые имеются). Возможность проверки CRC в режиме SPI является опциональной (необязательной), однако поле CRC всегда требуется для для составления фрейма команды.

FatFS-cmd

Набор команд SPI (SPI Command Set)

Каждая команда выражена в сокращении типа GO_IDLE_STATE или CMD, число в индексе команды равно величине от 0 до 63. В таблице ниже описаны только команды, которые обычно испльзуют для стандартных операций чтения записи (generic read/write) и инициализации карты. Подробности по каждой команде см. в спецификации от MMCA и SDCA.

Command
Index
АргументResponseDataАббревиатураОписание
CMD0 None(0) R1 No GO_IDLE_STATE Программный сброс (Software reset).
CMD1 None(0) R1 No SEND_OP_COND Запуск процесса инициализации.
ACMD41(*1) *2 R1 No APP_SEND_OP_COND Только для карт SDC. Запуск процесса инициализации.
CMD8 *3 R7 No SEND_IF_COND Только для карт SDC V2. Проверка диапазона напряжения питания.
CMD9 None(0) R1 Yes SEND_CSD Чтение регистра CSD.
CMD10 None(0) R1 Yes SEND_CID Чтение регистра CID.
CMD12 None(0) R1b No STOP_TRANSMISSION Остановка чтения данных.
CMD16 Block
length[31:0]
R1 No SET_BLOCKLEN Изменение размера блока R/W (чтения/записи).
CMD17 Address[31:0] R1 Yes READ_SINGLE_BLOCK Чтение блока.
CMD18 Address[31:0] R1 Yes READ_MULTIPLE_BLOCK Чтение нескольких блоков.
CMD23 Number of
blocks[15:0]
R1 No SET_BLOCK_COUNT Только для MMC. Указание количества блоков для трансфера
вместе со следующей командой многоблочного чтения/записи.
ACMD23(*1) Number of
blocks[22:0]
R1 No SET_WR_BLOCK_ERASE_COUNT Только для SDC. Указание количества блоков для предварительной
(pre-erase) при последующей команде многоблочной записи.
CMD24 Address[31:0] R1 Yes WRITE_BLOCK Запись блока.
CMD25 Address[31:0] R1 Yes WRITE_MULTIPLE_BLOCK Запись нескольких блоков.
CMD55(*1) None(0) R1 No APP_CMD Начало команды ACMD.
CMD58 None(0) R3 No READ_OCR Чтение OCR.
*1:ACMD означает последовательность команд CMD55-CMD.
*2: Rsv(0)[31], HCS[30], Rsv(0)[29:0]
*3: Rsv(0)[31:12], Supply Voltage(1)[11:8], Check Pattern(0xAA)[7:0]

Ответ SPI (SPI Response)

FatFS-cresp

Имеется три формата ответа на команду, R1, R2 и R3, в зависимости от индекса команды. Байт ответа R1 возвращается в на большинство команд. Битовые поля ответа R1 показаны на рисунке, значение 0x00 означает успешное завершение команды. Когда происходит любая ошибка, будет установлен соответствующий бит статуса в ответе. Ответ R3 (R1 и завершающее 32-битное значение OCR) применяется только для CMD58.

Некоторым командам нужно больше времени NCR и они отвечают R1b. Это ответ R1, за которым идет флаг занятости (DO удерживается в низком уровне, пока продолжается внутренний процесс). Контроллер хоста должен ждать окончания процесса, пока DO не перейдет в состояние высокого уровня (пока не будет принято 0xFF).

Процедура инициализации в режиме SPI

После сброса после включения питания карта MMC/SDC входит в рабочий режим native (это не SPI). Чтобы перейти в режим SPI, нужно провести следующую процедуру, наподобие показанной на рисунке.

FatFS-sdinit

Включение питания (установка карты в слот)

После того, как напряжение питания возрастет до 2.2 вольт, нужно подождать как минимум милисекунду. Установите тактовую частоту SPI (clock rate) между 100 кГц и 400 кГц. Установите сигналы DI и CS в сотояние высокого уровня, и выведите 74 или большее количество импульсов тактов на сигнале SCLK. Карта войдет в режим работы native, и будет готова к приему команд native.

Программный сброс (Software Reset)

Пошлите команду CMD0 с установленным в низкий уровень сигналом CS для сброса карты. Карта при активной выборке CS (активный уровень 0) успешно примет команду CMD0. Если сигнал CS в низком уровне, то карта войдет в режим SPI и ответит R1 с установленным битом ожидания (In Idle State bit 0x01). Поскольку CMD0 должна быть отправлена как команда native, то поле CRC должно содержать корректное значение. Когда карта войдет в режим SPI, функция CRC будет запрещена и CRC не будет проверяться картой, поэтому подпрограмма передачи команды может передавать жестко закодированное значение CRC, которое будет достоверно только для команды CMD0 и для команды CMD8 с аргументом ноль. Опция CRC может быть также переключена командой CMD59.

Инициализация

В стотоянии ожидания (idle state) карта принимает только команды CMD0, CMD1, ACMD41,CMD58 и CMD59. Все другие команды будут отброшены. В этот момент прочитайте регистр OCR и проверьте рабочее напряжение карты - оно должно быть в допустимом диапазоне. Если напряжение питание от системы находится не в рабочем диапазоне, работа с картой должна быть запрещена. Имейте в виду, что все карты работают при напряжении питания как минимум в диапазоне от 2.7 до 3.6 вольт. Карта начнет свою инициализацию, когда будет принята команда CMD1. Для определения окончания процесса инициализации, контроллер хоста должен отправить команду CMD1 и проверить ответ в ожидании окончания инициализации. Когда карта будет успешно инициализирована, бит ожидания (In Idle State bit) в ответе R1 будет очищен (R1 изменится с 0x01 на 0x00). Процесс инициализации может занять сотни милисекунд (карты большого объема может потребовать больше времени), так что объем карты может быть учтен для определения таймаута ожидания. После того, как бит In Idle State будет очищен, могут быть восприняты обычные команды чтения/записи.

Поскльку для SDC рекомендуется использовать ACMD41 вместо CMD1, попробуйте сначала использовать команду ACMD41, и если она будет отклонена, то используйте CMD1 - это идеальный способ поддержать оба типа карт.

Тактовая частота SPI должна быть изменена на максимально быструю, как только возможно - для того, чтобы достигнуть максимальной скорости чтения/записи. Поле TRAN_SPEED в регистре CSD показывает максимальную тактовую частоту карты. В большинстве случаев максимальная тактовая частота 20 МГц для карт MMC и 25 МГц для карт SDC. Имейте в виду, что тактовая частота может быть зафиксирована на значении 20/25 МГц в режиме SPI, потому что нет использования открытого стока для тактов, которое ограничивает максимальную тактовую частоту.

Начальная длина блока чтения/записи может быть установлена в значение 1024 для карт на 2 гигабайта, поэтому размер блока должен быть переинициализирован в значение 512 командой CMD16 для работы с файловой системой FAT.

Как использовать SDC Ver2 и карты высокой емкости

После того как карта войдет в состояние ожидание по команде CMD0, передайте команду CMD8 с аргументом 0x000001AA и корректной CRC перед началом процесса инициализации. Если команда CMD8 будет отброшена с ошибкой недопустимой команды (illigal command error 0x05), то карта версии SDC V1 или MMC. Когда команда CMD8 принята, то будет возвращен ответ R7 (R1(0x01) и завершающие 32 бита данных). Младшие 12 бит в возвращаемой величине 0x1AA означают, что карта версии SDC V2 и может работать в диапазоне напряжения от 2.7 до 3.6 вольт. Если это не так, то работа с картой должна быть запрещена. Затем запустите инициализацию командой ACMD41 с установленным HCS (бит 30). После завершения инициализации прочитайте регистр OCR и проверьте CCS (бит 30). Если он установлен, последующие операции чтения/записи данных, которые описаны далее, будут отправляться с командой адреса блока вместо адреса байта. Размер блока всегда фиксирован на величине 512 байт.

Чем отличается использование карт SD от карт SDHC

Карты SD поддерживают размер максимум 2048 мегабайта (2 гигабайта), а карты SDHC имеют емкость намного больше, есть карты SDHC размером до 32 гигабайт. Аппаратно подключение карт SD и SDHC ничем не отличается, использутся те же ножки и сигналы. Разница только в инициализации карты, и в передаче адреса блока данных. В картах SD адресация побайтная (передается адрес начала блока), а в картах SDHC адресация посекторная (передается номер сектора), размер сектора 512 байта. Адрес в любом случае 32-битный и для карт SD, и для карт SDHC. Секторный адрес может быть получен из байтового адреса сдвигом на 9 вправо (деление на 512). И наоборот, байтовый адрес может быть получен из секторного сдвигом на 9 влево (умножение на 512). Пример работы с картами SD и SDHC под управлением библиотек EFSL/FatFS см. в разделе Ссылки.

Передача данных

На рисунке показан пакет данных (Data Packet) и ответ данных (Data Response)

FatFS-data

В транзакции передачи данных один или большее количество блоков данных будет отправлено/принято после ответа на команду (command response). Блок данных передается как пакет данных, который состоит из токена (Token), блока данных (Data Block) и CRC. Формат пакета данных показан на рисунке, где видны три токена данных. В качестве токена конца транзакции (Stop Tran token), который означает окончание записи нескольких блоков, выступает одиночный байт без блока данных и CRC.

Чтение одного блока, одиночное чтение (Single Block Read)

FatFS-rs

Аргумент указывает размещение начала чтения в единицах либо байтов, либо блоков. Адрес сектора, указываемый на верхнем слое, должен быть преобразован по правильной шкале единиц. Когда команда CMD17 принята, начинается операция чтения, и прочитанный блок данных будет отправлен контроллеру хоста. После того, как будет детектирован допустимый токен данных, контроллер хоста примет следующее за ним поле данных и два байта CRC. Байты CRC должны быть сброшены, даже если они не нужны. Если во время операции чтения произошла любая ошибка, тоо будет возвращен токен ошибки (error token) вместо пакета данных.

Многоблочное чтение (Multiple Block Read)

FatFS-rm

Команда Multiple Block Read читает сразу несколько блоков последовательно друг за другом по указанному адресу. Когда количество передаваемых блоков в этой команде не указано, транзакция начнется как чтение нескольких блоков с неопоеделенным завершением (open-ended multiple block read), и операция чтения будет продолжаться до тех пор, пока не будет остановлена командой CMD12. Байт, принятый сразу за командой CMD12, является пустым заполняющим (stuff byte), и он должен быть отброшен перед приемом ответа на команду CMD12.

Запись одного блока, одиночная запись (Single Block Write)

FatFS-ws

Когда команда записи принята, контроллер хоста отправляет в карту пакет данных после промежутка в байт (byte space). Формат пакета тот же самый, что и у команды Block Read. Поле CRC может содержать в себе любое (даже недостоверное) значение, за исключением того случая, когда работа CRC разрешена. Когда пакет данных отправлен, то сразу за ним следует ответ карты Data Response. За data response идет флаг занятости (busy flag), который нужен для поддрержки операции записи (карте нужно некоторое время, чтобы осуществить запись в свою память). Многие карты не могут поменять размер блока записи, и в этом случае он фиксирован на значении 512.

В соответствии с принципом режима SPI сигнал CS должен удерживаться в активном состоянии (лог. 0), однако имеется исключение из этого правила. Когда карта занята, контроллер хоста может убрать выборку CS, чтобы освободить шину SPI, которая может использоваться для других устройств SPI. Карта снова опустит сигнал DO в лог. 0, когда карта будет выбрана, во время работы внутренней операции записи. Поэтому предварительная проверка занятости (перед командой и пакетом данных) вместо ожидания после команды записи может устранить ненужные потери времени. В дополнение к инициализации внутреннего процесса после подтверждения байтом data response, это означает необходимость восьми тактов для иницализации внутренней операции записи. Состояние сигнала CS во время этих 8 тактов не имеет значения, так как может быть сделано освобождение шины, описанное далее.

Многоблочная запись (Multiple Block Write)

FatFS-wm

Команда Multiple Block Write записывает несколько блоков последовательно друг за другом, начиная с указанного адреса. Когда количество передаваемых блоков не указано перед этой командой, транзакция начнется как многоблочная запись с неопределенным завершением (open-ended multiple block write), при которой запись будет продолжаться, пока не будет прервана токеном остановки транзакции (Stop Tran token). Флаг занятости появится на сигнале DO в байте после токена Stop Tran. Для SDC транзакция многоблочной записи должна быть завершена токеном Stop Tran назависимо от того, как была начата транзакция - с заданным количеством блоков или неопределенным (pre-defined или open-ended).

Чтение регистров CSD и CID

Чтение CSD и CID происходит так же, как и Single Block Read, за исключением того, что отсутствует поле длины блока. CSD и CID отправляются хосту как 16-байтовый блок данных. Подробности по CMD, CID и OCR см. в спецификации MMC/SDC.

Обзор ненагруженной шины и горячего подключения карты

FatFS-dip

Любые сигналы, которые могут оказаться в подвешеном (ненагруженном) состоянии, должны быть притянуты к низкому или высокому уровню с помощью резистора. Это обычное правило проектирования для устройств с полевыми транзисторами (MOS devices). Поскольку сигналы DI и DO в обычном состоянии находятся в высоком уровне, они должны быть подтянуты через резисторы к положительной шине питания (pulled-up). В соответствие со спецификацией SDC/MMC рекомендуется использовать номиналы pull-up резисторов от 50 кОм до 100 кОм. однако сигнал тактирования SCLK не упоминается в спецификации SDC/MMC, потому что он всегда является выходом контроллера хоста. Если возможен случай нахождения этого сигнала в третьем состоянии, то он должен быть подтянут в свое нормальное низкое логическое состояние.

MMC/SDC поддерживают "горячее" (при включенном питании) подключение и отключение, однако схема хоста должна быть соответствующим образом спроектирована, чтобы избежать некорректного функционирования. Например, если напряжение питания системы хоста (Vcc) напрямую подключено к сокету карты, то произойдет провал напряжения Vcc в момент подключения карты - из-за тока зарядки конденсатора фильтра, встроенного в карту. Этот момент иллюстрирует осциллограмма 'A' на рисунке - напряжение проваливается на 600 миливольт. Этого провала достаточно, чтобы мог сработать триггер детектора пропадания напряжения питания, который имеется во многих микроконтроллерных системах (brown out detector). Осциллограмма 'B' показывает, как установка индуктивности блокирует бросок тока, и спад напряжения уменьшается до 200 миливольт. Конденсатор с низкими потерями (low ESR), такой как OS-CON, может еще лучше погасить скачок напряжения, как показано на осциллограмме 'C'. Однако low ESR конденсатор может вызвать генерацию в микросхеме стабилизатора LDO (Low Drop Out, аналоговый стабилизатор с малым допустимым напряжением падения на нем).

Обзор конфигурации с несколькими ведомыми устройствами (Multi-slave)

FatFS-do diag

На шине SPI каждое ведомое (slave) устройство должно быть выбрано отдельным сигналом CS, благодаря чему к одной шине SPI может быть подключено множество устройств. Стандартное ведомое устройство SPI управляет/освобождает свой сигнал DO асинхронно по сигналу CS, чтобы сигнал DO мог быть совместно использован нашине SPI несколькими устройствами. Однако MMC/SDC управляют/освобождают сигнал DO синхронно с SCLK. Это означает, что имеется возможность конфликта на шине MMC/SDC и любого другого ведомого устройства SPI, подключенного к той же шине. На рисунке показано время управления/освобождения MMC/SDC (сигнал DO подтянут к уровню 1/2 Vcc, чтобы было видно состояние шины). Таким образом, чтобы MMC/SDC освободола сигнал DO, устройство мастера (контроллер хоста) должен отправить дополнительный байт после того, как убран сигнал CS с карты.

Оптимизация прозводительности записи (Write Performance)

Большинство MMC/SDC реализованы на основе NAND Flash Memory. Память NAND flash еффективнее по стоимости, и может быстрее читать/записывать большой объем данных, но с другой стороны, эта память неэффективна, если нужно перезаписать только часть данных. Обычно память flash требует очистить уже записанные данные перед тем как можно записать туда новые данные, и минимальная единица блока очистки (так называемый erase block) больше, чем размер блока записи. Обычная память NAND flash меет размер блока 512/16K байт для операции записи/очистки, и последние карты большого объема имеют чип с большим размером блока (2K/128K). Это означает, что в карте реализована перезапись всего блока очистки, даже если нужно записать только один сектор (512 байт).

Тест на быстродействие (Benchmark)

Производительность чтения/записи некоторых карт MMC/SDC с недорогим 8-битным MCU (ATmega64, тактовая частота 9.2 МГц) была протестирована в предположении использования встроенной системы с ограниченным размером памяти. Из-за размера памяти операции write() и read() работают за один раз с блоком 2048 байт. Получен следующий результат: запись 77 кбайт/сек, чтение 328 кбайт/сек с картой памяти 128 мегабайт SDC, запись 28 кбайт/сек, чтение 234 кбайт/сек с картой памяти 512 мегабайт SDC и запись 182 кбайт/сек, чтение 312 кбайт/сек с картой памяти 128 мегабайт MMC.

Таким образом, быстродействие записи хуже всего была на карте 512 мегабайт SDC, в три раза меньше, чем у 128 мегабайт SDC. Обычно производительность чтения/записи устройств mass storage увеличивается пропорционально плотности записи, однако иногда появляется противоположная тенденция, как в данном случае. Карта MMC показывает в несколько раз лучшую производительность, чем SDC. Позже были протестированы некоторые SDC от различных поставщиков, и было обнаружено, что PQI SDC были быстрее, чем Hitachi MMC, однако Panasonic и Toshiba были наихудшими в плане быстродействия.

Размер блока очистки (Erase Block Size)

С целью анализа подробностей операции записи время занятости (количество циклов опроса) после отправки записываемых данных выводилось в консоль низкоуровневой функцией записи диска. Несколько чисел в строке показывают блоки данных и токен Stop Tran, которые были выданы в транзакции записи нескольких блоков (multiple block write transaction).

В результате анализа обнаружилось различие внутреннего процесса записи между 128 мегабайт SDC и 512 мегабайт SDC. 128 мегабайт SDC перезаписывают erase block по окончании транзакции mutiple block write. 512 мегабайт SDC похоже имеют буфер 4K байт, и перезаписывают erase block на каждой границе 4K байт. Поэтому нельзя сравнить эти карты напрямую, однако время обработки перезаписи составило 3800 циклов для карт 128 мегабайт SDC, и 30000 циклов для 512 мегабайт SDC, что в 8 раз больше. Судя по результатам, 128 мегабайт SDC использует чип с блоком меньше, чем у чипа 512 мегабайт SDC, либо используется чип MLC. Само собой, большой блок очистки ухудшает произоводительность при частичных перезаписях блока. На картах 512 мегабайт SDC быстро работает только область памяти 512K байт в начале памяти. Это можно определить по времени записи в процедуре close(). Возможно, что эта верхняя область имеет специальную организацию для размещения каталога FAT - для ускорения работы файловой системы.

Улучшение производительности при записи

FatFS-appnotes-f6

Чтобы избежать "бутылочного горлышка" и увеличить скорость записи, нужно использовать как можно большее количество блоков на одну транзакцию записи. Конечно, все слои между приложением и носителем данных должны поддерживать возможность multiple sector write. Для низкоуровневой функции записи SDC/MMC нужно знать количество секторов записи до начала самой записи, чтобы инициировать эффективный внутренний процесс записи. Этот метод называется `pre-defined multiple block write' (предварительно заданный размер блока записи). Команды предварительного определения отличаются между MMC (CMD23) и SDC (ACMD23).

Карты памяти изначально разбиты на разделы и отформатированы для выравнивания allocation unit (кластер) на границу erase block. Когда карта заново разбивается на разделы или переформатируется на устройстве, которое ничего не знает о структуре MMC/SDC (это может быть обыкновенный компьютер PC), то эта оптимизация ломается, и производительность записи может быть потеряна. Я пробовал переформатировать 512MB SDC в системе FAT32 на PC, и скорость записи, измеренная на копировании файла, снизилась. Таким образом, переформатирование карт лучше делать на специальных устройствах, совместимых с внутренней структурой MMC/SDC, а не на PC.

[Ссылки]