2013年12月12日 星期四

如何使用MMC/SDC 的方法

日本老前輩提供非常有用的資料和經驗, 在此致上最高敬意!!!

How to Use MMC/SDC


Update: February 18, 2013

MMC and SDC
The Secure Digital Memory Card (SDC below) is the de facto standard memory card for mobile equipments. The SDC was developped as upper-compatible to Multi Media Card(MMC below). SDC compleant equipments can also use MMCs in most case. There are also reduced size versions, such as RS-MMCminiSD and microSD, with the same function. The MMC/SDC has a microcontroller in it. The flash memory controls (erasing, reading, writing, error controls and wearleveling) are completed inside of the memory card. The data is transferred between the memory card and the host controller as data blocks in unit of 512 bytes, so that it can be seen like a generic hard disk drives from view point of upper level layers. The currentry defined file system for the memory card is FAT12/16 with FDISK patitioning rule. The FAT32 is defined for only high capacity (>= 4G) cards.
This page describes the basic knowledge and miscellaneous things that I become aware, on using MMC/SDC with small embedded system. I believe that this information must be a useful getting started notes for the people who is going to use MMC/SDC on the electronics handiwork projects.

Pinout

Right photo shows the contact surface of the SDC/MMC. The MMC has seven contact pads and the SDC has nine contact pads that two additional contacts to the MMC. The three of the contacts are assigned for power supply so that the number of effective signals are four (MMC) and six (SDC). Therfore the data transfer between the host and the card is done via a synchronous serial interface.
The working supply voltage range is indicated in the operation conditions register (OCR) and it should be read and comfirmed the operating voltage range. However, the supply voltage can be fixed to 3.0/3.3 volts because the all MMC/SDCs work at supply voltage of 2.7 to 3.6 volts at least. The current consumption on write operation can reach up to some ten miliamperes, so that the host system should consider to supply 100 miliamperes to tha card.

SPI Mode

This document describes the protocol to control MMC/SDCs in SPI mode. The SPI mode is an alternative operating mode that defined to use the MMC/SDCs without native host interface. The communication protocol for the SPI mode is a little simple compared to its native operating mode. The MMC/SDC can be attached to the most microcontrollers via a generic SPI interface or GPIO ports. Therefore the SPI mode is suitable for low cost embedded applications with no native host interface is available. There are four different SPI modes, 0 to 3, depends on clock phase and polarity. Mode 0 is defined for SDC. For the MMC, it is not the SPI timing, both latch and shift actions are defined with rising edge of the SCLK, but it seems to work at mode 0 in the SPI mode. Thus the Mode 0 (CPHA=0, CPOL=0) is the proper setting to control MMC/SDC, but mode 3 (CPHA=1, CPOL=1) also works as well in most case.

Command and Response

In SPI mode, the data direction on the signal lines are fixed and the data is transferred in byte oriented serial communication. The command frame from host to card is a fixed length packet that shown below. The card is ready to receive a command frame when it drives DO high. After a command frame is sent to the card, a response to the command (R1, R2, R3 or R7) is sent back from the card. Because the data transfer is driven by serial clock generated by host controller, the host controller must continue to read data, send a 0xFF and get received byte, until a valid response is detected. The DI signal must be kept high during read transfer (send a 0xFF and get the received data). The response is sent back within command response time (NCR), 0 to 8 bytes for SDC, 1 to 8 bytes for MMC. The CS signal must be driven high to low prior to send a command frame and held it low during the transaction (command, response and data transfer if exist). The CRC feature is optional in SPI mode. CRC field in the command frame is not checked by the card.
cmd frame

SPI Command Set

Each command is expressed in abbreviation like GO_IDLE_STATE or CMD<n>, <n> is the number of the command index and the value can be 0 to 63. Following table describes only commands that to be usually used for generic read/write and card initialization. For details on all commands, please refer to spec sheets from MMCA and SDCA.




SPI Response
There are some command response formats, R1, R2, R3 and R7, depends on the command index. A byte of response, R1, is returned for most commands. The bit field of the R1 response is shown in right image, the value 0x00 means successful. When any error occured, corresponding status bit in the response will be set. The R3/R7 response (R1 + trailing 32-bit data) is for only CMD58 and CMD8.
Some commands take a time longer than NCR and it responds R1b. It is an R1 response followed by busy flag (DO is driven to low as long as internal process is in progress). The host controller should wait for end of the process until DO goes high (a 0xFF is received).

Initialization Procedure for SPI Mode

After power on reset, MMC/SDC enters its native operating mode. To put it SPI mode, follwing procedure must be performed like this flow.

Power ON (Insersion)

After supply voltage reached 2.2 volts, wait for one millisecond at least. Set SPI clock rate between 100kHz and 400kHz. Set DI and CS high and apply 74 or more clock pulses to SCLK. The card will enter its native operating mode and go ready to accept native command.

Software Reset

Send a CMD0 with CS low to reset the card. The card samples CS signal on a CMD0 is received successfully. If the CS signal is low, the card enters SPI mode and responds R1 with In Idle State bit (0x01). Since the CMD0 must be sent as a native command, the CRC field must have a valid value. When once the card enters SPI mode, the CRC feature is disabled and the CRC is not checked by the card, so that command transmission routine can be written with the hardcorded CRC value that valid for only CMD0 and CMD8 with the argument of zero. The CRC feature can also be switched with CMD59.

Initialization

In idle state, the card accepts only CMD0, CMD1, ACMD41,CMD58 and CMD59. Any other commands will be rejected. In this time, read OCR register and check working voltage range of the card. In case of the system sypply voltage is out of working voltage range, the card must be rejected. Note that all cards work at supply voltage range of 2.7 to 3.6 volts at least, so that the host contoller needs not check the OCR if supply voltage is in this range. The card initiates the initialization process when a CMD1 is received. To detect end of the initialization process, the host controller must send CMD1 and check the response until end of the initialization. When the card is initialized successfuly, In Idle State bit in the R1 response is cleared (R1 resp changes 0x01 to 0x00). The initialization process can take hundreds of milliseconds (large cards tend to longer), so that this is a consideration to determin the time out value. After the In Idle State bit cleared, generic read/write commands will able to be accepted.
Because ACMD41 instead of CMD1 is recommended for SDC, trying ACMD41 first and retry with CMD1 if rejected, is ideal to support both type of the cards.
The SCLK rate should be changed to fast as possible to maximize the read/write performance. The TRAN_SPEED field in the CSD register indicates the maximum clock rate of the card. The maximum clock rate is 20MHz for MMC, 25MHz for SDC in most case. Note that the clock rate will able to be fixed to 20/25MHz in SPI mode because there is no open-drain condition that restricts the clock rate.
The initial read/write block length can be set 1024 on 2GB cards, so that the block size should be re-initialized to 512 with CMD16 to work with FAT file system.

How to support SDC Ver2 and high capacity cards

After the card enters idle state with a CMD0, send a CMD8 with argument of 0x000001AA and correct CRC prior to initialization process. If the CMD8 is rejected with illigal command error (0x05), the card is SDC V1 or MMC. If accepted, R7 response (R1(0x01) + 32-bit return value) will be returned. The lower 12 bits in the return value 0x1AA means that the card is SDC V2 and it can work at voltage range of 2.7 to 3.6 volts. If not the case, the card must be rejected. And then initiate initialization with ACMD41 with HCS flag (bit 30). After the initialization completed, read OCR register with CMD58 and check CCS flag (bit 30). When it is set, subsequent data read/write operations described below are commanded in block address insted of byte address. The block size is always fixed to 512 bytes.

Data Transfer

Data Packet and Data Response

data block
In a transaction with data transfer, one or more data blocks will be sent/received after command response. The data block is transferred as a data packet that consist of Token, Data Block and CRC. The format of the data packet is showin in right image and there are three data tokens. Stop Tran token is to terminate a multiple block write transaction, it is used as single byte packet without data block and CRC.

Single Block Read


The argument specifies the location to start to read in unit of byte or block. The sector address in LBA specified by upper layer must be scaled properly. When a CMD17 is accepted, a read operation is initiated and the read data block will be sent to the host. After a valid data token is detected, the host controller receives following data field and CRC. The CRC bytes must be received even if it is not needed. If any error occured during the read operation, an error token will be returned instead of data packet.

Multiple Block Read


The CMD18 is to read multiple blocks in sequense from the specified location. The read operation continues as open-ended. To terminate the transaciton, send a CMD12 to the card. The received byte immediataly following CMD12 is a stuff byte, it should be discarded before receive the response of the CMD12. For MMC, if number of transfer blocks has been sepecified by CMD23 prior to CMD18, the read transaction is initiated as a pre-defined multiple block transfer and the read operation is terminated at last block transfer.

Single Block Write


The Single Block Write writes a block to the card. After a CMD24 is accepted, the host controller sends a data packet to the card. The packet format is same as block read operations. Most cards cannot change write block size and it is fixed to 512. The CRC field can have any fixed value unless the CRC function is enabled. The card responds a Data Response immediataly following the data packet from the host. The Data Response trails a busy flag and host controller must wait until the card goes ready.
In principle of the SPI mode, the CS signal must be kept asserted during a transaction. However there is an exception to this rule. When the card is busy, the host controller can deassert CS to release SPI bus for any other SPI devices. The card will drive DO low again when reselected during internal process is in progress. Therefore a preceding busy check, check if card is busy prior to each command and data packet, instead of post wait can eliminate waste wait time. In addition the internal write process is initiated a byte after the data response, this means eight clocks are required to initiate internal write operation. The state of CS signal during the eight clocks can be either low or high, so that it can be done by bus release process described below.

Multiple Block Write


The Multiple Block Read command writes multiple blocks in sequense from the specified location. After a CMD25 is accepted, the host controller sends one or more data packets to the card. The packet format is same as block read operations except for Data Token. The write operation continues until terminated with a Stop Tran token. The busy flag will output after each data block and Stop Tran token. For MMC, the number of blocks to write can be pre-defined by CMD23 prior to CMD25 and the write transaction is terminated at last data block. For SDC, number of sectors to pre-erased at start of write transaction can be specified by ACMD23 prior to CMD25. A Stop Tran token is always required to treminate the write transaction. It can also be terminated at smaller or larger than pre-erased blocks but the content of the pre-erased and not transferred blocks are undefined.

Reading CSD and CID

These are same as Single Block Read except for the data block length. The CSD and CID are sent to the host as 16 byte data block. For details of the CMD, CID and OCR, please refer to the MMC/SDC specs.

Cosideration to Bus Floating and Hot Insertion

dip
Any signals that can be floated should be pulled low or high properly via a resister. This is a generic design rule on MOS devices. Because DI and DO are normally high, they should be pulled-up. According to SDC/MMC specs, from 50k to 100k ohms is recommended to the value of pull-up registers. However the clock signal is not mentioned in the SDC/MMC specs because it is always driven by host controller. When there is a possibility of floating, it should be pulled to the normal state, low.
The MMC/SDC can hot insertion/removal but some considerations to the host circuit are needed to avoid an incorrect operation. For example, if the system power supply (Vcc) is tied to the card socket directly, the Vcc will dip at the instant of contact closed due to a charge current to the capacitor that built in the card. 'A' in the right image is the scope view and it shows that occureing a voltage dip of about 600 millivolts. This is a sufficient level to trigger a brown out detector. 'B' in the right image shows that an inductor is inserted to block the surge current, the voltage dip is reduced to 200 millivoits. A low ESR capacitor, such as OS-CON, can eliminate the voltage dip dratiscally like shown in 'C'. However the low ESR capacitor can cause an oscillation of LDO regulator.

Cosideration on Multi-slave Configuration


In the SPI bus, each slave device is selected with separated CS signals, and plural devices can be attached to an SPI bus. Generic SPI slave device drives/releases its DO signal by CS signal asynchronously to share an SPI bus. However MMC/SDC drives/releases DO signal in synchronising to the SCLK. This means there is a posibility of bus conflict with MMC/SDC and any other SPI slaves that attached to an SPI bus. Right image shows the drive/release timing of the MMC/SDC (the DO signal is pulled to 1/2 vcc to see the bus state). Therefore to make MMC/SDC release DO signal, the master device must send a byte after CS signal is deasserted.

How Fast SPI Mode Can Work?


MMC/SDC can work at the clock frequency upto 20/25MHz. Of course all native interfaces guarantee to work at the maximum speed. However generic SPI interface integrated in the microcontrollers may not work at high speed due to timing issue. Right image shows the timing diagram of the SPI interface. In SPI mode 0/3, the data is shifted out by falling edge of the SCLK and latched by next rising edge. td is the SCLK - DO propagation delay at the SDC, 14ns maximum. tsu is the minimum setup time of the MISO input. Therefore the maximum allowable SCLK frequency can be determined by:
FSCLK(max) = 1 / ((td + tsu) * 2)
Some microcontrollers I have used are limited the allowable SCLK frequency around 10MHz by the timing specs.

Optimization of Write Performance

Most MMC/SDC employs NAND Flash Memory as a memory array. The NAND flash memory is cost effective and it can read/write large data fast, but on the other hand, there is a disadvantage that rewriting a part of data is inefficient. Generally the flash memory requires to erase existing data before write a new data, and minimum unit of erase operation (called erase block) is larger than write block size. The typical NAND flash memory has a block size of 512/16K bytes for write/erase operation, and recent monster card employs large block chip (2K/128K). This means that rewriting entire data in the erase block is done in the card even if write only a sector (512 bytes).

Benchmark

I examined the read/write performance of some MMC/SDC with a cheap 8 bit MCU (ATmega64 @9.2MHz) on the assumption that an embedded system with limited memory size. For reason of memory size, write() and read() ware performed in 2048 bytes at a time. The result is: Write: 77kB/sec, Read: 328kB/sec on the128MB SDC, Write: 28kB/sec, Read: 234kB/sec on the 512MB SDC and Write: 182kB/sec, Read: 312kB/sec on the 128MB MMC.
Therefor the write performance of the 512MB SDC was very poor that one third value of 128MB SDC. Generally the read/write performance of the mass storage device increases proportional to its recording density, however it sometimes appears a tendency of opposite on the memory card. As for the MMC, it seems to be several times faster than SDC, it is not bad performance. After that time, I examined some SDCs supplied from different makers, and I found that PQI's SDC was as fast as Hitachi's MMC but Panasonic's and Toshiba's one was very poor performances.

Erase Block Size

To analys detail of write operation, busy time (number of polling cycles) after sent a write data is typed out to console in the low level disk write function. Multiple numbers on a line indicates data blocks and a Stop Tran token that issued by a multiple block write transaction.
In resulut of the analysis, there is a different of internal process between 128MB SDC and 512MB SDC. The 128MB SDC rewrites erase block at end of the mutiple block write transaction. The 512MB SDC seems have 4K bytes data buffer and it rewrites erase block every 4K bytes boundary. Therefor it cannot compared directly but the processing time of rewriting an erase block can be read 3800 for 128MB SDC and the 512MB SDC taeks 30000 that 8 times longer than 128MB SDC. Judging from this resulut, it seems the 128MB SDC uses a small block chip and the 512MB SDC uses a large block or MLC chip. Ofcourse the larger block size decreases the performance on pertial block rewriting. In 512MB SDC, only an area that 512K bytes from top of the memory is relatively fast. This can be read from write time inclose(). It might any special processing is applied to this area for fast FAT accsess.

Improving Write Performance

write transactions
To avoid this bottleneck and increase the write performance, number of blocks per write transaction must be large as possible. Of course all layers between the application and the media must support multiple sector write feature. For low level SDC/MMC write function, it should inform number of write sectors to the card prior to the write transaction for efficient internal write process. This method called `pre-defined multiple block write'. The pre-definition command is not the same between MMC (CMD23) and SDC (ACMD23).
The memory cards are initially patitioned and formatted to align the allocation unit to the erase block. When re-patition or re-format the memory card with a device that not compliant to MMC/SDC (this is just a PC) with no care, the optimization will be broken and the write performance might be lost. I tried to re-format 512MB SDC in FAT32 with a PC, the write performance measured in file copy was lowerd to one several. Therefore the re-formatting the card should be done with MMC/SDC compliant equipments rather than PC.
日文版 :

MMC/SDC使いかた


更新: 2013. 2. 18


現在広く普及しているメモリ・カードのひとつに、SDメモリ・カード(Secure Digital Memory Card)があります。SDメモリ・カード(以下SDCと表記)は、マルチメディア・カード(Multi-Media Card、以下MMCと表記)互換のシステムとして開発されたもので、SDC対応機器はいくつかの考慮だけでMMCを同じソケットで使うことができます。さらにMMCの拡張仕様としてMMC plusというのもあり、同様にSDC対応機器で使えます。これらのメモリ・カードには、機能はそのままで外形だけ小型化されたバリエーションがあります。MMC/SDCは内部にマイクロコントローラを持ち、フラッシュ・メモリ制御(消去、書き込み、エラー制御や巡回処理)は内部で完結しています。データの読み書きは基本的にブロック(512バイト)単位となり、ドライバ・レベルから見てもハードディスクと変わるところはありません。ファイル・システムにはFATが採用されています。
ここでは、MMC/SDCを組み込みシステムで利用する際に最低限知っておくべき点や、いろいろ気づいた点などをコンパクトにまとめておきます。これからMMC/SDCを使ってみようとしている方の参考になれば幸いです。

端子配列

右の写真にMMCとSDCの端子部を示します。MMCは7接点、SDCはそれに2接点を追加した9接点となっています。このうち、電源がそれぞれ3接点を占めているので、有効信号線数はそれぞれ4本と6本ということになります。信号名からも分かるように、データ伝送はクロック同期シリアルで行われます。
動作電源電圧は、動作可能範囲を示すレジスタを読み出して確認することになっています。出回っているほとんど全てのMMC/SDCは2.7~3.6Vの範囲で動作するので、その範囲の電源電圧に決め打ちしてもOKです。電源電流は読み書きのピーク時で数十mA流れるので、100mAは見ておいた方がよいでしょう。

SPIモード

SPIモードはMMC/SDCを簡単に使うために設定されたモードです。SPIモードの伝送プロトコルはネイティブ・モードよりも単純なので、マイコン内蔵のSPIポートまたはGPIOポートで容易に制御できます。単純な組み込みシステムではコストの点から専用ハードウェアを設けられないことも多いのですが、SPIモードで使用することにより廉価なシステムが実現できます。特に電子工作ではSPIモード以外を選択する理由はないといえるでしょう。SDCではSPI Mode 0準拠のタイミングで規定されています。MMCではラッチ、シフト共にクロックの立ち上がりで規定されていてSPIとは異なりますが、SPIモードではMode 0のタイミングで動作するようです。したがって、SPIポートの設定はMode 0(CPHA=0, CPOL=0)とするのが適当です(Mode 3でも多くは動作が可能)。

コマンドとレスポンス

SPIモードではデータの入出力方向は固定され、バイト指向のシリアル通信となります。コマンド・フレームは6バイトの固定長で、次のようなフォーマットで伝送されます。コマンドを送るとそれに対するレスポンス(R1、R2またはR3)が返って来るので、ポーリングしながら待ちます。コマンド応答時間(NCR)は、0~8バイト(SDC)または、1~8バイト(MMC)となっています。一つのトランザクション(コマンド送信開始からレスポンス、データ転送(あるならば))の間はCSをアサートに保持しておかなければなりません。

SPIコマンド・セット

それぞれのコマンドはCMD<n>といった略号で表記されます。nはそのコマンドのインデックス番号を示し、0~63です。ここでは、通常の読み書きで使用されるコマンドを中心に載せておきます。全コマンドの詳細については、MMC/SDCそれぞれのスペック・シートを参照してください。
コマンド
インデックス
引数応答データ
転送
省略形説明
CMD0無し(0)R1無しGO_IDLE_STATEソフトウェアリセット。
CMD1無し(0)R1無しSEND_OP_COND初期化開始。
ACMD41(*1)*2R1無しAPP_SEND_OP_CONDSDC専用。初期化開始。
CMD8*3R7なしSEND_IF_CONDSDC V2専用。動作電圧確認。
CMD9無し(0)R1ありSEND_CSDCSD読み出し。
CMD10無し(0)R1ありSEND_CIDCID読み出し。
CMD12無し(0)R1b無しSTOP_TRANSMISSIONリード動作停止。
CMD16ブロック長[31:0]R1無しSET_BLOCKLENR/Wブロック長変更。
CMD17アドレス[31:0]R1ありREAD_SINGLE_BLOCKシングルブロック読み出し。
CMD18アドレス[31:0]R1ありREAD_MULTIPLE_BLOCKマルチブロック読み出し。
CMD23ブロック数[15:0]R1無しSET_BLOCK_COUNTMMC専用。次のマルチブロック読み出し/書き込
みコマンドでの転送ブロック数を設定。
ACMD23(*1)ブロック数[22:0]R1無しSET_WR_BLOCK_ERASE_COUNTSDC専用。次のマルチブロック書き込みコマンド
でのプレ消去ブロック数を設定。
CMD24アドレス[31:0]R1ありWRITE_BLOCKシングルブロック書き込み。
CMD25アドレス[31:0]R1ありWRITE_MULTIPLE_BLOCKマルチブロック書き込み。
CMD55(*1)無し(0)R1無しAPP_CMDアプリケーション特化コマンド。
CMD58無し(0)R3無しREAD_OCROCR読み出し。
*1: ACMD<n>とは、CMD55,CMD<n>のコマンドシーケンスを意味する。
*2: 予約(0)[31], HCS[30], 予約(0)[29:0]
*3: 予約(0)[31:12], Supply Voltage(1)[11:8], Check Pattern(0xAA)[7:0]

SPIレスポンス


コマンドに対するカードのレスポンスには、コマンドによりR1、R2、R3、R7の4タイプがあります。ここではR1とR3だけ説明しておきます。ほとんどのコマンドでは1バイト長のR1が返ります。R1のビット・フィールドは右の図に示すようになっていて、0x00で正常終了となります。何らかのエラーがあった場合は対応するビットが立ちます。R3/R7では、R1レスポンスに続いて32ビットの戻り値が返されます。
処理に時間のかかるコマンドでは、R1bレスポンスとなっています。R1bではR1レスポンスに続いてDO出力にビジー・フラグ(連続したLowレベル)が出力されます。内部処理が終わって0xFFが受信されるまでホストはポーリングしながら待ちます。

SPIモード初期化手順

MMC/SDCは電源ONにより、まずそれ本来のネイティブな動作モードになります。SPIモードに初期化するには次の手順を踏む必要があります。(フロー・チャート)

電源ONまたはカード挿入後

電源投入またはカード挿入により、カードはそれ本来のネイティブな動作モード(SPIモードでない)に入ります。電源が安定またはカード挿入を検出したら1ms以上待って、DI,CSをHighにしてSCLKを74クロック以上入れるとコマンドを受け付ける準備ができます。

ソフトウェア・リセット

SPIポートの伝送クロック・レートを100kHz~400kHzに設定します。CS信号をアサート(Low)してCMD0でソフトウェア・リセットをかけます。CMD0を受信したときカードはCS信号をサンプルし、Lowレベルの場合はSPIモードに入ります。CMD0を送るときはまだSPIモードではないので、コマンド・パケットのCRCは有効な値でなければなりません。SPIモードに入るとCRCチェック機能はDisableになるので、コマンド・パケット送信ルーチンではCMD0とCMD8にだけ有効なCRCバイトでハード・コーディングしておいて良いでしょう。リセットが正常にかかるとカードはアイドル状態に入り、In Idle Stateビットの立ったR1レスポンス(0x01)が返ります。この状態ではまだ読み書き系コマンドは使えません。なお、SPIモードに入った後もCMD59でCRCを有効にすることもできます(普通しないでしょうけど)。

初期化の開始と完了待ち

CMD1を送るとカードは初期化を開始します。初期化の終了をポーリングするため、CMD1を繰り返し送信してレスポンスを調べます。初期化が終了すると、In Idle Stateビットがクリアされた(0x00)レスポンスが返ります。カードによっては初期化に数百ms以上かかることがあるので、タイムアウトには余裕を持っておくべきです。この処理が終了した時点から通常の読み書き動作が可能になります。
SDCではCMD1の代わりにACMD41での初期化が推奨されています。SDCとMMC両方に対応する場合は、先にACMD41を送ってみてrejectされたらMMCと判断してCMD1で初期化を行うのが理想的です。
最後にOCR、CSDを読み込んで各種パラメータを確認します。OCRはカードの電源電圧範囲を示しているので、そのシステムで使用可能かチェックします。もしも範囲外の場合は初期化失敗とします。CSD内のTRAN_SPEEDフィールドはカードの最大動作周波数を示しているので、これに従いSPIポートを再設定します(MMCでは20MHz、SDCでは25MHzが多い)。SPIモードの場合は、速度を制限する状態(OD駆動)が無いので、クロック切り替えなしで最初から20/25MHzでもOKです。2Gバイトのメモリ・カードでは、ブロック・サイズの初期値が512以外の場合があるので、CMD16でブロック・サイズを512バイトに再設定しておきます。

SDC Ver2と大容量SDCの対応方法

CMD0でカードがアイドル状態に入ったら、初期化開始の前にCMD8を送ります(引数は0x1AAで、CRCは有効でなければなりません)。CMD8がrejectされたらSDC V1またはMMCなので、前項の処理で初期化します。CMD8が受け付けられると、R7(R1+32ビットの戻り値)が返ります。戻り値の下位12ビットが0x1AAならそのカードはSDC V2で、2.7V~3.6Vで動作が可能なことを示しています。それ以外の値の場合、そのカードは使用不可なので初期化失敗とします。続いて、ACMD41(引数のHCSビットを立てる)を使って初期化を開始します。初期化が完了したらOCRを読み出します。OCR中のCCS[30]が1なら、そのカードはブロック・アドレッシング方式(ブロック・サイズは512バイト固定)なので、次のセクションで説明するリード/ライト動作ではバイト・アドレスの代わりにブロック・アドレスを使用します。

                         データ転送


データ・パケットとレスポンス

データ転送を伴うトランザクションでは、コマンド・レスポンスに続いてデータブロックが授受されます。データブロックはトークン、データ・ブロック、CRCから成るデータ・パケットとして伝送されます。データ・パケットは右の図に示すフォーマットとなっていて、トークンは3通りあります。このうち、マルチブロック・ライト終了を示すStop Tranトークンはデータ部とCRCを持たず単独で使われます。

シングル・ブロック・リード


読み出し書き込みコマンドの引数はバイトまたはブロック単位の開始アドレスです。上位レイヤにより指定されたアドレスは、そのカードのアドレッシング・モードに応じて適切にスケーリングする必要があります。読み出しコマンドが受け付けられた後、内部で読み出し動作が行われデータ・パケットが送られて来るので、ポーリングしながら待ちます。ホストはデータ・トークンを確認したら、続くデータ・ブロックとCRCを取り込みます。ブロック・サイズはデフォルトでは512バイトになっています(CMD16で変更することもできます)。読み出し中に何らかのエラーが発生したときは、データ・パケットの代わりに1バイトのエラー・トークンが返ります。

マルチ・ブロック・リード


指定アドレスを先頭にした複数のデータ・ブロックが転送されます。MMCでは、転送ブロック数を指定せずにマルチ・ブロック・リードを開始(open-ended multiple block read)した場合、またSDCでは常時、必要なブロック数を転送した後、CMD12で読み出し動作を止めなければなりません。このとき、CMD12の直後に返る1バイトは無効なので、そのバイトを読み捨ててからCMD12のレスポンスを受信します。何らかのエラーが発生したときも同様にCMD12でリード動作を止めます。

シングル・ブロック・ライト


書き込みコマンドが受け付けられたら、データ・パケットを送信します。コマンド・レスポンスとデータ・パケットの間は1バイト以上空けなければなりません。データ・パケットのCRCはチェックされませんが、フィールドとして必要なので適当なデータを送ります。データ・パケットを送ると直後にデータ・レスポンスが返るので、正常に転送されたかどうか確認できます。データ・レスポンスの後はビジーフラグが出力されるので、ポーリングしながら書き込み動作終了を待ちます。
原則として、ひとつのトランザクションの間はCSをアサートに保たなければなりませんが、カードがビジー状態の間は、CSをデアサートしてSPIバスを解放することができます。次にCSをアサートしたときまだビジー状態ならカードは再びDOをLowに駆動します。そこで、ビジー・チェックを先チェック(コマンドおよびデータブロック送信の直前にビジー・チェックを入れる)にすると転送直後にCPUを解放でき、CPU時間を有効に使えます。なお、内部で書き込み処理が開始されるのは、データ・レスポンスのあと1バイト分クロックが走ってからなので、先チェックの場合は注意が必要です。追加クロックのときのCSの状態は問われないので、後で説明するバス解放処理をもって追加クロックとすることもできます。

マルチ・ブロック・ライト


指定アドレスを先頭にした複数のデータ・ブロックが転送されます。直前に転送ブロック数を指定せずにマルチ・ブロック・ライトを開始(open-ended multiple block write)した場合、必要なブロック数を転送した後、転送終了を示すStop Tranトークンを送ってデータ転送を終了させます。Stop Tranトークンに対するビジー・フラグは、1バイト置いて出力されます。なお、SDCでは pre-defined, open-endedにかかわらず、常にStop Tranトークンが必要です。

CSD,CIDの読み出し

これらの読み出しは、シングル・ブロック・リードと同じで、読み出しコマンドを送るとそれぞれデータ・パケット(データ部16バイト)としてホストに送信されます。CSD,CIDおよびOCRの詳細については、MMC/SDCのスペックシートを参照してください。

端子処理と活線挿抜


タイミングによってフローティング状態になる信号線は、プル・アップやプル・ダウンで適切にレベル固定しておくべきです。DI、DOのアイドル状態はHighレベルなので、プルアップが適当です。MMC/SDCの規格によると、これらの端子は50k~100kΩでプルアップすべしとなっています。クロック信号については常にホストから駆動されるので処理は明記されていませんが、浮くタイミングがあるならその定常値、つまりプル・ダウンにするべきでしょう。
電源ON状態でカードの抜き差し(活線挿抜)をするアプリケーションでは、電源回路にもある程度の考慮をしないと誤動作に悩まされることになります。たとえば、何も考えずにシステム電源をソケットに接続すると、カードを挿入した瞬間カードに内蔵されているチップコンへの突入電流でシステム電源がディップします。右の図のAがそれの様子で、600mVの電源ディップが発生しています。これはBODをトリガさせるには十分なレベルです。Bはその対策としてインダクタを入れて突入電流を抑制したものです。ディップは200mV程度となり、何とか許容範囲に入りました。また力業で大容量OSコンを入れば、ほぼ問題のないレベルになります。ただし、OSコンはLDOを発振させる場合があるので注意が必要です。

バス接続の注意点


SPIではCS信号により個々のデバイスが選択され、複数のデバイスをSPIにバス結線することができます。普通のSPIデバイスなら、CS信号によって非同期的にDO信号を駆動/解放しますが、MMC/SDCの場合はこのタイミングが少し異なり、SCLKに同期して駆動/解放が行われます。このため、MMC/SDCと他のSPIデバイスをバス接続したとき、DO出力が衝突する可能性があります。右の図にMMC/SDCのDO駆動/解放のタイミング・チャートと波形を示します(DO信号は見やすいように1/2 Vddに吊ってあります)。このように、MMC/SDCに確実にDO信号を解放させるには、CSをHighにしたあと1バイト分クロックを送っておく必要があります。また、先にビジー・チェックを入れる場合も駆動開始の遅れに注意が必要です。

SPIモードのSCLK周波数


MMC/SDCは、20/25MHzまでの動作が可能です。ネイティブ・モード・コントローラは、当然のことながら最高速度での動作を保証していますが、SPIモードではマイコンのAC特性の問題により、常に最高速度で動作できるとは限りません。実際、いくつかのマイコンでは、計算上の最高周波数が10MHzに満たないものもあります。右の図にSPIモードの動作タイミングを示します。tdはMMC/SDCのSCLK-DO遅延で、SDCでは最大14nsです。tsuはマイコンのMISO入力のセットアップ時間です。これによりSCLKの最高周波数は、
FSCLK(max) = 1 / ((td + tsu) * 2)
ということになります。

書き込み速度の最適化

MMC/SDCのほとんどはメモリ・アレーにNAND型フラッシュ・メモリを使用しています。NAND型はビット単価が安く、大量のデータの書き込み/読み出しを高速に行えるのが特徴です。しかしその反面、データの一部の書き換えは苦手というデメリットがあります。元々フラッシュ・メモリというのは、データを書き込む前に古いデータを消去する必要があり、また消去の最小単位(消去ブロックという)は書き込みの単位よりもずっと大きくなります。NAND型の場合、書き込み/消去のブロック・サイズは512B/16KBで、最近の大容量カードではラージ・ブロック(2KB/128KB)のメモリ・チップも使われています。これは、1セクタ(512B)の書き換えであっても、カード内部ではそのセクタを含む消去ブロック全体(16KBまたは128KB)の読み出し/消去/書き込みが行われていることを意味します。

ベンチマークをとってみる

ここで、RAMの限られた組み込みシステムを想定して、チープな8bit MCU(ATmega64/9.2MHz)を使っていくつかのカードにファイルを読み書きする実験をしてみました。RAMサイズの都合から2KB単位でのwrite(), read()としています。その結果、128MB SDCでは Write: 77kB/秒、Read: 328kB/秒で、512MB SDCでは Write: 28kB/秒、Read: 234kB/秒、128MB MMCでは Write: 182kB/秒、Read: 312kB/秒となりました。
このように、512MB SDCの書き込み速度は128MB SDCの1/3という悲惨な結果になってしまいました。記録メディアは高密度になるほど速くなるものですが、メモリ・カードに限っては逆の傾向となることもあるのです。MMCについてはSDCの数倍とまずまずの速度のようです。今回ダメダメだったSDCですが、高速タイプを謳っているのもあるので、いろいろ試してみると面白いと思います。→その後いくつか試したところ、PQIのSDCはMMCと同等の書き込み性能を示しましたが、パナと東芝の標準タイプはチマチマ書きが苦手なようです。

消去ブロック・サイズの影響

さらに書き込み動作を詳しく調べるため、処理ルーチン内でデータ転送後のビジー時間(ポーリング回数)を出力しています。1行に複数の数値があるのは、マルチ・ブロック・ライトが行われている部分で、行頭から各データブロックのビジー時間で、最後がStopTranトークン後のビジー時間となります。
これらを比較してみたところ、128MBと512MBでは内部処理が異なるようで、128MB SDCではマルチブロック転送が終わる都度、512MB SDCではある程度バッファを持っているらしく、4KB溜まった時点で書き込み処理が行われているようです。このため単純な比較はできませんが、消去ブロック書き換え時間は128MB SDCでは3800、512MB SDCでは30000と見られ、約8倍の時間がかかっていることになります。このことから、テストした 128MB SDCはスモールブロックの、512MB SDCはラージブロックまたは多値記録のメモリ・チップが使われていることが推測できます。もちろん、後者の方が部分書き換えの効率は悪いです。なお、512MB SDCでは先頭の512KB分だけが何故か高速になっています。これはclose()時のFAT/ディレクトリ領域の書き戻し時間から分かります。もしかしたら、FAT領域となるメモリ先頭部分は何か特別な扱いになっているのかも知れません。

書き込み性能の改善策


さて、MMC/SDCの性能を最大限に引き出すためには、一度に書き込むセクタ数を可能な限り大きく(少なくとも消去ブロック単位)取ればいいということが分かりました。つまり、RAMをたくさん用意してfwrite()に大きなデータ・ブロックを渡すということです。ドライバ・レベルでは、カードがマルチ・ブロック・ライトを効率よく実行するため、書き込むセクタ数を予めカードに伝えておく必要があります(pre-defined multiple block writeという)。しかし、そのコマンドはMMCとSDCでは異なる(MMCではCMD23、SDCではACMD23)ので注意が必要です。まぁ、RAMが数KB程度のマイコンでは書き込み性能アップは諦めた方がいいでしょう。それよりも、高速なカードを選んで使う方が賢明といえます。
なお、カード出荷時はFATのデータ領域が消去ブロック境界にアライメントするように区画設定と論理フォーマットがされています。これをMMC/SDCの特性を考慮しないシステム(PC等)で不用意に区画設定や再フォーマットすると、この関係が崩れて効率が低下する場合があります。試しに512MB SDCをPCでFAT32フォーマットしてみたら、PCでのファイルコピー速度が数分の一に低下してしまいました。再フォーマットはMMC/SDC専用機器で行うのが良いようです。

MMC/SDCのライセンス

SD規格(SDメモリ、SDIO)はSDAが開発したものです。したがって、これに対応した製品(カードやホスト機器)を製造販売する事業者はSDA会員である必要があります。たとえばホスト機器の場合、SDカード対応を謳う製品(SDモード/SPIモードに関わらず)が該当します。逆に対応していてもそれを謳わなければ(ナンセンスですが)その必要はありませんし、個人プロジェクトとして完結する場合もライセンスは不要です。SDモジュール等の半製品の場合は、その販売者か最終製品の販売者のどちらかにライセンスが必要になります。
なお、SDAの入会費は$2,000(一般会員)で、ライセンス料は$1,000/年(ホスト機器の場合)です。必要な技術資料が入手できるとかロゴの使用ができるなどのメリットを考えると、とても安いといえます。
MMCの場合、製造販売に関してライセンス等は必要ありませんが、技術資料が公開されておらずMMCA(現在はJEDECに移管)から購入しなければなりません。
http://elm-chan.org/

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。