Está en la página 1de 11

PIC 16F877 con memoria SD

Temas generales de la Memoria SD


El usar como memoria de datos de un PIC, una tarjeta SD, es un trabajo complicado, hasta
develar sus misterios. Hay poca informacin y la ue hay est! confusa y con
euivocaciones. "e ha llevado mas de die# d$as de trabajo poder hacer ue el sistema
funcione. Es mi anhelo, ue con esta informacin les lleve muchos menos d$as.
%o primero de todo es ue ten&an en su PC un pro&rama ue lea y edite las tarjetas SD.
Encontr' el E(plorer y el )inHe(. El primero me dej de leer el puerto *S+ con el adaptador
de tarjeta y el se&undo me result el mejor. +ajarlo de http,--alvareitor.pro&ramasfull.com. El
archivo es )inHe(./0.1.S23.Espanol.b4.5lvareitor.rar. *na ve# bajado e instalado se&6n
las instrucciones, ver!n esta pantalla,
"uestra la memoria SD ue uso para las e(periencias. "aru' con rojo las cosas
importantes.
Est! conectada en un *S+, drive 789, :ormateada en :5;/<, muestro el sector =, ue
comien#a en la direccin <11 he(adecimal, tiene /.> ?+ de capacidad 6til y casi 3 ?+ de
capacidad total. 0/3 +ytes por sector.
%o m!s importante ue uiero mostrar es donde dice 7Sector f$sico @ /A1 y 7Sector l&ico@
=7. %os 7B9 los &rab' yo y comien#an en la direccin l&ica 1(<11. En todos los ejemplos
ue vi en Internet usan esta direccin para &rabar. ;ard' muchos d$as e(perimentando sin
poder &rabar, hasta ue encontr' en un art$culo en in&l's, ue la direccin ue se debe usar
es la f$sica. 4 entonces &rab' y le$ bien. %a direccin l&ica cero corresponde a la f$sica /=C
DDecimalesE, de manera ue en lu&ar de marcar como inicio de &rabacin o lectura la
direccin 1(<11 @ sector = ( 1(311, se deber! calcular D= F /=CE ( 0/3 @ C/<>1 , o sea
1(//>11.
En una se&unda memoria SD de la misma capacidad, el sector l&ico cero es /=0 f$sico, de
manera ue para cada tarjeta se debe mirar el n6mero y hacer los c!lculos, o en mi caso
uso /=C para las dos.
Cuando se&u$ haciendo e(periencias con las &rabaciones, en un caso por mala
pro&ramacin me &rab el sector cero, y perd$ la :5;, con el resultado de 7;arjeta imposible
de leer9 en la PC.
Para formatear la SD, usar el pro&rama oficial de tarjetas SD. Est! en DoGnload SD
:ormatter donde encontrar!n instrucciones de uso.
Instrucciones para formatear. Se bajan de esta direccin.
Cuando la uise formatear, el SD formatter no me la aceptaba, porue en el sector averiado,
supon&o ue est!n los cdi&os ue prote&en las SD contra copias piratas, si se las prote&e.
Entonces la formate' con el )indoGs HP, haciendo botn derecho en I"I PCJ lue&o
seleccionar IadministrarJ lue&o I5dministracin de discosJ. 5parecer! la tarjeta SD si est!
conectada a la PC. 5ll$ se formatea lento y destruir! las protecciones, de manera ue
desaparece la diferencia entre sectores l&icos y sectores f$sicos. Solo ueda el sector
f$sico, y no vale lo ue mostr' arriba. %a direccin donde comien#a la escritura y la lectura se
calcula como Sector K 0/3. Para el sector = es = K 0/3 @ /0=< en decimal o 1(<11.
Encontrar!n ue en firmGare simple, la direccin es 1(//>11 y en el firmGare funcin la
direccin es /0=< decimal. En este 6ltimo caso, no hay diferencia entre f$sico y l&ico, y la
funcin 7comando9 recalcula la direccin a he(adecimal.
Para convertir unidades uso este convertidor. ;ambi'n de la p!&ina pueden bajar el archivo
fuente. D GGG.arossini.com.ar E.
Esta es otra cosa a tener en cuenta. 5 no olvidarse. Es como en los disuetes.
Plaqueta para conectar la Memoria SD al PIC
Este fue otro dolor de cabe#a, porue copi' diseLos de Internet, ue no me sirvieron, porue
al mirar las ondas de clocM y datos con un osciloscopio, deformaban la onda, convirti'ndola
de cuadrada a trian&ular, y nada funcionaba.
Comenc' a diseLar mi propia interfase, con ayuda del osciloscopio y este esuema del
manual de la memoria San DisM, ue se baja de au$.
Nin&6n diseLo usaba resistencias Pull *p, como indica el manual
%as resistencias Pull *p son las de /1O.
%os Pener de =.= Qolt, bajan la tensin de 0 Qolt del PIC a = Qolt apro(imadamente.
El consumo de la ;arjeta est! en el orden de <0 m5.
Este esuema est! en el esuema &eneral del PIC. 4o lo armo en una plaueta separada
para poder usarlo con otros PICs, al i&ual ue la plaueta ue uso para la comunicacin con
el puerto serie.
Comandos usados en SPI para SD
Este trabajo, hecho lo m!s simple posible, es para INICI5%IP52 la tarjeta, ESC2I+I2%5 y
%EE2%5, escribiendo y leyendo bloues de memoria. Se escriben las posiciones de
memoria.
El trabajo si&uiente a publicar ser! el de escribir y leer archivos de te(to. Por ahora son
palabras mayores para m$.
%a estructura de los comandos ue se usan es de < +ytes y es la si&uiente,
%os comandos usados en este trabajo son,
C"D1 1(A1 11 11 11 11 R0 Coloca la tarjeta en inactividad
C"D/ 1(A/ 11 11 11 11 :: 5ctiva la tarjeta
C"D/C 1(0/ HH HH HH HH :: Permite leer un sector de la tarjeta
C"D3A 1(0> HH HH HH HH :: Indica el sector de inicio de la escritura
HH son datos en he(adecimal. "as abajo e(plico como se calculan y escriben.
Cuando enviamos un comando, debemos leer la respuesta. Es de / +yte
Para calcular el nmero del comando para el CMD17 por ejemplo
C"D @ /CS pasado a binario en el pro&rama convertidor es 1b/111/S se le a&re&a 1/ de los
bit C y < y 1 para el bit 0 mas los 0 bit de /111/, uedando 1b1/1/111/. Se lo pasa a
he(adecimal uedando 1(0/, ue es el valor mostrado arriba para comando /C.
Esta es la estructura de la respuesta ue se recibe,
C!M"#D! $%SP&%ST" I#DIC"
C"D1 1(1/ En espera
C"D/ 1(11 5ctivo D%istaE
C"D/C 1(:E F Dbytes le$dos de / a 0/3E %eer un sector de la
tarjeta
C"D3A 1(11 Se&uir con la escritura
1(:E F Dbloue a escribirE 1(E0 2ecepcin correcta
5 1(:E se lo denomina ;oMen.
%ue&o se&uiremos con m!s detalles, en el :irmGare.
%squema
Firm'are
Hay en este trabajo, presentados dos :irmGare,
aE .:irmGare simple.
bE :irmGare funcion.
%os dos hacen lo mismo, escriben un sector de 0/3 +ytes con un car!cter, y lue&o leen solo
una cantidad de direcciones limitada en ese sector &rabado.
El aE est! hecho de la manera m!s simple posible, sin funciones ue puedan hacer perder el
fundamento de la comunicacin SPI. Es un :irmGare did!ctico. Cuando *stedes ha&an el
suyo, podr!n tratar de ahorrar toda la memoria ue uieran, se&uramente.
El bE, usan una funcin llamada comando, ue env$a los comandos, y adem!s funcines
Iniciali#ar, Escribir y %eer.
;iene comunicacin serie, para ue manden a la PC todo lo ue deseen, cuando ha&an
mejoras y necesiten corre&ir o detectar errores. Encontrar!n ue la mayor$a de los
comandos puerto serie est!n comentados, pues se usan solo en caso de problemas y me
resultaron indispensables en su momento. *stedes desTcomentar!n lo ue necesiten.
*s' el PIC /<:>CC, poru' encontr' ejemplos con el en Internet. Se&uir' con el />:A001,
pero presenta al&6n problema pues coincide la comunicacin serie con el SPI, y ello me trajo
conflictos ue deber' solucionar.
*samos cristal de 31"h# para ue al seleccionar el divisor de frecuencia de clocM de SPI a
<A obten&amos una frecuencia del mismo de apro(imadamente =/3Oh#. Dfrecuencia para
iniciali#ar la memoriaE. %a cuenta es 31111111 - <A @ =/3011 H#. %a m!(ima frecuencia
permitida para iniciali#ar es A11 "H#. %ue&o puede lle&ar a 30 "H#.
Comunicaci(n SPI
Iniciali#acin Escritura
%ectura
Detalles del comando 17
Qoid %eerDvoidE
U
CS @ 1S delay.usD/11ES -- Habilitamos la ;arjeta SD
--2espuesta@/3S -- Para ue comience a funcionar el Ghile si 2espuesta viene @ 1.
GhileDspi.readDE V@1(:EEUC"D/CDESW -- "anda el comando /C, ue lee un bloue del tamaLo
indicado por el comando /<, en la direccin 1(//>11D1(<11E
forDi@1SiI/11SiFFEUspi.GriteD1(::ES2espuesta@spi.readDESprintfDX%eo, YcZnZrX,2espuestaESW--
%eer parte del bloue
putsDX;ermine de %eerXES
CS @ /S -- Deshabilitamos la SD
W -- :in de %eer
CS @ 1S -- Habilitamos la ;arjeta SD
2espuesta@/3S -- Para ue comience a funcionar el Ghile si 2espuesta viene @ 1.
GhileD2espuesta V@1(11E -- "anda el comando /C, ue lee un bloue del tamaLo est!ndar
de 0/3 +ytes, en la direccin 1(<11
%a direccin 1(<11 @ sector = K 0/3 +yte@ sector = K 1(311 +yte. Corresponde a sector
l&ico, ue es lo ue se ve en el pro&rama )inHe(, mostrado arriba. Pero nosotros
necesitamos entrar la direccin correspondiente al sector f$sicoS debemos sumar entonces
/=C al n6mero de sector.
%a direccin 1(<11 D%&icoE@ sector D= F/=CEK 0/3 +yte @ C/<>1. En he(adecimal @
1(//>11. %o a&rupamos como 11 1/ /> 11 y as$ lo escribimos en el comando, como se ve
abajo.
El :82 es para leer la respuesta de la SD. Primero se manda un clocM para dar tiempo a
ue lle&ue la respuesta y lue&o se la espera hasta ue lle&ue. Si todo est! bien se pasa a la
rutina si&uiente.
void C"D/CDE
U
spi.GriteD1(0/ES -- Comando
spi.GriteD1(11ES -- Comando
spi.GriteD1(1/ES -- Comando
spi.GriteD1(/>ES -- Comando
spi.GriteD1(11ES -- Comando
spi.GriteD1(::ES -- Comando
forDi@1SiI/3SiFFE Uspi.GriteD1(::ES2espuesta@spi.readDES--printfDX%eo /C, Y(ZnZrX,2espuestaES
ifD2espuesta@@1(:EE breaMSW
W
Detalles del comando )*
Para este trabajo, se usa la misma direccin, de manera ue se debe mirar el comando /C.
Para resol+er pro,lemas
--putsDXPulsar EscribirXESGhileDPulsador @@/ES delay.msD011ES
Spi.GriteD1(:EE S -- +yte Inicial Escritura
forD(@1S(I0/3S(FFE Uspi.GriteDCaracterESW
spi.GriteD1(::E S -- C2C
forDi@1SiI<ASiFFE Uspi.GriteD1(::ES2espuesta@spi.readDES --printfDX2es Escribir, Y(,
YiZnZrX,2espuesta,iES
En rojo, muestro dos partes ue est!n comentadas. Se usan para resolver problemas,
cuando al&o no funciona.
Desmarcando la primera, manda un mensaje por puerto serie, mostrando lo 6ltimo ue hi#o
bien, y deteniendo el pro&rama hasta ue se presione el pulsador. %a se&unda nos muestra
valores le$dos, para ue podamos interpretar la causa del problema.
;ambi'n se usa el pulsador, para poder ver esa seLal en modo [Sin&le9 o sea ue se
deten&a al recibir la seLal, para observacin.
Pantalla del osciloscopio
Estas ondas est!n &eneradas con la rutina 7Prueba 109, del :irmGare. En amarillo es clocM,
en a#ul es el 1(1/.
--KKKKKKKKKKKKKKK Prueba 10 "andamos clocMs continuamente
CS @ /S -- Deshabilitamos la ;arjeta SD
putsDX"ando Pulsos reloj con CS@/ y spi.GriteD1(1/EXES
putsDXpara ver C%8CO y SDIXES
GhileD;rueE Uspi.GriteD1(1/ESW
Fotogra-.a
!tra lista con comandos
Comando, 5r&umentos, 2espuesta, Descripcin,
C"D1 No 2/ 2esetea la tarjeta
C"D/ No 2/ Iniciali#a la tarjeta
C"DR No 2/ Pide a la tarjeta su informacin
CSD
C"D/1 No 2/ Pide a la tarjeta su identificacin
CID
C"D/= No 23 Consulta el estado de la tarjeta
C"D/< \=/..1] %on&itud del
bloue.
2/ Establece la lon&itud Den bytesE del
bloue para los datos en las
operaciones de lectura y escritura.
C"D/C \=/..1] Direccin de
datos.
2/ %ee un bloue del tamaLo indicado
por el comando /<.
C"D3A \=/..1] Direccin de
datos
2/ 2/ 2/ Escribe un bloue del tamaLo
indicado por el comando /<.

También podría gustarte