PIClist RUS
микроконтроллеры PIC и интерфейсы
техническая документация
статьи и разработки на русском языке

Как использовать карты MMC/SDC

« назад на главную страницу

Оригинал: ChaN, "How to Use MMC/SDC"

Перевод с английского © PIClist-RUS (piclist.ru)


Введение

Сейчас SD-карты памяти (Secure Digital Memory Card) являются самыми популярными картами памяти для мобильных устройств. SD-карты (далее SDC) были разработаны как внешне совместимые с MMC-картами (Multi Media Card) (далее MMC), при этом SDC-совместимые устройства тоже могут использовать MMC, но с некоторыми оговорками. Также существуют уменьшенные версии, такие как RS-MMC, miniSD и microSD, с аналогичными функциями. MMC/SDC имеет встроенный микроконтроллер, все средства управления flash-памятью (стирание, чтение, запись и защита от ошибок) полностью сосредоточены внутри карты. По умолчанию данные передаются между картой и ведущим контроллером блоками по 512 байтов, так что с точки зрения прикладных программ её можно рассматривать как подобие обычному жёсткому диску. В настоящее время в качестве файловой системы в основном используются FAT12 и FAT16 с правилом разделения на разделы FDISK. FAT32 применяется только для карт большой ёмкости (≥ 2 Гб).

В этой статье приведены элементарные знания и разнообразные интересные моменты, о которых я узнал, используя MMC/SDC в небольших встраиваемых системах.

Карты MMC и SD

Рис. 1. SDC и MMC

Контактная поверхность

Ниже, на Рис. 2, показаны контактные поверхности SDC и MMC. MMC имеет семь контактных площадок, а у SDC их девять, две из которых как бы добавлены к семи площадкам MMC. Три контакта у каждой карты заняты в качестве выводов источника питания, так что количество рабочих сигналов составляет соответственно четыре или шесть. Обмен данными между ведущим контроллером и картой осуществляется в виде последовательной тактируемой передачи.

Диапазон рабочего напряжения питания указан в регистре OCR, его необходимо считать, чтобы убедиться в правильности выбранного напряжения. Однако питающее напряжение можно установить и в фиксированное значение, поскольку MMC/SDC работают в диапазоне напряжений от 2.7 до 3.6 вольт. Так как потребление тока в худшем случае может достигать нескольких десятков миллиампер, ведущий контроллер должен быть способен обеспечить 100 миллиампер.

Контактная поверхность карт SD и MMC

Рис. 2. Контактная поверхность SDC и MMC

Режим SPI

Режим SPI является альтернативным режимом работы с MMC/SDC, более простым по сравнению с использованием их родного интерфейса. MMC/SDC можно подключить через универсальный порт SPI или порт GPIO (универсальный порт ввода/вывода), встроенный в большинство микроконтроллеров. Поэтому режим SPI прекрасно подходит для недорогих встраиваемых приложений. Особенно нет никаких причин использовать родной режим для электронных работ, выполненных вручную в качестве хобби. SDC работает в режиме "SPI 0". Что же касается MMC, то они не используют синхронизацию SPI как таковую, а оба действия защёлкивания и сдвига определяются по переднему фронту SCLK. Но вроде бы это работает в режиме "SPI 0". Поэтому наиболее подходящим режимом для работы с MMC/SDC по SPI является режим "SPI 0" (положительный синхроимпульс, защёлкивание по переднему фронту, сдвиг по заднему фронту). Режим "SPI 3" тоже подходит для этих целей.

Команда и ответ

В режиме SPI направление данных на сигнальной линии фиксировано, и данные передаются последовательно по байтам. Кадр команды, передаваемый от ведущего контроллера к карте, имеет фиксированную длину в 6 байтов и формат, приведённый на Рис. 3. В ответ на кадр команды ведущему передаётся ответ на команду (R1, R2 или R3). Так как вся передача данных управляется последовательными синхроимпульсами, генерируемыми ведущим, последний должен продолжать чтение байтов, пока не получит действительный ответ. Время ответа на команду (NCR) составляет от 0 до 8 байтов для SDC, и от 1 до 8 байтов для MMC. Сигнал CS должен удерживаться в состоянии низкого уровня в течение всей транзакции (команда, ответ и передача данных, если таковые имеются). Поле CRC как таковое в режиме SPI не обязательно, но его присутствие хотя бы в качестве битового поля необходимо, чтобы составить кадр команды.

Кадр команды

Рис. 3. Кадр команды

Набор команд SPI

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

Индекс командыАргументОтветДанныеАббревиатураОписание
CMD0Нет(0)R1НетGO_IDLE_STATEПрограммный сброс.
CMD1Нет(0)R1НетSEND_OP_CONDИнициировать процесс инициализации.
ACMD41(*1)Нет(0)R1НетAPP_SEND_OP_CONDТолько для SDC. Инициировать процесс инициализации.
CMD9Нет(0)R1ДаSEND_CSDСчитать регистр CSD.
CMD10Нет(0)R1ДаSEND_CIDСчитать регистр CID.
CMD12Нет(0)R1bНетSTOP_TRANSMISSIONПрекратить чтение данных.
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. Определить число блоков для предварительного стирания для следующей многоблочной команды записи.
CMD24Адрес[31:0]R1ДаWRITE_BLOCKЗаписать блок.
CMD25Адрес[31:0]R1ДаWRITE_MULTIPLE_BLOCKЗаписать множество блоков.
CMD55(*1)Нет(0)R1НетAPP_CMDКоманда, определяемая приложением.
CMD58Нет(0)R3НетREAD_OCRСчитать OCR.
*1:ACMD означает последовательность команд CMD55, CMD.

Ответ SPI

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

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

Структура ответов R1 и R3

Рис. 4. Структура ответов R1 и R3

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

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

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

После того как питающее напряжение достигло 2.2 В, выждите хотя бы миллисекунду, затем установите на линиях DI и CS высокий уровень и подайте более 74 импульсов на SCLK, и карта будет в состоянии принять родную команду.

Программный сброс

Чтобы выполнить сброс карты, выдайте команду CMD0 при низком уровне на линии CS. После обнаружения команды CMD0 карта опрашивает сигнал CS. Если уровень сигнала CS низкий (т.е. активный уровень), карта входит в режим SPI. Поскольку команда CMD0 должна посылаться как родная команда, поле CRC должно содержать правильное значение. Стоит лишь карте войти в режим SPI, проверка CRC отключается и значение CRC не принимается в расчёт, поэтому процедуру передачи команд можно написать с встроенным байтом CRC, равным 0x95, который является правильным только для команды CMD0. Если CMD0 принята успешно, карта войдёт в состояние простоя (idle) и ответит ответом R1 с установленным в единицу битом "In Idle State" (R1 = 0x01). Снова включить проверку CRC можно командой CMD59.

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

В состоянии простоя карта принимает только команды CMD0, CMD1 и CMD58, любые другие команды будут отклонены. Когда карта обнаруживает команду CMD1, она начинает инициализацию. Чтобы определить, завершена ли инициализация, ведущий контроллер должен повторять посылку команды CMD1 и проверять ответ. Как только карта успешно проинициализировалась, бит "In Idle State" в ответе R1 будет сброшен (R1 = 0x00). Процесс инициализации может занять несколько сотен миллисекунд (большие карты имеют тенденцию к большим затратам времени). После окончания инициализации будут приниматься и команды чтения/записи. В это время можно считать OCR и CID для подтверждения диапазона рабочего напряжения, ёмкости карты или любого другого необходимого свойства.

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

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

Пакет данных и ответ на данные

В транзакции с передачей данных после ответа на команду может быть передан/получен один или более блоков данных. Блок данных передаётся как пакет данных, который состоит из маркера (Token), блока данных (Data Block) и CRC. Формат пакета данных показан ниже, на Рис. 5. Существует три маркера данных (см. Рис. 5). Один из них, маркер "Stop Tran", который означает конец многоблочной записи, используется в виде одиночного байта без блока данных и CRC.

Формат пакета данных, ответа данных и маркера ошибки

Рис. 5. Формат пакета данных, ответа данных и маркера ошибки

Одноблочное чтение

Команда одноблочного чтения

Рис. 6. Команда одноблочного чтения

Одноблочное чтение инициируется командой CMD17. Её аргумент задаёт ячейку, из которой следует начать чтение. Чтение осуществляется побайтово. Адрес должен быть байт-ориентированным, т.е. если вы указываете адрес сектора, задаваемый несколькими старшими битами, вам необходимо дополнить его нулями для получения полных четырёх адресных байтов.

В ответ на команду CMD17 карта выдаёт ведущему контроллеру пакет данных. После обнаружения правильного маркера данных ведущий контроллер принимает следующий за ним блок данных и два байта CRC, которые необходимо принять, даже если CRC не используется. По умолчанию размер блока 512 байтов, но его можно изменить командой CMD16. Если во время операции чтения произошла какая-нибудь ошибка, вместо пакета данных будет возвращён маркер ошибки (см. Рис. 5).

Многоблочное чтение

Команда многоблочного чтения

Рис. 7. Команда многоблочного чтения

С помощью команды многоблочного чтения CMD18 можно прочитать из карты последовательность из нескольких блоков, начиная с заданного адреса. Если перед этой командой с помощью команды CMD23 (только для MMC) не было задано число передаваемых блоков, будет инициировано неограниченное многоблочное чтение, то есть операция чтения будет продолжаться, пока ведущий контроллер не прервёт её командой CMD12. Байт, получаемый сразу же после передачи CMD12, является наполняющим, его не нужно учитывать. После этого байта следует ответ на команду.

Одноблочная запись

Команда одноблочной записи

Рис. 8. Команда одноблочной записи

После того как карта приняла команду записи CMD24, ведущий контроллер после байтового промежутка (один или более байтов) передаёт в карту пакет данных. Формат пакета такой же, как и у команды блочного чтения. После передачи пакета карта сразу же выдаёт ответ на данные (Data Response), за которым следует флаг занятости. Большинство карт не могут менять размер записываемого блока, он является фиксированным и составляет 512 байтов.

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

Многоблочная запись

Команда многоблочной записи

Рис. 9. Команда многоблочной записи

С помощью команды многоблочной записи CMD25 можно записать последовательность из нескольких блоков, начиная с заданного адреса. Если перед этой командой число передаваемых блоков не было задано с помощью команды CMD23 (только для MMC) или ACMD23 (для SDC), транзакция будет инициирована как неограниченная многоблочная запись, то есть операция записи будет продолжаться, пока ведущий контроллер не прервёт её передачей маркера "Stop Tran". Флаг занятости появиться байт спустя после маркера "Stop Tran". Что же касается SDC, то транзакция многоблочной записи должна прерываться маркером "Stop Tran" независимо от того, является ли она предопределённой или неограниченной.

Чтение CSD и CID

Эти команды подобны одноблочному чтению за исключением длины блока. CSD и CID передаются ведущему в виде 16-байтовых блоков данных. Более детальную информацию по CMD, CID и OCR вы сможете найти в спецификациях на MMC/SDC.

Неподключенная шина и "горячее" подключение

По сути, любая линия, которая может оставаться неподключенной должна притягиваться к низкому или высокому уровню через резистор. Это основное правило проектирования на МОП-устройствах. Поскольку для DI и DO обычным является состояние высокого уровня, их следует притянуть к высокому уровню. Согласно спецификациям SDC/MMC для потягивающих резисторов рекомендуется выбирать значения 50 - 100 кОм. Однако тактовый сигнал в спецификациях SDC/MMC не упоминается, поскольку он обычно управляется ведущим контроллером. Если существует вероятность, что в течение какого-то времени он может оставаться неподключенным, его следует подтянуть к его обычному уровню, то есть к низкому.

MMC/SDC позволяет использовать "горячую" вставку/удаление, но для этого необходимо кое-что учесть в схеме основной платы во избежание некорректной работы. Например, если питающее напряжение системы (Vcc) подключается к разъёму карты напрямую, то в момент замыкания контакта питающее напряжение упадёт из-за тока зарядки конденсатора, встроенного в карту. Ниже, на Рис. 10 A приведена осциллограмма, показывающая, что в этом случае происходит падение напряжение на 600 милливольт. Этого вполне достаточно, чтобы запустить детектор падения напряжения. На Рис. 10 B показано, что при использовании для блокировки импульса тока катушки индуктивности, падение напряжения уменьшилось до 200 милливольт. Электролитический конденсатор большой ёмкости (OS-CON) (Рис. 10 C) может радикально уменьшить падение напряжения. Однако он может вызывать колебания на LDO-регуляторе.

Горячее подключени

Рис. 10. "Горячее" подключени

Система со многими ведомыми

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

Процесс освобождения шины

Рис. 11. Процесс освобождения шины

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

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

Контрольный тест

Я исследовал производительность чтения/записи некоторых MMC/SDC (см Рис. 12) на недорогом 8-разрядном микроконтроллере (ATmega64 на частоте 9.2 МГц) при условии, что встраиваемая система является системой с ограниченным объёмом памяти. Из соображений объёмов памяти, write() и read() выполнялись по 2048 байтов за раз.

Результат:

КартаСкорость чтения, Кбайт/сСкорость записи, Кбайт/с
128 Мб SDC32877
512 Мб SDC23428
128 Мб MMC312182

Судя по эти результатам, производительность записи 512 Мб SDC оказалась в три раза хуже по сравнению с 128 Мб SDC.

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

Протестированные карты MMC и SD

Рис. 12. Протестированные карты

Размер блока стирания

Чтобы проанализировать детали операции записи, время занятости (число циклов опроса) после передачи записываемых данных выводилось на консоль в низкоуровневой функции записи диска. Множество чисел на строке указывает блоки данных и маркер "Stop Tran", который выдаётся транзакцией многоблочной записи.

Результаты теста:

128MB Mutli Media Card: HB28B128MM2 (Hitachi)

--------------------------------------------------------
>fo 10 rwtest.dat
rc=0
>fw 65536 0x55
   521
    93    14    14    14   491
    93    15    14    15   463
    93    15    14    15   475
    94    15    15    15   470
    93    15    14    15   494
    90    15    15    15   463
    93    15    14    15   460
    93    15    15    15   463
    93    15    14    15   505
    93    15    15    14   462
    93    15    14    14   474
    93    15    15    14   462
    93    15    15    15   514
    93    15    14    14   463
    93    15    14    15   457
    93    15    14    15   444
    93    15    15    15   492
    93    15    15    15   460
    93    15    14    15   471
    94    15    15    15   449
    93    14    14    15   532
    93    14    15    15   463
    91    14    14    15   486
    93    15    14    15   463
    93    14    14    15   487
    93    14    15    14   462
    93    14    15    15   487
    93    14    15    15   448
    93    14    15    15   506
    93    14    15    15   490
    93    14    15    15   514
    93    14    15    15   462
65536 bytes written with 182044 bytes/sec.
>fc
   477
   451
   521
rc=0
>fo 1 rwtest.dat
rc=0
>fr 65536
65536 bytes read with 312076 bytes/sec.
>fc
rc=0
>
128MB SD Memory Card: RP-SD128B (Panasonic)
--------------------------------------------------------
>fo 10 rwtest.dat
rc=0
>fw 65536 0x55
  3879
  1840    21    16     7  1997
  1896    21    16     7  1944
  1946    21    16     7  1891
  1999    21    16     7  1839
  2052    21    16     7  1785
  2104    21    16     7  1735
  2160    21    16     7  1679
  2210    21    16     7  1627
  2263    21    16     7  1574
  2316    21    16     7  1521
  2369    21    16     7  1471
  2419    21    16     7  1415
  2476    21    16     7  1365
  2528    21    16     7  1309
  2580    21    16     7  1256
  2634    21    16     7  1206
  2684    21    16     7  1150
  2740    21    16     7  1089
  2790    21    16     7  1047
  2846    21    16     7   991
  2899    21    16     7   941
  2949    21    16     7   886
  3004    21    16     7   836
  3054    21    16     7   783
  3110    21    16     7   730
  3153    21    16     7   677
  3213    21    16     7   621
  3269    21    16     7   571
  3319    21    16     7   518
  3375    21    16     7   463
  3425    21   255     7  3783
    95    21    16     7  3733
65536 bytes written with 77101 bytes/sec.
>fc
  3901
  3904
  3902
rc=0
>fo 1 rwtest.dat
rc=0
>fr 65536
65536 bytes read with 327680 bytes/sec.
>fc
rc=0
>

512MB SD Memory Card: RP-SD512B (Panasonic)
--------------------------------------------------------
>fo 10 rwtest.dat
rc=0
>fw 65536 0x55
   955
     3     3     3     3   396
     3     3     3 28986   268
     3     3     3     3   406
     3     3     3 29211   260
     3     3     3     3   408
     3     3     3 29317   253
     3     3     3     3   403
     3     3     3 28718   259
     3     3     3     3   419
     3     3     3 29197   256
     3     3     3     3   399
     3     3     3 29092   260
     3     3     3     3   406
     3     3     3 28777   250
     3     3     3     3   410
     3     3     3 28772   256
     3     3     3     3   399
     3     3     3 28817   275
     3     3     3     3   410
     3     3     3 29145   264
     3     3     3     3   410
     3     3     3 29178   253
     3     3     3     3   399
     3     3     3 29143   301
     3     3     3 30167   400
     3     3     3     3   234
     3     3     3 30570   381
     3     3     3     3   227
     3     3     3 30542   380
     3     3     3     3   224
     3     3     3 30500   381
     3     3     3     3   234
65536 bytes written with 27769 bytes/sec.
>fc
 32481
   785
   971
rc=0
>fo 1 rwtest.dat
rc=0
>fr 65536
65536 bytes read with 234057 bytes/sec.
>fc
rc=0
>

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

*Возможно, для термина "MLC" имеется другой перевод, более правильный, исходя из смысла текста. - прим. пер.

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

Чтобы избежать этого узкого места и поднять производительность записи SDC/MMC, за один раз следует выполнять запись максимально возможного числа блоков (в идеале выровненного по блоку стирания). Другими словами, необходимо выделить большую буферную память и передать её в fwrite(). Что касается низкоуровневой функции записи диска, то для повышения эффективности обработки записи нужно предварительно сообщать карте число записываемых секторов. Это называется "предопределённая многоблочная запись". Однако для этих целей используются разные команды: CMD23 для MMC и ACMD23 для SDC.

Правда, такой подход мог бы привести к тщетным попыткам увеличить производительность записи SDC на микроконтроллерах с несколькими килобайтами ОЗУ. Если вам нужна производительность записи в карту памяти, то лучше применить CompactFlash или MMC, а не SDC. В частности, CompactFlash имеет хорошую производительность, которая в десять раз быстрее, чем у SDC.

Карты памяти изначально разбиты на разделы и отформатированы, чтобы выровнять единицу выделения памяти по блоку стирания. При неосторожном переразбиении или переформатировании карты памяти системой, которая не совместима с MMC/SDC (обычный ПК), оптимизация нарушится, и производительность записи может быть утеряна. Я попытался переформатировать 512 Мб SDC под FAT32 на ПК, и производительность записи (измерялась копированием файла) понизилась в несколько раз. Поэтому переформатирование карты должно выполняться с помощью оборудования, совместимого с MMC/SDC, а не на ПК.

Описание интерфейса SPI

SPI (Serial Peripheral Interface - последовательный периферийный интерфейс) - один из внутрисхемных интерфейсов связи. Он был разработан фирмой Motorola (Freescale Semiconductor). Благодаря его простоте и универсальности он встраивается в различные периферийные ИС и стоит в одном ряду с шиной I2C от Philips. Количество сигнальных линий SPI составляет три или четыре, это больше двух проводов шины I2C, но зато скорость передачи может составлять до 20 Мбит/с и выше, в зависимости от возможностей устройства (это в 5 - 50 раз больше, чем скорость шины I2C). Поэтому интерфейс SPI используется в различных приложениях, АЦП, ЦАП или ИС связи, для которых требуется максимально возможная скорость передачи данных.

Структура интерфейса SPI

Основная структура интерфейса SPI показана на Рис. 13. Мастер* и ведомый связаны между собой с помощью трёх сигнальных линий: SCLK (Serial Clock - последовательная синхронизация), MISO (Master-In Slave-Out - вход мастера выход ведомого) и MOSI (Master-Out Slave-In - выход мастера вход ведомого). Оба 8-разрядных регистров обмениваются между собой содержимым при сдвиге, управляемом тактовыми сигналами от мастера. Дополнительный сигнал SS (Slave Select - выбор ведомого) используется для синхронизации начала пакета или границы байта, а также для реализации конфигурации со многими ведомыми. Для большинства ведомых устройств выводы SPI имеют другие обозначения: DI (Data Input - вход данных), DO (Data Output - выход данных) и CS (Crystal Select - выбор кристалла). Для устройств с однонаправленной передачей, таких как ЦАП или одноканальный АЦП, одной из линий данных можно пренебречь. Данные выдвигаются, начиная со старшего бита.

*На самом деле "master" принято переводить как "ведущий", но мы будем использовать термин "мастер", чтобы избежать путаницы между "ведущий" и "ведомый". - прим. пер.

Если к шине SPI подключено несколько ведомых устройств, то к трём линиям SCLK, MISO и MOSI устройства присоединяются параллельно, а сигналы CS от мастера подключаются к каждому ведомому отдельно. Если ведомый выбран сигналом CS, то для него разрешена выдача данных. Те же устройства, для которых CS не активен, отключены от линии MISO.

Структура интерфейса SPI

Рис. 13. Структура интерфейса SPI

Временная диаграмма передачи данных по SPI

В SPI выдвигание и защёлкивание данных происходит по противоположным фронтам тактовых импульсов. Такое разделение операций сдвига и защёлкивания имеет определённое преимущество, позволяя избегать жёсткого временного режима между этими двумя операциями. Это позволяет облегчить решение вопроса обеспечения синхронизации при разработке ИС или плат. Но, с другой стороны, из-за комбинаций полярности и фазы синхроимпульсов возникает четыре режима работы, и мастеру приходится настраиваться на тот режим, который используется ведомым.

Режим SPIВременная диаграмма
Режим "SPI 0"
Активные уровень импульсов - высокий.
Сначала защёлкивание, затем сдвиг.
Режим SPI 0
Режим "SPI 1"
Активные уровень импульсов - высокий.
Сначала сдвиг, затем защёлкивание.
Режим SPI 1
Режим "SPI 2"
Активные уровень импульсов - низкий.
Сначала защёлкивание, затем сдвиг.
Режим SPI 2
Режим "SPI 3"
Активные уровень импульсов - низкий.
Сначала сдвиг, затем защёлкивание.
Режим SPI 3



© PIClist-RUS (piclist.ru), 2007 г.

PIClist RUS (piclist.ru) © 2008
все права сохранены. перепечатка статей и переводов с данного сайта запрещена.