Está en la página 1de 10

LECTURA/ESCRITURA DE UNA MEMORIA SD/MMC CON EL PIC18F4520

Objetivo: Disear un sistema que permita ilustrar las operaciones de lectura y escritura en
una memoria SD/MMC.
Se definen las siguientes actividades a realizar en el circuito que cumplir el objetivo
planteado:
-

Permitir la eleccin de las operaciones de lectura o escritura en bloques diferentes


de la memoria SD.

Establecer comunicacin va Bus SPI entre el microcontrolador y la memoria SD.

Leer los datos almacenados en un bloque de la memoria SD y mostrarlos en una


LCD.

Escribir un valor digital de 8 bits en un bloque diferente de la memoria SD.

El diagrama de bloques del circuito a disear es el de la figura 1.

Selector de
Lectura/Escritura

Mdulo SPI
SDO

LCD

SDI

Microcontrolador Master

SCk

SDI SS SDO
Memoria
SD/MMC

Fig. 1 Diagrama de bloques: Sistema para Lectura/Escritura de una memoria SD/MMC.

SELECTOR DE LECTURA/ESCRITURA

Este bloque no es ms que una seal digital implementada mediante un switch. En la figura
2 se observa a switch con la etiqueta Escritura/Lectura y la referencia SW, nombre
correspondiente a la variable booleana con la que se decidir entre las operaciones de
escritura (SW = 0) y lectura (SW = 1).
VDD

R1
2.4k

SW1
Ecritura/Lectura

Fig. 2 Selector de Escritura/Lectura

MEMORIA SD/MMC

MMC, son la siglas de MultiMediaCard, un tipo de tarjetas de memoria Flash desarrolladas


por Siemens AG y Scandisk en 1997. Al poco tiempo (1999) una mejora fue presentada
bajo el nombre SD (Secure Digital), siendo acogido por ms de 400 marcas de diferentes
productos baja sus las modalidades mini SD y micro SD (figura 3).
Dos son los protocolos de comunicacin admitidos por este tipo de memorias, el llamado
modo Bus SD y el modo SPI. La figura 4 y las tablas 1 y 2 muestran los pines para ambos
modos de comunicacin.

Fig. 3 Tarjetas mini SD y micro SD


Fuente: www.xneox.com

Fig. 4 Pinout tarjetas SD


Fuente: www.gerdsLAB.com

Tabla 1 Pines en el modo Bus SD


Pin

Nombre

Descripcin

CD/DAT3

Detencin de la tarjeta

CMD

Comando

Vss

GND

Vdd

Alimentacin

Clk

Reloj

Vss

GND

DAT0

Lnea de datos

DAT1

Lnea de datos

DAT2

Lnea de datos

Fuente: Henao, Carlos (2010)

Tabla 2 Pines en el modo SPI


Pin

Nombre

Descripcin

CS

Seleccin

DI

Entrada de satos

Vss

GND

Vcc

Alimentacin

Clk

Reloj

Vss

GND

D0

Salida de datos

RSV

Reservado

RSV

Reservado

Fuente: Henao, Carlos (2010)

Comandos en el modo SPI

Las memorias SD operan mediante comandos con el formato particular de la tabla 3. En


ella se observa que cada comando consiste de una secuencia de 6 Bytes cuya codificacin
depende del tipo de accin a realizar [datasheet memorias].
Tabla 3 Secuencia de comandos en el modo SPI
Byte 1
Bytes 2 al 5
Byte 6
7 6
0 1

0
Cdigo

31

0
Cdigo

CRC 1

Fuente: Henao, Carlos (2010)

En este trabajo se har uso del breve subconjunto de comandos descritos en la tabla 4.
Tabla 4 Comandos para operar con la memoria SD en modo SPI
Comando

Bytes

Descripcin

Respuesta
esperada

CMD0

0x40 0x00 0x00 0x00 0x00 0x95

Reset

CMD1

0x41 0x00 0x00 0x00 0x00 0xFF

Inicializacin

CDM16

0x50 0x00 0x00 0xZZ 0xZZ 0x95

Configuracin de bloques

CMD24

0x58 0x00 0x00 0xYY 0xYY 0x95

Escritura

CMD17

0x51 0x00 0x00 0xYY 0xYY 0x95

Lectura

0 - FE

Fuente: Henao, Carlos (2010)

En la tabla 4, comandos CMD16, CMD24 y CMD17 se especifican los Bytes 0xZZ y


0xYY. Ellos corresponden, respetivamente, al tamao de los bloques (0xZZ) en los que ha
de organizarse el acceso al contenido de la memoria y el nmero de la direccin a acceder
(0xYY). Una explicacin ms concreta se ofrecer en la seccin correspondiente a la
programacin.

Mdulo MMC de ISIS Proteus

ISIS Proteus posee un mdulo para simular a las memorias SD/MMC, identificado como
MMC. La figura 5 corresponde a este mdulo.

DI
DO
CLK

Card
Multimedia

CS

DI
DO
CLK

CS

Card
Multimedia

Fig. 5 Mdulo MMC de ISIS Proteus

Fig. 6 Propiedades del mdulo MMC de ISIS Proteus

La figura 6 permite observar que entre otras cosas se puede fijar el tamao de la memoria
(8 MB en este caso) y asociar un archivo (SD.IMA) contentivo de su informacin, el cual
puede explorarse mediante un editor hexadecimal. Para este trabajo se usar la aplicacin
WinHex, de la cual puede descargarse gratuitamente una versin de prueba completamente
funcional ( http://winhex.uptodown.com/ ), cuya nica limitacin es un tamao mximo de
20 KB para los archivos que requieran guardarse. La figura 7 muestra el aspecto de la
aplicacin y el archivo SD.IMA asociado al mdulo MMC de Proteus.

Fig. 7 Archivo SD.IMA abierto en WinHex.

CIRCUITO FINAL DEL LECTOR/ESCRITOR DE UNA MEMORIA MMC/SD


M1
MMC
Card
Multimedia

LCD1

Rd=1/Wr=0

D0
D1
D2
D3
D4
D5
D6
D7

SW1

7
8
9
10
11
12
13
14
B3
B4

VSS

B2

U1

B5

RS
RW
E
B1

4
5
6

VSS
VDD
VEE

1k

1
2
3

CS

20 MHz

R8

2
3
4
5
6
7
14
13

B0

+5V

B[0..5]

B2 33
B3 34
B4 35
B5 36
B0 37
B1 38
39
40

50%

Vdd

RA0/AN0/C1INRC0/T1OSO/T13CKI
RA1/AN1/C2INRC1/T1OSI/CCP2B
RA2/AN2/C2IN+/VREF-/CVREF
RC2/CCP1/P1A
RA3/AN3/C1IN+/VREF+
RC3/SCK/SCL
RA4/T0CKI/C1OUT
RC4/SDI/SDA
RA5/AN4/SS/HLVDIN/C2OUT
RC5/SDO
RA6/OSC2/CLKO
RC6/TX/CK
RA7/OSC1/CLKI
RC7/RX/DT
RB0/AN12/FLT0/INT0
RB1/AN10/INT1
RB2/AN8/INT2
RB3/AN9/CCP2A
RB4/KBI0/AN11
RB5/KBI1/PGM
RB6/KBI2/PGC
RB7/KBI3/PGD

RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5/P1B
RD6/PSP6/P1C
RD7/PSP7/P1D
RE0/RD/AN5
RE1/WR/AN6
RE2/CS/AN7
RE3/MCLR/VPP

15
16
17
18
23
24
25
26
19
20
21
22
27
28
29
30

RN1
1
2
3
4
5
6
7
8

8
9
10
1

16
15
14
13
12
11
10
9
1k

1
2
3
4
5
6
7
8

Lectura del bloque 0 de la MMC

ON

PIC18F4520

Escritura en el bloque 1 de la MMC

+5V

DSW1
DIPSW_8

OFF

+5V

16
15
14
13
12
11
10
9

VSS

DI
DO
CLK

+5V

LM032L

10k

Universidad de Carabobo
VSS

Facultad de Ingenieria
Escuela de Elctrica
Diseo Digital

PROYECTO SPI - 2 (MICRO SD)

Fig. 8 Circuito final Lector/Escritor de una memoria SD/MMC

PROGRAMA DEL LECTOR/ESCRITOR DE UNA MEORIA SD/MMC

Init

CDM1: SPI_Write(0x41),
SPI_Write(0x00), SPI_Write(0x00),
SPI_Write(0x00), SPI_Write(0x00),
SPI_Write(0xFF),

Configuracin:
PORTA: LCD, LsB PORTB: Entrada digital,
Chip_Select (RB14)

InicializacinLCD,
SPI como Master
Chip_Select: Off

Esperar respuesta de la SD

No

Mostrar CMD1 Fall

Resp=0

Esperar 20 ciclos mientras se


inicializa la MMC

Si
Chip_Select: On

Mostrar CMD1 Ok

Esperar 20 ciclos mientras se


inicializa la SD

Pausa entre CMD

CDM0: SPI_Write(0x40),
SPI_Write(0x00), SPI_Write(0x00),
SPI_Write(0x00), SPI_Write(0x00),
SPI_Write(0x95),

CDM16: SPI_Write(0x50),
SPI_Write(0x00), SPI_Write(0x00),
SPI_Write(0x02), SPI_Write(0x00),
SPI_Write(0xFF),

Esperar respuesta de la SD
Esperar respuesta de la SD

Mostrar CMD0 Fall

No

Mostrar CMD16 Fall

No

Resp=0

Resp=1
Si
Si
Mostrar CMD16 Ok

Mostrar CMD0 Ok

Pausa entre CMD


Pausa entre CMD
Fin Init

Fig. 9 Rutina de Inicializacin Init

Main

Lectura

Escritura

Rutina Init

CDM17: SPI_Write(0x51),
SPI_Write(0x00), SPI_Write(0x00),
SPI_Write(0x00), SPI_Write(0x00),
SPI_Write(0xFF),

SW

Esperar respuesta de la SD

No

Mostrar CMD17 Fall

Resp=0

CDM24: SPI_Write(0x58),
SPI_Write(0x00), SPI_Write(0x00),
SPI_Write(0x04), SPI_Write(0x00),
SPI_Write(0xFF),

Esperar respuesta de la SD

Mostrar CMD24
Fall

No

Resp=0

Si

Si
SPI_Write(0xFE)

Esperar Token de la SD

No

Mostrar Token Fall

Dato

PortB

Resp=FE
i=512
Si

Desde i=0 a 511


i<512

Mostrar Token Ok
SPI_Write(Dato)
CRC, CRC
Pausa

CRC, CRC,
Mostrar take[i]

i=512

Esperar respuesta de la SD
Desde i=0 a 511
i<512
Mostrar Escritura Fallo

take[i]

No

Resp=05

SPI_Read(buffer),
Si
Mostrar Escritura Ok

Fig. 10 Programa Principal Lector/Escritor de una memoria SD/MMC

El diagrama de flujo de la figura 9 corresponde a una rutina o subprograma denominado


Init. En l se envan va SPI los comandos de Reset (CMD0), inicializacin (CMD1) y de
definicin de la longitud de los bloques a leer o escribir en la memoria (CMD16). Es
necesario resaltar el valor de los Bytes 4 y 5 del CMD16, que en conjunto forman la
cantidad 0x0200, equivalente a 512 en decimal; con lo cual se establece una longitud de
512 Bytes para organizar en bloques a las direcciones de la memoria. De este modo, el
bloque 0 abarca las direcciones 0000 a 01FF (0 - 511), el bloque 1 va desde 0200 a 03FF
(512 a 1023), el bloque 2 va desde 0400 a 05FF (1024 a 1535); y as sucesivamente.
Luego de enviar cada comando, la memoria responde con un Byte especfico, tal como se
resume en la tabla 4. Cuando se recibe la respuesta esperada el programa prosigue responde
el envo del siguiente comando, pero cuando la respuesta falla se muestra un mensaje de
error y se cae en un bucle infinito del cual solo puede salirse mediante una accin de reset.
En la figura 10 se presenta el diagrama de flujo del programa principal. En este se
comienza ejecutando la rutina Init y luego se discriminan las acciones de lectura y escritura
en la memoria mediante la entrada digital SW. Si se ha escogido la lectura (SW = 1), se
enva el CMD17, se espera un 0 como respuesta de la memoria y se contina con la
espera de otro Byte (0xFE) conocido como Token (testigo). La correcta recepcin del Token
es la condicin que permite acceder al contenido de un bloque entero dentro de la memoria;
en este caso el bloque 0, tal como se indica en los Bytes del CMD17. Finalmente se debe
esperar el tiempo correspondiente a los ciclos de lectura de dos Bytes, conocidos como
CRC.
Si SW = 0, se procede a escribir en la memoria. Para ello se enva el CMD24, indicando
dentro del mismo la direccin de inicio de un bloque en el que efectivamente se guardarn
datos. En este ejemplo al concatenar los Bytes 4 y 5 del CMD24 se forma el nmero
0x0400, indicativo de que se acceder al bloque 2 que inicia en la direccin 1024 y se
prolonga 512 direcciones ms all. La respuesta esperada por parte de la memoria es un
0, al cual debe responderse con un Token (0xFE) antes de proceder al envo de los datos
que ocuparn el bloque. Un solo valor digital de 8 bit, ledos desde el puerto B se utilizar
para verificar la escritura en todo el bloque. Cuando se ha completado la escritura del
bloque la memoria responde con un 05.