Как использовать карты памяти 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

Когда карта подключена native-способом (не через SPI), то все ответы на команду передаются через специальный сигнал команд CMD, и для обычной карты (SDC/MMC/SDHC) имеются типы ответов R1, R1b, R2, R3, R7. Когда карта подключена через SPI, то ответы передаются через сигнал выхода данных карты, и количество ответов ограничено типами R1, R1b, R2, R3. Карта SDIO имеет дополнительные типы ответов R4 и R5, для получения описания команд и ответов карт SDIO см. соответствующую спецификацию стандарта по картам SDIO.

Передача потока бит ответа всегда начинается с левого (старшего) бита для соответствующего кодового слова. Длина потока бит ответа зависит от типа ответа. Начальный бит является стартовым (он всегда равен 0), за ним идет бит, обозначающий направление передачи (для карты он равен 0). Значения, показанные как X в таблицах ниже, показывают изменяемое поле бит. Все типы ответа, кроме R3, защищены контрольной суммой CRC7. Каждое кодовое слово команды заканчивается битом окончания (всегда равен 1).

[R1 (обычный ответ на команду)]

Длина этот типа ответа составляет 48 бит (6 байт). Биты 45:40 показывают индекс команды, на которую выполнен ответ, это значение интерпретируется как двоичное число (значение от 0 до 63). Состояние карты (статус) кодируется в 32 битах (описание статуса карты см. во врезке "Card Status"). Обратите внимание, что если вовлечена передача данных в карту, то может появиться сигнал занятости на линии данных после передачи каждого блока данных (касается native-подключения карты). Хост должен проверять занятость после передачи каждого блока.

Таблица 4-29. Response R1.

Позиции бит 47 46 [45:40] [39:8] [7:1] 0
Ширина (в битах) 1 1 6 32 7 1
Значение поля 0 0 X X X 1
Описание start bit Бит передачи Индекс команды card status CRC7 end bit

[R1b]

Ответ R1b идентичен ответу R1 с опциональным сигналом занятости, передаваемым по линии данных выхода карты. Карта может оказаться занятой внутренней операцией после получения команд, в зависимости от её состояния перед приемом команды. Хост должне проверять занятость карты на каждом ответе карты.

[R2 (содержимое регистров CID, CSD)]

Длина этого ответа составляет 136 бит. Содержимое регистра CID (идентификатор карты) посылается в ответ на команды CMD2 и CMD10. Содержимое регистра CSD (параметры карты) передается в ответ на команду CMD9. Передаются только биты [127...1] регистров CID и CSD, зарезервированный бит [0] этих регистров заменяется конечным битом ответа.

Таблица 4-30. Response R2.

Позиции бит 135 134 [133:128] [127:1] 0
Ширина (в битах) 1 1 6 127 1
Значение поля 0 0 111111 X 1
Описание start bit Бит передачи Зарезервировано Содержимое регистра CID или CSD, включая их внутреннюю контрольную сумму CRC7. end bit

[R3 (регистр OCR)]

Длина этого ответа составляет 48 бит. Содержимое регистра OCR (operation conditions register) посылается в ответ на команду ACMD41.

Таблица 4-31. Response R3.

Позиции бит 47 46 [45:40] [39:8] [7:1] 0
Ширина (в битах) 1 1 6 32 7 1
Значение поля 0 0 111111 X 1111111 1
Описание start bit Бит передачи Зарезервировано Регистр OCR Зарезервировано end bit

[R6 (Published RCA)]

Для карты, подключенной через SPI, этот тип ответа не используется, потому что в этом режиме подключения команда CMD3 не поддерживается.

Длина ответа R6 составляет 48 бит. Биты 45:40 показывают индекс команды, на которую произведен ответ - в этом случае индекс будет равен 000011 (вместе с битом 5 битов статуса это будет означать = CMD3). 16 MSB старших бит в поле аргумента (Argument) используются для передачи номера Published RCA.

Таблица 4-32. Response R6.

Позиции бит 47 46 [45:40] [39:8] поле Argument [7:1] 0
Ширина (в битах) 1 1 6 16 16 7 1
Значение поля 0 0 X X X X 1
Описание start bit Бит передачи Индекс команды (000011) Новый Published RCA [31:16] карты [15:0] биты Card Status: 23, 22, 19, 12:0 CRC7 end bit

[R7 (Card interface condition)]

Это состояние интерфейса карты, длина ответа 48 бит. Поддерживаемое напряжение карты посылается в ответ на команду CMD8. Биты 19..16 показывают диапазон рабочих напряжений, которые может поддерживать карта. Карта, которая приняла предоставленное напряжение, вернет ответ R7. В этом ответе карта эхом передаст обратно диапазон напряжения и маску битов проверки (check pattern), переданный в аргументе команды.

Таблица 4-33. Response R7.

Позиции бит 47 46 [45:40] [39:20] [19:16] [15:8] [7:1] 0
Ширина (в битах) 1 1 6 20 4 8 7 1
Значение поля 0 0 001000 00000h X X X 1
Описание start bit Бит передачи Индекс команды Зарезервировано Voltage Accepted Обратное эхо check pattern CRC7 end bit

В таблице 4-34 показан формат поля 'voltage accepted' в R7.

Таблица 4-34. Поле Voltage Accepted в ответе R7.

Voltage Accepted Значения напряжения
0000b Не определено
0001b 2.7 - 3.6V
0010b Зарезервировано для диапазона низких напряжений питания
0100b Зарезервировано
1000b
Другие значения Не определено

Ответ формата R1 содержит 32-битное поле, которое называется card status (состояние карты). Это поле предназначено для передачи информации о состоянии карты (которая может быть сохранена в локальном регистре статуса) к хосту. Если не указано нечто иное, записи в статусе всегда относятся к ранее выданной команде. Таблица 4-35 определяет различные записи статуса. Поля типа (Type) и условия очистки (Clear Condition) обозначены сокращениями следующим образом:

Type (тип)

E: бит ошибки (Error).
S: бит статуса (Status).
R: детектирована и установлена информация для актукального ответа на команду.
X: детектирована и установлена информация во время выполнения команды. Хост может получить статус выдачей команды с ответом R1.

Clear Condition (условие очистки)

A: информация соответствует текущему состоянию карты.
B: всегда относится к предыдущей команде. Прием допустимой команды очистит это (с задержкой на одну команду).
C: очищено чтением.

Таблица 4-35. Card Status.

Биты Идентификатор Type Значение Описание Clear Condition
31 OUT_OF_RANGE E R X 0: нет ошибки,
1: ошибка
Аргумент команды вышел за пределы допустимого диапазона для этой карты. C
30 ADDRESS_ERROR E R X 0: нет ошибки,
1: ошибка
Ошибочно выровненный адрес, который не соответствует длине блока, который использовался в команде. C
29 BLOCK_LEN_ERROR E R X 0: нет ошибки,
1: ошибка
Длина передаваемого блока не допустима для этой карты, или количество передаваемых байт не соответствует длине блока. C
28 ERASE_SEQ_ERROR E R 0: нет ошибки,
1: ошибка
Произошла ошибка в последовательности команд стирания. C
27 ERASE_PARAM E R X 0: нет ошибки,
1: ошибка
Произошел недопустимый выбор записываемых блоков для стирания. C
26 WP_VIOLATION E R X 0: не защищена,
1: защищена
Устанавливается, когда хост попытался выполнить запись в защищенный блок либо на временно защищенную от записи, либо на постоянно защищенную от записи карту. C
25 CARD_IS_LOCKED S X 0: карта не заблокирована,
1: карта заблокирована
Если установлен, то сигнализирует, что карта заблокирована хостом. A
24 LOCK_UNLOCK_FAILED E R X 0: нет ошибки,
1: ошибка
Устанавливается, когда была детектирована ошибка пароля в команде блокировки/разблокировки карты. C
23 COM_CRC_ERROR E R 0: нет ошибки,
1: ошибка
Ошибка CRC предыдущей команды. B
22 ILLEGAL_COMMAND E R 0: нет ошибки,
1: ошибка
Команда недопустима для текущего состояния карты. B
21 CARD_ECC_FAILED E R X 0: успешное завершение,
1: ошибка
Была применена внутренняя ECC, но произошла ошибка для корректных данных. C
20 CC_ERROR E R X 0: нет ошибки,
1: ошибка
Ошибка внутреннего контроллера карты. C
19 ERROR E R X 0: нет ошибки,
1: ошибка
Во время выполнения операции произошла общая или неизвестная ошибка. C
18 Зарезервировано
17
16 CSD_OVERWRITE E R X 0: нет ошибки,
1: ошибка
Произошла одна из следующих ошибок:
- Секция только для чтения CSD не соответствует содержимому карты.
- Попытка реверса копирования (копирование в место источника), или ошибка защиты от записи.
C
15 WP_ERASE_SKIP E R X 0: нет защиты от записи,
1: защита от записи
Устанавливается, когда была очищена только часть адресного пространства - из-за наличия защищенных от записи блоков, или очищалась карта, временно или постоянно защищенная от записи. C
14 CARD_ECC_DISABLED S X 0: разрешено,
1: запрещено
Была выполнена команда без внутреннего ECC. A
13 ERASE_RESET S R 0: очищено,
1: установлено
Была очищена последовательность стирания перед выполнением, потому что была принята команда выхода из последовательности стирания. C
12:9 CURRENT_STATE S X 0: idle
1: ready
2: ident
3: stby
4: tran
5: data
6: rcv
7: prg
8: dis
9..14:зарезервировано
15: зарезервировано для режима I/O
Состояние карты, когда принимается команда. Если выполнение команды приводит к изменению состояния карты, это увидит хост в отвт на следующую команду. Эти 4 бита интерпретируются как двоичное число со значением в диапазоне от 0 до 15. B
8 READY_FOR_DATA S X 0: нет готовности,
1: готовность к данным
Соответствует сигнализации по шине, что буфер пуст. A
7:6 Зарезервировано
5 APP_CMD S R 0: запрещено,
1: разрешено
Карта ожидает ACMD, или показывается, что команда была интерпретирована как ACMD. C
4 Зарезервировано для карты SD I/O.
3 AKE_SEQ_ERROR (специфика приложения SD Memory Card) E R 0: нет ошибки,
1: ошибка
Ошибка в последовательности аутентикации. C
2 Зарезервировано для команд, специфичных для приложения.
1:0 Зарезервировано для режима тестирования производителя.

Для каждой команды, на которую приходит ответ R1, в следующей таблице определены биты в статусе, на которые влияет эта команда. Символ 'x' в таблице обозначает, что бит ошибки/статуса может быть установлен в ответ на соответствующую команду.

Таблица 4-36. Взаимосвязь между полями статуса карты и командами.

CMD#  Формат ответа R1, номера бит статуса.
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12:9  8   5 
3(1)                 x x     x             x    
6(2) x           x   x x x x x x x         x    
7         x x x x x x x x x x x x x x x x x  
12 x x       x x   x x x x x x x     x   x    
13 x x     x x x x x x x x x x x x x x   x x  
16     x   x x x x x x x x x x x x x x x x    
17 x x     x x x x x x x x x x x x x x x x    
18 x x     x x x x x x x x x x x x x x x x    
24 x x x   x x x x x x x x x x x x x x x x x  
25 x x x   x x x x x x x x x x x x x x x x x  
26         x x x x x x x x x x x x x x x x    
27         x x x x x x x x x x x x x x x x    
28 x       x x x x x x x x x x x x x x x x    
29 x       x x x x x x x x x x x x x x x x    
30 x       x x x x x x x x x x x x x x x x    
32 x     x x x x x x x x x x x x x x x x x    
33 x     x x x x x x x x x x x x x x x x x    
38       x x x x x x x x x x x x x x x x x    
42         x x x x x x x x x x x x x x x x    
55         x x x x x x x x x x x x x x x x   x
56         x x x x x x x x x x x x x x x x x x
ACMD6 x       x x x x x x x x x x x x x x x x   x
ACMD13         x x x x x x x x x x x x x x x x   x
ACMD22         x x x x x x x x x x x x x x x x   x
ACMD23         x x x x x x x x x x x x x x x x   x
ACMD42         x x x x x x x x x x x x x x x x   x
ACMD51         x x x x x x x x x x x x x x x x   x

Примечания:

(1) Ответ на команду CMD3 это ответ R6, который включает в себя только биты 23, 22, 19 и 12:9 из информации Card Status.
(2) Эта команда была определена в версии 1.10.

SD Status содержит биты статуса, которые относятся к проприетарным функциям карт памяти SD, и они могут быть полезны для будущего использования в зависимости от приложения. Размер SD Status - один блок данных из 512 бит. Содержимое этого регистра передается хосту через шину данных (DAT) вместе с 16-битной CRC. SD Status отправляется к хосту по шине DAT как ответ на команду ACMD13 (CMD55, которая следует с CMD13). ACMD13 может быть отправлена в карту только в состоянии tran_state (карта выбрана). Ниже описана структура SD Status.

Для типа (Type) и условий очистки (Clear Condition) используются те же сокращения, какие были показаны во врезке "Card Status" выше.

Таблица 4-37. SD Status.

Биты Идентификатор Type Значение Описание Clear Condition
511:510 DAT_BUS_WIDTH S R 00: 1 (по умолчанию),
01: зарезервировано,
10: 4 бита,
11: зарезервировано
Показывает текущую определенную шинину шины, как это было задано командой SET_BUS_WIDTH. A
509 SECURED_MODE S R 0: не в режиме защиты,
1: в режиме защиты
Показывает, находится ли карта в защищенном режиме (см. SD Security Specification). A
508:496 Зарезервировано
495:480 SD_CARD_TYPE S R 00xxh: карта SD Memory, как это определено в стандарте Ver1.01-2.00. В настоящее время определены следующие карты: 0000 это обычные карты SD RD/RW, 0001 это карты SD ROM. В будущем 8 младших бит будет использовано для определения различных вариаций карт SD Memory (каждый бит определит разные типы SD). Старшие 8 бит будут использоваться для определения карт SD, которые не соответствуют текущей спецификации SD Physical Layer. A
479:448 SIZE_OF_PROTECTED_AREA S R Размер защищенной области. См. описание ниже. A
447:440 SPEED_CLASS S R Класс скорости карты. См. описание ниже. A
439:432 PERFORMANCE_MOVE S R Быстродействие при перемещении данных в шагах по 1 мегабайту/сек. См. описание ниже. A
431:428 AU_SIZE S R Размер AU (единица данных, allocation unit). См. описание ниже. A
427:424 Зарезервировано
423:408 ERASE_SIZE S R Количество AU для стирания за 1 операцию. См. описание ниже. A
407:402 ERASE_TIMEOUT S R Значение таймаута для очистки областей, указанных через UNIT_OF_ERASE_AU. См. описание ниже. A
401:400 ERASE_OFFSET S R Фиксированное значение смещения, добавляемое для времени стирания. См. описание ниже. A
399:312 Зарезервировано
311:0 Зарезервировано для производителя.        

SIZE_OF_PROTECTED_AREA. Установка этого поля отличается для стандартных карт (Standard Capacity Card) и карт большой емкости (High Capacity Card). В случае Standard Capacity Card емкость защищенной области вычисляется следующим образом:

Protected Area (размер защищенной области) = SIZE_OF_PROTECTED_AREA_* MULT * BLOCK_LEN

Здесь SIZE_OF_PROTECTED_AREA указывается в единицах MULT*BLOCK_LEN.

В случае High Capacity Card емкость защищанной области указывается в этом поле так:

Protected Area (размер защищенной области) = SIZE_OF_PROTECTED_AREA

Здесь SIZE_OF_PROTECTED_AREA указывается в байтах.

SPEED_CLASS. Это 8-битное поле показывает класс скорости (Speed Class), и значение можно вычислить через Pw/2.

Таблица 4-38. Поле кода Speed Class.

SPEED_CLASS Значения
00h Class 0
01h Class 2
02h Class 4
03h Class 6
04h..FFh Зарезервировано

PERFORMANCE_MOVE. Это 8-битное поле показывае Pm, и это значение может быть установлено с шагом 1 [MB/sec]. Если карта не использует move RU, то Pm должно считаться бесконечностью. Установка в FFh означает бесконечность.

Таблица 4-39. Поле Performance Move.

PERFORMANCE_MOVE Значения
00h Не определено
01h 1 MB/сек
02h 2 MB/сек
... ...
FEh 254 MB/сек
FFh Бесконечность

AU_SIZE. Это 4-битное поле показывает разер AU, и это значение может быть выбрано в степенях 2, умноженное на 16 KB.

Таблица 4-40. Поле AU_SIZE.

AU_SIZE Значения
0h Не определено
1h 16 KB
2h 32 KB
3h 64 KB
4h 128 KB
5h 256 KB
6h 512 KB
7h 1 MB
8h 2 MB
9h 4MB
Ah..Fh Зарезервировано

Максимальный размер AU зависит от емкости карты, что определено в таблице 4-41. Карта может установить любой размер AU между размером RU и максимальным размером AU.

Таблица 4-41. Максимальный размер AU.

Емкость 16..64 MB 128..256 MB 512 MB 1..32 GB
Максимальный размер AU 512 KB 1 MB 2 MB 4 MB

Указания по применению: хост должне использовать максимальный размер AU (4 MB), чтобы определить размер буфера хоста. Хост может обрабатывать несколько AU, скомбинированных в один юнит.

ERASE_SIZE. Это 16-битное поле показывает NERASE. Когда стерто NERASE AU, знаение таймаута указывается через ERASE_TIMEOUT (см. ниже ERASE_TIMEOUT). Хост должен определить правильное количество AU для стирания, чтобы хост мог корректно отобразить состояние прогресса операции стирания. Если это поле установлено в 0, то вычисление таймаута стирания не поддерживается.

Таблица 4-42. Поле размера стирания (Erase Size).

ERASE_SIZE Значения
0000h Вычисление таймаута стирания не поддерживается.
0001h 1 AU
0002h 2 AU
0003h 3 AU
... ...
FFFFh 65535 AU

ERASE_TIMEOUT. Это 6-битное поле показывает время TERASE, и это значение означает таймаут стирания от смещения, когда стирается несколько AU, как задано ERASE_SIZE. Диапазон ERASE_TIMEOUT можно определить до 63 секунд, и производитель карты может выбрать любую комбинацию ERASE_SIZE и ERASE_TIMEOUT в зависимости от реализации карты. Как только был определен ERASE_TIMEOUT, он определяет ERASE_SIZE. Хост может определить таймаут для любого количества стираемых AU. Для вычисления таймаута стирания см. пункт 4.14 даташита [8]. Если поле ERASE_SIZE установлено в 0, тр это поле должно быть установлено в 0.

Таблица 4-43. Поле Erase Timeout.

ERASE_TIMEOUT Значения
0 Вычисление таймаута стирания не поддерживается.
1 1 секунда
2 2 секунды
3 3 секунды
... ...
63 63 секунды

ERASE_OFFSET. Это 2-битное поле показывает смещение TOFFSET, и можно выбрать одно из 4 значений. Смещение стирания подстраивает строку путем параллельного перемщения на верхнюю сторону. Подробнее см. рис. 4-11 и выражение (6) в пункте 4.14 даташита [8]. Это поле бесполезно, если поля ERASE_SIZE и ERASE_TIMEOUT установлены в 0.

Таблица 4-44. Поле Erase Offset.

ERASE_OFFSET Значения
0 0 секунд
1 1 секунда
2 2 секунды
3 3 секунды

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

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

Command
Index
АргументResponseDataАббревиатураОписание
CMD0 Отсутствует(0) R1 нет GO_IDLE_STATE Программный сброс (Software reset).
CMD1 Отсутствует(0) R1 нет SEND_OP_COND Запуск процесса инициализации.
ACMD41(*1) *2 R1 нет APP_SEND_OP_COND Только для карт SDC. Запуск процесса инициализации.
CMD8 *3 R7 нет SEND_IF_COND Только для карт SDC V2. Проверка диапазона напряжения питания.
CMD9 Отсутствует(0) R1 ДА SEND_CSD Чтение регистра CSD.
CMD10 Отсутствует(0) R1 ДА SEND_CID Чтение регистра CID.
CMD12 Отсутствует(0) R1b нет STOP_TRANSMISSION Остановка чтения данных.
CMD16 Длина
блока[31:0]
R1 нет SET_BLOCKLEN Изменение размера блока R/W (чтения/записи).
CMD17 Адрес[31:0] R1 ДА READ_SINGLE_BLOCK Чтение блока.
CMD18 Адрес[31:0] R1 ДА READ_MULTIPLE_BLOCK Чтение нескольких блоков.
CMD23 Количество
блоков[15:0]
R1 нет SET_BLOCK_COUNT Только для MMC. Указание количества блоков для трансфера
вместе со следующей командой многоблочного чтения/записи.
ACMD23(*1) Количество
блоков[22:0]
R1 нет SET_WR_BLOCK_ERASE_COUNT Только для SDC. Указание количества блоков для предварительной
(pre-erase) при последующей команде многоблочной записи.
CMD24 Адрес[31:0] R1 ДА WRITE_BLOCK Запись блока.
CMD25 Адрес[31:0] R1 ДА WRITE_MULTIPLE_BLOCK Запись нескольких блоков.
CMD55(*1) Отсутствует(0) R1 нет APP_CMD Начало команды ACMD.
CMD58 Отсутствует(0) R3 нет 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 будет отброшена с ошибкой недопустимой команды (illegal 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 по окончании транзакции multiple 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.

[Ссылки]

1. MMCA - Multimedia Card Association
2. SDA - SD Card Association
3. SDHC Physical Layer Spec.
4. About SPI (статья про интерфейс SPI).
5. Generic FAT file system module (модуль стандартной файловой системы FAT) с примером кода для управления картами MMC/SDSC/SDHC
6. Как использовать карты памяти MMC/SDC (оригинал статьи на английском языке).
7. 130916rwav-boot-public.zip - пример работы с картами памяти SD и SDHC.
8. SD_Physical_Layer_Spec.pdf - SD Specifications Part 1 Physical Layer Simplified Specification Version 2.00 September 25, 2006.