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 /<.