Download - PIC 16F877 Con Memoria SD
7/16/2019 PIC 16F877 Con Memoria SD
http://slidepdf.com/reader/full/pic-16f877-con-memoria-sd 1/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, hastadevelar sus misterios. Hay poca información y la que hay está confusa y conequivocaciones. Me ha llevado mas de diez días de trabajo poder hacer que el sistemafuncione. Es mi anhelo, que con esta información les lleve muchos menos días.
Lo primero de todo es que tengan en su PC un programa que lea y edite las tarjetas SD.Encontré el Explorer y el WinHex. El primero me dejó de leer el puerto USB con el adaptador de tarjeta y el segundo me resultó el mejor. Bajarlo de http://alvareitor.programasfull.com. Elarchivo es WinHex_15.0_SR2_Espanol_bY_Alvareitor.rar. Una vez bajado e instalado segúnlas instrucciones, verán esta pantalla:
Muestra la memoria SD que uso para las experiencias. Marqué con rojo las cosasimportantes.
Está conectada en un USB, drive “O”, Formateada en FAT16, muestro el sector 3, quecomienza en la dirección 600 hexadecimal, tiene 1.8 GB de capacidad útil y casi 2 GB decapacidad total. 512 Bytes por sector.
7/16/2019 PIC 16F877 Con Memoria SD
http://slidepdf.com/reader/full/pic-16f877-con-memoria-sd 2/11
Lo más importante que quiero mostrar es donde dice “Sector físico = 140 y “Sector lógico=3“. Los “@” los grabé yo y comienzan en la dirección lógica 0x600. En todos los ejemplosque vi en Internet usan esta dirección para grabar. Tardé muchos días experimentando sinpoder grabar, hasta que encontré en un artículo en inglés, que la dirección que se debe usar es la física. Y entonces grabé y leí bien. La dirección lógica cero corresponde a la física 137(Decimales), de manera que en lugar de marcar como inicio de grabación o lectura ladirección 0x600 = sector 3 x 0x200, se deberá calcular (3 + 137) x 512 = 71680 , o sea0x11800.
En una segunda memoria SD de la misma capacidad, el sector lógico cero es 135 físico, demanera que para cada tarjeta se debe mirar el número y hacer los cálculos, o en mi casouso 137 para las dos.
Cuando seguí haciendo experiencias con las grabaciones, en un caso por malaprogramación me grabó el sector cero, y perdí la FAT, con el resultado de “Tarjeta imposiblede leer” en la PC.
Para formatear la SD, usar el programa oficial de tarjetas SD. Está en Download SDFormatter donde encontrarán instrucciones de uso.
Instrucciones para formatear . Se bajan de esta dirección.
Cuando la quise formatear, el SD formatter no me la aceptaba, porque en el sector averiado,supongo que están los códigos que protegen las SD contra copias piratas, si se las protege.
Entonces la formateé con el Windows XP, haciendo botón derecho en <MI PC> luegoseleccionar <administrar> luego <Administración de discos>. Aparecerá la tarjeta SD si estáconectada a la PC. Allí se formatea lento y destruirá las protecciones, de manera quedesaparece la diferencia entre sectores lógicos y sectores físicos. Solo queda el sector físico, y no vale lo que mostré arriba. La dirección donde comienza la escritura y la lectura secalcula como Sector * 512. Para el sector 3 es 3 * 512 = 1536 en decimal o 0x600.
Encontrarán que en firmware simple, la dirección es 0x11800 y en el firmware función ladirección es 1536 decimal. En este último caso, no hay diferencia entre físico y lógico, y lafunción “comando” recalcula la dirección a hexadecimal.
Para convertir unidades uso este convertidor . También de la página pueden bajar el archivofuente. ( www.arossini.com.ar ).
Esta es otra cosa a tener en cuenta. A no olvidarse. Es como en los disquetes.
Plaqueta para conectar la Memoria SD al PIC
Este fue otro dolor de cabeza, porque copié diseños de Internet, que no me sirvieron, porque
al mirar las ondas de clock y datos con un osciloscopio, deformaban la onda, convirtiéndolade cuadrada a triangular, y nada funcionaba.
7/16/2019 PIC 16F877 Con Memoria SD
http://slidepdf.com/reader/full/pic-16f877-con-memoria-sd 3/11
Comencé a diseñar mi propia interfase, con ayuda del osciloscopio y este esquema delmanual de la memoria San Disk, que se baja de aquí.
Ningún diseño usaba resistencias Pull Up, como indica el manual
Las resistencias Pull Up son las de 10K.
Los Zener de 3.3 Volt, bajan la tensión de 5 Volt del PIC a 3 Volt aproximadamente.
El consumo de la Tarjeta está en el orden de 65 mA.
7/16/2019 PIC 16F877 Con Memoria SD
http://slidepdf.com/reader/full/pic-16f877-con-memoria-sd 4/11
Este esquema está en el esquema general del PIC. Yo lo armo en una plaqueta separadapara poder usarlo con otros PICs, al igual que la plaqueta que uso para la comunicación conel puerto serie.
Comandos usados en SPI para SD
Este trabajo, hecho lo más simple posible, es para INICIALIZAR la tarjeta, ESCRIBIRLA yLEERLA, escribiendo y leyendo bloques de memoria. Se escriben las posiciones dememoria.
El trabajo siguiente a publicar será el de escribir y leer archivos de texto. Por ahora sonpalabras mayores para mí.
La estructura de los comandos que se usan es de 6 Bytes y es la siguiente:
Los comandos usados en este trabajo son:
CMD0 0x40 00 00 00 00 95 Coloca la tarjeta en inactividad
CMD1 0x41 00 00 00 00 FF Activa la tarjeta
CMD17 0x51 XX XX XX XX FF Permite leer un sector de la tarjeta
CMD24 0x58 XX XX XX XX FF Indica el sector de inicio de la escritura
XX son datos en hexadecimal. Mas abajo explico como se calculan y escriben.
Cuando enviamos un comando, debemos leer la respuesta. Es de 1 Byte
Para calcular el número del comando para el CMD17 por ejemplo:
CMD = 17; pasado a binario en el programa convertidor es 0b10001; se le agrega 01 de losbit 7 y 6 y 0 para el bit 5 mas los 5 bit de 10001, quedando 0b01010001. Se lo pasa ahexadecimal quedando 0x51, que es el valor mostrado arriba para comando 17.
Esta es la estructura de la respuesta que se recibe:
COMANDO RESPUESTA INDICA
CMD0 0x01 En espera
CMD1 0x00 Activo (Lista)
CMD17 0xFE + (bytes leídos de 1 a 512) Leer un sector de latarjeta
7/16/2019 PIC 16F877 Con Memoria SD
http://slidepdf.com/reader/full/pic-16f877-con-memoria-sd 5/11
CMD24 0x00 Seguir con la escritura
0xFE + (bloque a escribir) 0xE5 Recepción correcta
A 0xFE se lo denomina Token.
Luego seguiremos con más detalles, en el Firmware.
Esquema
Firmware
Hay en este trabajo, presentados dos Firmware:
a) .Firmware simple.
b) Firmware funcion.
Los dos hacen lo mismo, escriben un sector de 512 Bytes con un carácter, y luego leen solouna cantidad de direcciones limitada en ese sector grabado.
7/16/2019 PIC 16F877 Con Memoria SD
http://slidepdf.com/reader/full/pic-16f877-con-memoria-sd 6/11
El a) está hecho de la manera más simple posible, sin funciones que puedan hacer perder elfundamento de la comunicación SPI. Es un Firmware didáctico. Cuando Ustedes hagan elsuyo, podrán tratar de ahorrar toda la memoria que quieran, seguramente.
El b), usan una función llamada comando, que envía los comandos, y además funciónesInicializar, Escribir y Leer.
Tiene comunicación serie, para que manden a la PC todo lo que deseen, cuando haganmejoras y necesiten corregir o detectar errores. Encontrarán que la mayoría de los
comandos puerto serie están comentados, pues se usan solo en caso de problemas y meresultaron indispensables en su momento. Ustedes des-comentarán lo que necesiten.
Usé el PIC 16F877, porqué encontré ejemplos con el en Internet. Seguiré con el 18F4550,pero presenta algún problema pues coincide la comunicación serie con el SPI, y ello me trajoconflictos que deberé solucionar.
Usamos cristal de 20Mhz para que al seleccionar el divisor de frecuencia de clock de SPI a64 obtengamos una frecuencia del mismo de aproximadamente 312Khz. (frecuencia parainicializar la memoria). La cuenta es 20000000 / 64 = 312500 Hz. La máxima frecuenciapermitida para inicializar es 400 MHz. Luego puede llegar a 25 MHz.
Comunicación SPIInicialización Escritura
Lectura
7/16/2019 PIC 16F877 Con Memoria SD
http://slidepdf.com/reader/full/pic-16f877-con-memoria-sd 7/11
Detalles del comando 17
Void Leer(void)
{CS = 0; delay_us(100); // Habilitamos la Tarjeta SD
//Respuesta=12; // Para que comience a funcionar el while si Respuesta viene = 0.
while(spi_read() !=0xFE){CMD17();} // Manda el comando 17, que lee un bloque del tamañoindicado por el comando 16, en la dirección 0x11800(0x600)
for(i=0;i<100;i++){spi_write(0xFF);Respuesta=spi_read();printf("Leo: %c\n\r",Respuesta);}//Leer parte del bloque
puts("Termine de Leer");
CS = 1; // Deshabilitamos la SD} // Fin de Leer
CS = 0; // Habilitamos la Tarjeta SD
Respuesta=12; // Para que comience a funcionar el while si Respuesta viene = 0.
while(Respuesta !=0x00) // Manda el comando 17, que lee un bloque del tamaño estándar de 512 Bytes, en la dirección 0x600
La dirección 0x600 = sector 3 * 512 Byte= sector 3 * 0x200 Byte. Corresponde a sector lógico, que es lo que se ve en el programa WinHex, mostrado arriba. Pero nosotrosnecesitamos entrar la dirección correspondiente al sector físico; debemos sumar entonces
137 al número de sector.
La dirección 0x600 (Lógico)= sector (3 +137)* 512 Byte = 71680. En hexadecimal =0x11800. Lo agrupamos como 00 01 18 00 y así lo escribimos en el comando, como se veabajo.
El FOR es para leer la respuesta de la SD. Primero se manda un clock para dar tiempo aque llegue la respuesta y luego se la espera hasta que llegue. Si todo está bien se pasa a larutina siguiente.
void CMD17()
{
spi_write(0x51); // Comando
spi_write(0x00); // Comando
spi_write(0x01); // Comando
7/16/2019 PIC 16F877 Con Memoria SD
http://slidepdf.com/reader/full/pic-16f877-con-memoria-sd 8/11
spi_write(0x18); // Comando
spi_write(0x00); // Comando
spi_write(0xFF); // Comando
for(i=0;i<12;i++) {spi_write(0xFF);Respuesta=spi_read();//printf("Leo 17: %x\n\r",Respuesta);
if(Respuesta==0xFE) break;}
}
Detalles del comando 24
Para este trabajo, se usa la misma dirección, de manera que se debe mirar el comando 17.
Para resolver problemas
//puts("Pulsar Escribir");while(Pulsador ==1); delay_ms(500);
Spi_write(0xFE) ; // Byte Inicial Escritura
for(x=0;x<512;x++) {spi_write(Caracter);}
spi_write(0xFF) ; // CRC
for(i=0;i<64;i++) {spi_write(0xFF);Respuesta=spi_read(); //printf("Res Escribir: %x,%i\n\r",Respuesta,i);
En rojo, muestro dos partes que están comentadas. Se usan para resolver problemas,cuando algo no funciona.
Desmarcando la primera, manda un mensaje por puerto serie, mostrando lo último que hizobien, y deteniendo el programa hasta que se presione el pulsador. La segunda nos muestravalores leídos, para que podamos interpretar la causa del problema.
También se usa el pulsador, para poder ver esa señal en modo ¡Single” o sea que sedetenga al recibir la señal, para observación.
Pantalla del osciloscopio
Estas ondas están generadas con la rutina “Prueba 05”, del Firmware. En amarillo es clock,en azul es el 0x01.
//*************** Prueba 05 Mandamos clocks continuamente
7/16/2019 PIC 16F877 Con Memoria SD
http://slidepdf.com/reader/full/pic-16f877-con-memoria-sd 9/11
CS = 1; // Deshabilitamos la Tarjeta SD
puts("Mando Pulsos reloj con CS=1 y spi_write(0x01)");
puts("para ver CLOCK y SDI");
while(True) {spi_write(0x01);}
7/16/2019 PIC 16F877 Con Memoria SD
http://slidepdf.com/reader/full/pic-16f877-con-memoria-sd 10/11
Fotografía
7/16/2019 PIC 16F877 Con Memoria SD
http://slidepdf.com/reader/full/pic-16f877-con-memoria-sd 11/11
Otra lista con 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ónCID
CMD13 No R2 Consulta el estado de la tarjeta
CMD16 [31..0] Longitud delbloque.
R1 Establece la longitud (en bytes) delbloque para los datos en lasoperaciones 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 dedatos
R1 R1 R1 Escribe un bloque del tamañoindicado por el comando 16.