Las tarjetas MultiMedia Card y SD
Jordi Bartolomé 1-6-2004

1-Memorias no volátiles
2-Las tarjetas MultimediaCard
3-Conexiones y señales en las tarjetas MMC
4-Las tarjetas SD
5-Conexiones y señales en las tarjetas SD
6-Funcionamento general del protocolo
7-Comandos MODO SPI
8-Respuestas MODO SPI
9-Bloques de datos MODO SPI
10-Reset de la tarjeta MODO SPI
11-Activar la inicialización de la tarjeta MODO SPI
12-Escritura de un bloque en la tarjeta MODO SPI
13-Lectura de un bloque en la tarjeta MODO SPI
14-Rutinas para un uC AVR-ATmega

1-Memorias no volátiles
Antes de entrar en detalles sobre las memorias flash Multimedia Card y SD , es interesante conocer en que contexto se ha desarrollado la tecnología que las implementa y cuales la han precedido a lo largo de las últimas décadas.

Para comenzar, es importante saber que las memórias se pueden clasificar siguiendo distintos criterios: política de acceso (FIFOs, LIFOs, CAMs ...), persistencia de la información (volátiles, no volátiles) .... Según el criterio de persistencia de la información, las tarjetas Multimedia Card ( y todas las demás tarjetas flash) se incluyen en el grupo de las memorias no volátiles, es decir en el grupo de memorias a las que no es necesario mantener alimentación para conservar la información. Este grupo se puede estructurar en los siguientes subgrupos:

-ROMs (Read Only Memory) : son memorias cuyo contenido se fija durante el proceso de manufactura, y no puede ser modificado por el controlador, únicamente puede ser leído. Evidentemente este tipo de memorias es inutil para el alamcenamiento de información por parte de un usuario convencional, y únicamente se utiliza en producciones industriales, en los que se necesita realizar una tirada numerosa de integrados preprogramados.

-PROMs (Programable Read Only Memory) : vienen a ser ROMs que pueden ser programadas una única vez por el usuario mediante el programador adecuado. Tras ser programadas, sobre estas solo se pueden hacer operaciones de lectura, de forma que si se produce algún error durante la programación esta restará inservible. Al igual que en el caso anterior, este tipo de memorias es inutil para el alamcenamiento de información por parte de un usuario convencional, ya que este debería desechar un integrado en cada nueva escritura, algo absurdo. Estas se suelen usar en placas en que durante el proceso de su fabricación necesitan ser programadas con un contenido especifico para ellas.

-EPROMs (Erasable Programable Read Only Memory) : estas son memorias no volátiles que pueden ser borradas y escritas repetidas veces. La operación de borrado elimina por completo toda la información alamcenada en estas, es decir que no permiten el borrado de datos puntuales como sectores o bytes. Si se borra, se ha de borrar todo su contenido. Otro gran inconveniente de estas es que para borrarlas es necesario exponerlas a una fuente de luz ultravioleta durante unos 15 minutos, lo que las convierte en una solución poco práctica para aplicaciones dirigidas a un usuario convencional, ya que su uso implicaría que este tuviese que desmontarla de la placa y esperar 15 minutos para borrarla cada vez que se quisiera inicializar, a parte de que también le obligaría a disponer de una lámpara de UV. Otra desventaja para los desarrolladores del hardware, es que para escribir en estas es necesario utilizar tensiones de 12 o 24V lo que implica añadir algunos componentes al circuito por tal de alcanzar estas tensiones.

-EEPROM o E2PROM (Electrically Erasable Programable Read Only Memory) : son memorias con las mismas prestaciones que las EPROM pero con la ventaja de que la operación de borrado se puede realizar electrónicamente, es decir: para borrarlas no hace falta exponerlas a una fuente de luz ultravioleta. Esto evita la engorrosa tarea de tener que extraerlas de la placa. Además, como se pueden borrar eléctricamente, es posible borrar o escribir en estas palabras individuales desde el propio controlador sin necesidad de ninguna lámpara ni hardware adicional. Las memorias EEPROM se suelen utilizar cuando las operaciones predominantes son las de lectura, ya que en estas el tiempo de escritura es bastante mayor.

-Flash: este tipo de memoria, se puede borrar eléctricamente al igual que las EEPROM (hay quien las considera como un subtipo de EEPROM). La principal diferencia con estas últimas, es que la tecnología de tipo Flash, permite una mayor densidad de integración lo que se traduce en capacidades de almacenamiento mayores, a parte de que el coste de estas también es inferior al de las EEPROM. Otra ventaja de las memorias Flash respecto a las EEPROM es su mayor velocidad de acceso.

La tecnolgia Flash puede ser de dos tipos: NOR o NAND. La tecnología NOR (Toshiba 1984) fue la primera en aparecer y se caracteriza por permitir un gran número de ciclos de borrado escritura (de 10000 a 100000) y por ofrecer un acceso "completamente aleatorio" a su contenido. La tecnologia de tipo NAND apareció posteriormente (Toshiba Samsung 1989) permitiendo velocidades de lectura y escritura mayores que la tecnologia NOR, diez veces más ciclos de borrado escritura, y una mayor densidad de integración. El gran inconveniente de estas últimas es que el acceso a su contenido no es "completamente aleatorio" y requieren ser accedidas de forma secuencial, lo que las hace inadecuadas en algunos contextos.

Así la tecnoliga NOR sigue siendo útil en aplicaciones, como la del almecenamiento de código de programa en microcontroladores en que el acceso a la información debe ser hecho de forma selectiva en función del flujo de ejecución del código. La tecnología NAND es mayoritariamente utilizada en todas las aplicaciones de almacenamiento masivo de datos, y por tanto la más utilizada en las tarjetas flash comerciales.

La mayor capacidad, y el reducido coste han convertido a las memorias Flash en el tipo de memoria no volátil más utilizado en dispositivos móviles. Estas se venden en forma de integrados, existiendo infinidad de modelos con diferentes prestaciones orientados al mercado industrial, y también en forma de tarjetas externas orientadas al mercado de consumo (cámaras, agendas electrónicas, teléfonos móviles ...). Existen diferentes tipos y modelos de tarjetas Flash, todas con prestaciones similares en cuanto a capacidad, tamaño, y precio. Actualmente los tipos más extendidos son: Compact Flash, SD-MultiMediaCard (y sus versiones Mini), Smart Media , Memory Stick y XD.

Distintos tipos de tarjetas de memoria Flash disponibles en el mercado. De izquierda a derecha: MemorySitck (Sony), XD (Olympus Optical y Fuji Photo Film), SD/MultiMediaCard , SmartMedia (Olympus Optical y Fujy Foto Film) , Compact Flash y MiniSD.

Todas estas son relativamentte económicas, fáciles de encontrar (incluso en supermercados!) y tienen un tamaño reducido, cabiendo sin problemas en la cartera o monedero.

Las tarjetas Multimedia Card disponen de un protocolo de acceso serie que reduce el número de pins necesarios para accederla, simplificando a su vez el hardware necesario para su control.

2-Las tarjetas MultimediaCard
Las tarjetas MultiMediaCard son dispositivos de almacenamiento Flash muy versátiles debido a su gran capacidad, y reducido tamaño y precio. Esto las convierte en una opción muy interesante a usar en dispositivos móviles como teléfonos, agendas electrónicas o videojuegos portátiles

Tarjeta MultiMediaCard con sus pins numerados

Desde el punto de vista técnico, estas pueden trabajar mediante dos protocolos serie distintos: el protocolo MultiMediaCard propiamente dicho, y el protocolo SPI. El primero de los protocolos es el más potente ya que permite más operaciones que el segundo, pero por otro lado, el segundo es más fácil de implementar si se dispone de una interfaz SPI y es suficiente para la mayoría de aplicaciones. De hecho el protocolo SPI se puede considerar como una versión reducida del protocolo MultiMediaCard.

3-Conexiones y señales en las tarjetas MMC
El protocolo de acceso SPI se puede implementar mediante cualquier controlador (ordenador personal, microcontrolador ...) que disponga de un canal SPI hardware o emulado por software. Cuando se opera en este modo los pins de la tarjeta MMC se denominan del siguiente modo:

# Pin:

Nombre:

Tipo:

Descripción SPI:

1

!CS

Entrada

Chip Select (activo a 0)

2

DataIn

Entrada

Línea de datos y comandos hacia la tarjeta.

3

VSS1

Alimentación

Masa

4

VDD

Alimentación

Alimentación

5

CLK

Entrada

Clock

6

VSS2

Alimentación

Masa

7

DataOut

Salida

Línea de datos y status de la tarjeta al microcontrolador.

Líneas de la interfaz SPI en una tarjeta MMC

!CS permite al controlador seleccionar la tarjeta sobre la cual quiere operar, así cuando CS vale 0 la tarjeta se encuentra seleccionada y lista para operar. Este pin puede ser controlado por cualquier pin de salida del controlador.
DataIn es la entrada de datos serie a la tarjeta y debe estar conectada a la salida MOSI de la interfaz SPI del controlador.
DataOut es la salida de datos serie de la tarjeta y debe estar conectada al pin MISO de la interfaz SPI del controlador.
CLCK es la señal de reloj generada por el controlador y es la que marca el ritmo de transferencia de la información serie entre ambos, así los datos se capturan o transmiten por la tarjeta al ritmo marcado por esta señal.
VDD es el pin de alimentación y VSS1 y VSS2 son los pins de masa.

Tanto la tensión de alimentación como las señales deben encontrarse en el rango de los 2,6 y 3,7V.


4-Las tarjetas SD
Las tarjetas SD son muy similares a las MultiMediaCard a todos los niveles. No obstante, la primera diferencia que salta a la vista es el número de pines: las tarjetas SD tienen 9 pines, mientras que las MMC 7. Esto es debido a que las tarjetas SD disponen de otros modos de acceso y protocolos que mejoran la seguridad en el intercambio de datos. No obstante a estas también se puede acceder mediante el mismo protocolo SPI que el utilizado en las MMC.

.
Tarjeta SD con sus pins numerados

Los siguientes apartados muestran como acceder las tarjetas MultiMediaCard y SD mediante el protocolo SPI.

5-Conexiones y señales en las tarjetas SD
Cuando se opera en este modo los pins de la tarjeta SD se denominan:

# Pin:

Nombre:

Tipo:

Descripción SPI:

9 DAT2 Reservado No utilizado en modo SPI

1

!CD (!CS)

Entrada

Chip Select (activo a 0)

2

CMD (DataIn)

Entrada

Línea de datos y comandos hacia la tarjeta.

3

VSS1

Alimentación

Masa

4

VDD

Alimentación

Alimentación

5

CLCK

Entrada

Clock

6

VSS2

Alimentación

Masa

7 DAT0 (DataOut) Salida Línea de datos y status de la tarjeta al microcontrolador.

8

DAT1

Reservado

No utilizado en modo SPI

Líneas de la interfaz SPI en una tarjeta SD

!CD (equivalente al !CS de la MMC) permite al controlador seleccionar la tarjeta sobre la cual quiere operar, así cuando CD vale 0 la tarjeta se encuentra seleccionada y lista para operar. Este pin puede ser controlado por cualquier pin de salida del controlador.
CMD (equivalente al DataIn de la MMC) es la entrada de datos serie a la tarjeta y debe estar conectada a la salida MOSI de la interfaz SPI del controlador.
DAT0 (equivalente al DataOut de la MMC) es la salida de datos serie de la tarjeta y debe estar conectada al pin MISO de la interfaz SPI del controlador.
CLCK es la señal de reloj generada por el controlador y es la que marca el ritmo de transferencia de la información serie entre ambos, así los datos se capturan o transmiten por la tarjeta al ritmo marcado por esta señal.
VDD es el pin de alimentación y VSS1 y VSS2 son los pins de masa.
DAT1 y DAT2 no se utilizan en el modo SPI

La alimentación y las señales deben encontrarse en el rango de los 2,6 y 3,7V.


6-Funcionamento general del protocolo
Básicamente el protocolo SPI consiste en el intercambio de información entre el controlador (master) y la tarjeta (slave). Este intercambio se lleva a cabo mediante el envío de comandos por parte del controlador y de respuestas por parte de la tarjeta. Así, en la lectura, el controlador envía el comando de petición de lectura a la tarjeta y esta le envía la respuesta de confirmación seguida del bloque de datos con la información contenida a partir de la dirección solicitada. En la escritura el proceso es parecido, el controlador indica a la tarjeta mediante el comando de escritura que quiere escribir información en una determinada dirección, esta le responde indicando que esta lista y a continuación el controlador envía el bloque de datos a escribir. Las operaciones que no requieren intercambio de datos funcionan de igual forma pero sin usar bloques de datos.

Ejemplo de comunicación. Lectura de un bloque.

7-Comandos MODO SPI
Los comandos son bloques de bytes con un formato fijo:
Byte 1
Byte 2-5
Byte 6
7
6
5-0
31-0
7
0
0
1
Command
Command Argument
CRC
1
Estructura de un comando

La tarjeta identifica los comandos porque el primer byte de estos (byte 1) siempre comienza por 01, el resto de bits del primer byte contiene el numero de comando codificado en binario natural. Así el primer byte correspondiente al comando 0 (CMD0) seria: 01000000, o el primer byte correspondiente al comando 39 (CMD39) sería: 01100111. Los siguientes 4 bytes ( bytes 2 –5) contienen los argumentos del comando. En los comandos que no requieren argumentos estos valen 0. El último byte (byte 6) es el byte de CRC para la verificación de errores y en realidad en el protocolo SPI no se utiliza, a no ser que en el registro de configuración se especifique que se desea utilizar CRC.

Toda la comunicación entre la tarjeta y el controlador se realiza según el orden del esquema, de izquierda a derecha, es decir que primero se transmite el bit de mas peso (bit 7) del byte 1, y por último el bit de menos peso (bit 0) del byte 6, es decir es una transferencia More Significant Bit First (MSB First). Estos son algunos de los principales comandos:

Comando:

Argumentos:

Respuesta:

Descripción:

CMD0

No

R1

Resetea la tarjeta

CMD1

No

R1

Inicializa la tarjeta

CMD9

No

R1

Pide a la tarjeta su información CSD

CMD10

No

R1

Pide a la tarjeta su identificación CID

CMD13

No

R2

Consulta el estado de la tarjeta

CMD16

[31..0] Longitud del bloque.

R1

Establece la longitud (en bytes) del bloque para los datos en las operaciones de lectura y escritura.

CMD17

[31..0] Dirección de datos.

R1

Lee un bloque del tamaño indicado por el comando 16.

CMD24

[31..0] Dirección de datos

R1 R1 R1

Escribe un bloque del tamaño indicado por el comando 16.

Principales comandos del protocolo de acceso mediante SPI

 

8-Respuestas MODO SPI
Las respuestas de la tarjeta son bloques formados por 1 o 2 bytes, dependiendo del tipo de respuesta que se trate. El tipo de respuesta es función del comando, es decir que cada comando tiene asociado un tipo de respuesta.

Bit

 

0

Idle State

1

Erase Reset

2

Illegal Command

3

Com CRC Error

4

Erase_Seq_Error

5

Address Error

6

Parameter Error

7

0

Respuestas R1 y RB


Bit

0

0

1

WP Erase Skip

2

Error

3

CC Error

4

Card ECC Failed

5

WP Violation

6

Erase Parameter

7

Out of Range

0

In Idle State

1

Erase Reset

2

Illegal Command

3

Com CRC error

4

Erase_Seq_Error

5

Address Error

6

Parameter Error

7

0

Respuesta R2

9-Bloques de datos MODO SPI
Los bloques de datos comienzan siempre con el byte 0xFE, a este le siguen los bytes de datos y por último los 2 bytes de CRC. El número de bytes de datos depende de la longitud de bloque definida mediante el comando 16, y esta puede ir de 1 hasta 512 bytes (por defecto 512). Por tanto sumando a los bytes de datos el byte de incio y los dos bytes de CRC la longitud total del bloque de datos puede variar entre 4 y 515 bytes. Como por defecto en el protocolo de acceso SPI no se consideran los bytes de CRC, estos pueden tomar cualquier valor.

10-Reset de la tarjeta MODO SPI
Por defecto, al arrancar la tarjeta, esta se encuentra en modo MultiMediaCard. Para que entre en modo SPI, hay que enviarle el comando 0 mientras se mantiene activa la señal ¡CS (¡CS=0), pero antes de todo, para poder iniciar la comunicación por el bus hay que enviar como mínimo 74 ciclos de clock a la tarjeta. Así para hacer el reset de la tarjeta y prepararla para trabajar en modo SPI hay que seguir la siguiente secuencia:

-Dar como mínimo 74 ciclos de clock, es decir enviar unos 10 bytes a través de la SPI.
-Activar la señal ¡CS (¡CS=0).
-Enviar el comando 0 con el CRC bien calculado, ya que todavía no estamos en modo SPI, por lo que sí se considera el CRC. De hecho la secuencia del comando 0 siempre es la misma: 0x40,0x00,0x00,0x00,0x00,0x95
-Esperar el byte de respuesta que ha de ser 00000001 (tarjeta en modo idle).

11-Activar la inicialización de la tarjeta MODO SPI
Una vez reseteada y en modo SPI, hay que hacer la inicialización de la tarjeta, para ello se debe enviar repetidamente el comando 1 hasta que el bit "idle" en la respuesta R1 sea 0. Esto indica que la tarjeta ha completado su inicialización y se encuentra lista para recbir nuevos comandos. La secuencia general es esta:

- Activar el pin ¡CS (¡CS=0).
- Enviar el comando 1: 0x41,0x00,0x00,0x00,0x00, 0xXX . Como la tarjeta ya está en modo SPI el CRC puede tomar cualquier valor.
- Esperar el byte de respuesta, que ha de ser 00000000 (bit "idle" ha de estar 0: tarjeta lista).
Si la respuesta no es 0, reenviaremos el comando 1, hasta que lo esté. Puede llevar algunos reintentos.

12-Escritura de un bloque en la tarjeta MODO SPI
Una vez inicializada la tarjeta, para escribir un bloque en esta, hay que enviar el comando 24 con la dirección de inicio a partir de la cual se desean guardar los datos. Si todo va bien la tarjeta enviará tres respuestas R1 repetidas informando al controlador que ya puede enviar el bloque de datos, que ha de tener una longitud de 512 bytes (en la escritura solo se permiten 512 bytes) más el byte de inicio de bloque de datos y los dos bytes de CRC. La secuencia a seguir es:

-Activar el PIN¡CS (¡CS=0).
-Enviar el comando 24 0x58, 0xXX,0xXX,0xXX,0xXX,0xYY. Los 4 bytes XX corresponden a la dirección a partir de la cual se quieren guardar los datos. 0xYY corresponde al byte de CRC y como la tarjeta esta en modo SPI pueden tomar cualquier valor ya que no se consideran.
-Si todo va bien la tarjeta responde con el byte de respuesta R1 tres veces consecutivas.
-Enviar a la tarjeta el bloque de datos que consiste en:
    - 1 byte de inicio de bloque de datos 0xFE
    - 512 bytes con los datos a guardar.
    - 2 bytes de CRC

-Mientras la tarjeta esta ocupada guardando el valor, irá enviando bytes indicando que está ocupada, y cuando finalice la escritura enviará un byte de confirmación.

13-Lectura de un bloque en la tarjeta MODO SPI
Para leer un bloque de la tarjeta hay que enviar a esta el comando 17 con la dirección de inicio de lectura en los bytes de argumento. La dirección puede tomar cualquier valor comprendido dentro del rango de direcciones válidas de la tarjeta pero todo el bloque leído debe estar dentro de un mismo sector físico. A continuación la tarjeta envía un byte de respuesta R1 seguido del bloque de datos, que comienza por 0xFE, continua con los bytes de datos y finaliza con los 2 bytes de CRC que no se usan. El número de bytes de datos depende del tamaño de bloque que se haya programado mediante el comando 16, y en la lectura puede ir de 1 a 512. La secuencia a seguir es la siguiente:

-Activar el PIN ¡CS (¡CS=0).
-Enviar el comando 17 0x51,0xXX,0xXX,0xXX,0xXX,0xYY. Los 4 bytes XX corresponden a la dirección a partir de la cual se quieren leer los datos. 0xYY corresponde al byte de CRC y como la tarjeta esta en modo SPI puede tomar cualquier valor ya que no se considera.
-Si todo va bien, la tarjeta responde con un byte de respuesta R1, seguido del bloque de datos con la información solicitada y que el controlador tendrá que ir capturando. Esta tiene la misma estructura que los bloques de datos utilizados en la escritura:
    -1 byte de inicio de bloque de datos 0xFE
    -n bytes con los datos a guardar.
    -2 bytes de CRC.
    -Si se produce un error durante la comunicación, la tarjeta no transmitirá ningún dato y en lugar de estos enviará un byte indicador de error.

14-Rutinas para un uC AVR-ATMega
El siguiente fichero contiene las rutinas C que implementan el acceso a una tarjeta MMC en modo SPI desde un microcontrolador AVR-ATMega:

Descargar MMC.c

Esta es la versión mejorada y pulida del driver anterior para el acceso a tarjetas SD:

Descargar SDMMC.zip

Regresar al índice de documentos