Lecto-grabador de tarjetas MMC, SD, MicroSD con PIC

Hola! quiero hacer una aporte a toda la comunidad electronica. y de paso poder complementar con otra información para lograr que este circuito llegue a la plenitud de su desarrollo. el mismo consta de un microcontrolador PIC16F877A con un oscilador de 20Mhz (luego voy a explicar porque el de 20). un par de resistencias para "ajustar" los niveles de tension que manejan las tarjetas SD,MicroSD y MMC (2.7 a 3.3 v) a los niveles de la lógica TTL de la arquitectura del PIC, las diversas memorias que existen en el mercado, desde el punto de vista técnico, 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 (en este caso mediante el modulo MSSP interno del pic) y es suficiente para la mayoría de aplicaciones. la tarjeta se comunica mediante Comandos del operador o Controlador, respondiendo en cada caso cada una de las peticiones del mismo. Yo por el momento logré paso a paso lo siguiente:

(1) seleccionar el modulo MSSP del pic para que funcione de modo maestro,. se utilizan para configurarlo solo 2 registros principales el SSPSTAT y el SSPCON1.
(2) mediante el 2 registro se selecciona el clock del modulo SPI, son 4 posibilidades distintas de frecuencias,. 1- Fosc/64 \\\ 2-Fosc/16 \\\ 3-Fosc/4 \\\ 4- Fosc=timer2/2
(3) en este caso tenemos que utilizar indefectiblemente un cristal de 20Mhz para que al seleccionar el divisor de frecuencia de clock a 64 (opcion1 item anterior) logremos obtener una frecuencia de clock de aproximadamente 312Khz. (frecuencia necesaria para inicializar la memoria).
(4) luego debemos setear el tipo de polaridad del clock, momento en quese va a muestrear la entrada y . haciendo CKP=1 CKE=0 SDI(SMP)=0 .(son bits de los registros nombrados anteriormente)
(5) finalmente ya hemos inicializado el modulo del micro activandolo poniendo a "1" el bit SSPEN

ahora sigue la secuencia de pasos inalterables:

los pasos muy precisos y específicos. cada comando entrega una respuesta de parte de la tarjeta.
a continuacion se detalla la cadena de cada comando a enviar y que se debe esperar de parte de la tarjeta.

CMD0--- cadena a enviar: 0x40,0x00,0x00,0x00,0x00,0x95 esperar respuesta: 0x01 (significa tarjeta en modo idle).
CMD41--- cadena a enviar: 0x41,0x00,0x00,0x00,0x00, 0xXX. Como la tarjeta ya esta en modo SPI el CRC (0xXX) puede tomar cualquier valor. se aconseja cargarle 0xFF. esperar respuesta 0x00 (significa tarjeta lista! )
CMD55--- ESTE COMANDO NO ES UTILIZA PARA TARJETAS KINGSTON. SI TU TARJETA NO ES DE ESTA MARCA DEBERÁS ENVIARLE ESTE COMANDO. cadena a enviar: 0x77,0x00,0x00,0x00,0x00, 0xXX Y ESPERAR UN 0X00 DE RESPUESTA.
CMD58--- este comando es muy importante ya que se le "pregunta" a la tarjeta si está posibilitada a funcionar con una tension de alimentacion de 3.3v. cadena a enviar 0x7A,0x00,0x00,0x00,0x00, 0xXX. esperar respuesta 0x00 (significa que todo va OK!)

luego de haber terminado la inicializacion, la tarjeta ya estla lista para realizar operaciones de lecto-escritura. pero lamentablemente acá se me recomplicó la cuestión. hace una semana que estoy intentando escribirle algo y se vé que algun moco me estoy mandando o saltié algun paso,.porque no me responde nada cuando peticiono la escritura mediante el comando 24. nosé la verdad. voy a seguir intentando,. y si hay progreso voy a seguir publicando más información.

si alguien está interesado en este proyecto no duden en intentar. por cualquier duda de hard o soft comunicate conmigo

vamos! vamos! pongansé las pilas e investiguen en este tema! que está muy GROSSOOOO!

(tengo mucha información al respecto como para compartir sin problema)

acá encontré un manual muy bueno de MMC y SD . la verdad que está muy completo e interesante como para que empiecen a meter mano en esto. se los posteo acá .

http://www.cs.ucr.edu/~amitra/sdcard/
 
Qué tal. No sé de estas tarjetas pero ví un artículo en el #218 la revista española Resistor, mencionando al pic16f876 para esta interfaz. ¿Lo has visto?
Salu2
 
yo lo vi en la revista y me estaba animando a hacerlo pero no encontré los socket para las tarjetas sd, me dan ganas de comprar un lector y desarmarlo para quitarle el socket, pero no he tenido tiempo por la tesis, pero si me interesa mucho ese aspecto ya que quiero almacenar ahí mucha información estadística, presión, humedad, velocidad del viento, temperatura, frecuencia de apertura de válvulas, conteo de litros por día, etc. aparte de que están baratas las memorias sd de 2 gb.
 
hola!! muchachos..... vamos anímense!!!!... ya logré leerla y escribirla..... pero tengo una par de problemas menores... que se pueden solucionar.... acá les paso un par de fotos como para que se den una idea de que si no consiguen el socket o para evitarse romper un lector,.... yo compré una memoria Micro SD que viene con su respectivo adaptador,... a el le soldé los cables y me quedé un socket casero bastante bueno,...jaja :) asi que pongansé las pilas muchachos y sigan con este tema.
 

Adjuntos

  • sd1_774.jpg
    sd1_774.jpg
    11.9 KB · Visitas: 9,232
  • sd2_738.jpg
    sd2_738.jpg
    14 KB · Visitas: 9,436
  • controlador_179.jpg
    controlador_179.jpg
    83.6 KB · Visitas: 9,972
Hola Nano1985.

Me interesa mucho tu proyecto, ya que puedes almacenar una infinidad de cosas en este tipo de memorias, voy a empesar por conseguirme el adaptador que conseguiste y la memoria, con una de 128 megas me basta; pero precisamente a eso va enfocado mi pregunta, cual es el limite de almacenamiento con el que te haz enfrentado, ya que encontre un articulo de una tesis donde mencionaba que solo podia usar hasta la memoria de 128 megas.

Otra situacion, en el articulo que medio revise (no lo lei en su totalidad) menciona que algunos pines de la SD es necesario conectarlos a VCC por medio de una resistencia en este caso vi que los voltajes que maneja la SD son de aprox. 3.3 volts o menos. como estableciste el valor de estas resistencias de polarizacion.
 
Hola estoy interesado en realizar el lecto-grabador de la memoria. He logrado inicializar la memoria sd, y he enviado los comandos y la memoria me responde correctamente pero cuando envio los bytes a grabar en la memoria, la misma no me respionde con el byte de respuesta. Aqui te envio mi programa. Les agradeceria su ayuda. El programador que estoy utilizando es el CCS

Código:
#if defined(__PCM__) 
#include <16F877.h> /* tipo de PIC */ 
#use delay(clock=20000000) /* reloj de 20 MHz */ 


int8 i; 
int8 data_in; 

void main() 
{ 
set_tris_c(0x10); 
output_bit(PIN_C0,1); 
setup_spi(spi_master |spi_l_to_h|spi_clk_div_64); 

for(i=0;i<10;i++) 
{ 
spi_write(0xFF); 
} 

output_bit(PIN_C0, 0); /* Activacion de la SD */ 


/* Envia a la SD el comando 0 */ 

while(data_in!=1) 

{ 
spi_write(0x40) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x95) ; 

for(i=0;i<64;i++) 
{ 
spi_write(0xFF); 
data_in = spi_read(); 

if(data_in==0x01) 
{ 
break; 
} 
} 
} 
output_bit(PIN_C0,1); /* Desactivacion de la SD */ 
spi_write(0xFF); 
output_d(0x01); 
delay_ms(1000); 



output_bit(PIN_C0, 0); /* Activacion de la SD */ 


/* Envia a la SD el comando 1 */ 

while(data_in!=0) 

{ 
spi_write(0x41) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0xFF) ; 

for(i=0;i<64;i++) 
{ 
spi_write(0xFF); 
data_in = spi_read(); 

if(data_in==0x00) 
{ 
break; 
} 
} 
} 
output_bit(PIN_C0,1); /* Desactivacion de la SD */ 
spi_write(0xFF); 
output_d(0x02); 
delay_ms(1000); 




output_bit(PIN_C0, 0); /* Activacion de la SD */ 


/* Envia a la SD el comando 16 */ 

while(data_in!=0) 

{ 
spi_write(0x50) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x02) ; 
spi_write(0x00) ; 
spi_write(0xFF) ; 

for(i=0;i<64;i++) 
{ 
spi_write(0xFF); 
data_in = spi_read(); 

if(data_in==0x00) 
{ 
break; 
} 
} 
} 
output_bit(PIN_C0,1); /* Desactivacion de la SD */ 
spi_write(0xFF); 
output_d(0x04); 
delay_ms(1000); 


/* Envia a la SD el comando 24 para escribirla */ 


output_bit(PIN_C0, 0); /* Activacion de la SD */ 


while(data_in!=0x05) 

{ 

while(data_in!=0x00) 

{ 

spi_write(0x58) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0x00) ; 
spi_write(0xFF) ; 

for(i=0;i<64;i++) 
{ 
spi_write(0xFF); 
data_in = spi_read(); 

if(data_in==0x00) 
{ 
break; 
} 
} 
} 

output_d(0x08); 

spi_write(0xFF) ; 
spi_write(0xFF) ; 
spi_write(0xFE) ; 

for(i=0;i<512;i++) 
{ 
spi_write(0xAA); 
} 

spi_write(0xFF) ; 
spi_write(0xFF) ; 
spi_write(0xFF) ; 

data_in = spi_read(); 

data_in = (data_in && 0x0F); 


if(data_in==0x05) 
{ 
break; 
} 

} 

while(data_in!=0xFF) 
{ 
spi_write(0xFF) ; 
data_in = spi_read(); 
} 

output_bit(PIN_C0,1); /* Desactivacion de la SD */ 
spi_write(0xFF); 
output_d(0x10); 
delay_ms(1000); 

}
 
Hola. Tengo serios problemas para escribir una tarjeta SD. Me podrias guiar con los pasos a seguir.
Aca muestro parte del codigo
//*******************************
int SD_Escribir_Bloque(){ //Escribe en la memoria un bloque de datos de 512 Bytes

long i;
CS=0;
Command(0x58,0,0,0X02,0X00,0xFF); // 200H = 512
// Command(0x58,0,0,0X02,0X00,0x01); // SEGUN UTN
if((SD_response(0x00))==1) return 1;
if((SD_response(0x00))==1) return 2;
if((SD_response(0x00))==1) return 2;
for (i=0;i<10;i++);
SPI(0xFE); // Envio el data token

for(i=0;i<512;i++) SPI(dato); // Envio los datos
SPI(0xFF);
SPI(0xFF);

if((SPI(0xFF)&0x0F)!=0x05) return 2;
CS = 1;

return 0;
}
 
Ahi lo hice andar. Ahora estoy viendo lo de fat 16 pero la leí con comunicacion serie y la grabe bien. CUALQUIER AYUDA QUE NECESITEN AVISEN. Aca mando los pasitos pero despues deescribir hay que esperar una sola respuesta.
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 512 bytes. Como por defecto en el protocolo de acceso SPI no se consideran los bytes de CRC, estos pueden tomar cualquier valor.

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

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 hay que enviar el comando 1. La secuencia general es esta:

- Activar el pinl ¡CS (¡CS=0).
- Enviar el comando 1: 0x41,0x00,0x00,0x00,0x00, 0xXX. Como la tarjeta ya esta en modo SPI el CRC puede tomar cualquier valor.
- Esperar el byte de respuesta que ha de ser 00000000 (tarjeta lista).

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 informaciónrmando 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.

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.
 
Hola Marcosbrusa.

He probado todo lo que dices, pero no consigo que funcione.

La parte de Inicialización si que me funciona, pero a la que intento leer o escribir, no lo consiguo.

He leido en algun sitio que la comunicacion es distinta entre las tarjetas SD y las MMC.

Me puedes mandar el codigo fuente para ver que es lo que hago mal.

Gracias.
 
Fijate que hace un tiempo escribi la funcion de escritura en c, el unico error de ese codigo es que espera 3 respuestas cero despues del comando de escritura Y SE DEBE ESPERAR UNA SOLA.
Por supuesto que no es lo mismo SPI y CMD. Lo que mande explica como elegir SPI. No conozco nada de CMD.

Ahora estoy tratando de darle formato texto y NECESITO AYUDA
 
Hola. Por fin he consiguido hacer lecturas y escrituras en una SD.

Después de ver que mas o menos funcionaba, utilizando el programa "Hexprorer", que me sirve para ver los datos de los sectores de la tarjeta, se me ha planteado una pregunta. Según he visto, con mi tarjeta de 64MB, dispongo de 112,240 sectores. Utilizando las rutinas que mostrais, la dirección del sector màxima que puedo poner con 16 bits es dee 65535. !!!

Como puedo acceder a los demás sectores de la tarjeta. ??

He visto también que me parece que no leo los sectores en el orden correcto. Alguna solución?

Por fin he conseguido que funcione todo correctamente.

Ahora ya puedo leer y escribir en cualquier sector de la tarjeta.

No lo habria conseguido sin vuestras preguntas y respuestas. Por eso, os adjunto mi programa de prueba para que lo utilizeis vosotros. (Está todo comentado linea a linea)

Todo y que está echo con un PIC16F877A, al no tener suficiente RAM, solo puedo utilizar los primeros 192 byte de cada sector, pero se soluciona en un plis-plas con un 18F o con un dsPic.

Si teneis alguna duda, ya sabeis.

Saludos.
 

Adjuntos

  • proba_mmc_204.c
    8 KB · Visitas: 2,020
Última edición por un moderador:
Hola. En realidad si tu tarjeta es de64Mbytes y podes direccionar65535 sectores entonces del cociente sacas la cantidad de sectores. ESO ENTIENDO??? pero recien arranco con esto del FAT16 y en verdad esta groso el tema. AGRADECER"IA CUALQUIER AYUDA QUE ME PUEDAN DAR.
 
Hola.

Alguien sabe algo sobre las nuevas especificaciones de las tarjetas SD HC (version 2.0).

Tengo entendido que no hay compatibilidad con las actuales SD Standard y por tanto, con el bus SPI, solo podremos trabajar con tarjetas de hasta 2Gb.

Teneis información sobre como funciona el nuevo host ?
Se puede programar las nuevas especificacione con los PIC?

Gracias.
 
Hola, Estoy trabajando para lograr la comunicacion de la tarjeta SD con un PIC18F2550 pero hasta ahora me estoy iniciando en la programacion en C, Aunno logro que la tarjeta me de respuesta alguna.aca dejo mi codigo no se que pueda ser el problema.
void main (void)
{


TRISA = 0X20;
TRISB = 0X01;
TRISC= 0X00;
SSPSTAT = 0X00;
SSPCON1 = 0X32;


PORTC=0X00;
PORTB=0X00;

// TRISBbits.TRISB1 = 0; //SE CONF. PIN7 PORTB COMO SALIDA .
// TRISAbits.TRISA5 = 1;
// TRISCbits.TRISC7 = 0;


//Enviando ciclos de reloj para sincronismo
for(i=0;i<10;i++)
{
SPI_WRITE(0xFF);
}

PORTAbits.RA4 = 0;

//CMD0

while(RATO!=1){
SPI_WRITE(0x40);
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x95);

for(i=0;i<64;i++)
{
SPI_WRITE(0xFF);

if(SSPSTATbits.BF==1){
RATO=SSPBUF;

if(RATO==0x01)
{
PORTBbits.RB7=1;
Delay10KTCYx (250);
PORTBbits.RB7=0;
Delay10KTCYx (250);
PORTBbits.RB7=1;
Delay10KTCYx (250);
PORTBbits.RB7=0;
Delay10KTCYx (250);
RATO=1;
break;
}
}

}

}



PORTAbits.RA4 = 1;
SPI_WRITE(0XFF);
Delay10KTCYx (250);

//CMD1
PORTAbits.RA4 = 0;
while(RATO!=0x02){
SPI_WRITE(0x41);
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0xFF);

for(i=0;i<64;i++)
{
SPI_WRITE(0xFF);
if(SSPSTATbits.BF==1){
RATO=SSPBUF;

if(RATO==0x00)
{
PORTBbits.RB7=1;
Delay10KTCYx (250);
PORTBbits.RB7=0;
Delay10KTCYx (250);
PORTBbits.RB7=1;
Delay10KTCYx (250);
PORTBbits.RB7=0;
Delay10KTCYx (250);
RATO=0x02;
break;
}
}
}
}


PORTAbits.RA4 = 1;
SPI_WRITE(0XFF);
Delay10KTCYx (250);
 
La version Estudiantil del C18 de Microchip junto al Mplab, porque lo dices?.En el momento de compilar no tengo problemas, tengo sospechas en el manejo de los voltajes de las señales que salen y entran al micro.con respecto a las señales que salen del micro hacia la tarjeta(SCK,SDO,CS), usando divisores de voltajes hecho con resistencias bajo de 5v a 3v (el voltaje de trabajo de la tarjeta).pero no se si la señal que viene de la tarjeta al Micro(al SDI)debo aumentarla de 3V a 5V, para que el PIC la reconozca.Muchachos Muchas Gracias por Su Atensión
 
Hola a todos. Es la primera vez que voy a programar pics 16c711. Tengo el ic prog en el cual esta este pic como opcion de programacion. Pero no se cuales pines se usan en la grabacion, ya que mi idea es hacerlo en circuito.

Se que se usan los pines vdd, vss, pgc, pgd y vpp. Pero cuando lo conecto en el zocalo para el pic 18f876, respetando la disposicion de los pines no me funciona.
Alguien sabe en que fallo?
 
Última edición por un moderador:
Hola Muchachos he conseguido comunicarme con la tarjeta pero aun no logro escribirla y pasa algo bastante particular, cuando termino de enviar el bloque no me llega un byte de confirmacion si no nuevamente un byte en cero (0x00), miro en el hexplorer y efectivamente no aparece mi escritura.aqui parte del codigo.Gracias Por La Atensión
//CMD 16

//PORTAbits.RA4 = 0;
// while(RATO!=0x00){
// SPI_WRITE(0x50);
// SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x02);
SPI_WRITE(0x00);
SPI_WRITE(0xFF);

for(i=0;i<64;i++)
{

if(SSPSTATbits.BF==1){
RATO=SSPBUF;
if(RATO==0x00)
{
break;
}
}
SPI_WRITE(0xFF);
}
}


PORTAbits.RA4 = 1;
SPI_WRITE(0XFF);
Delay10KTCYx (250);


//CMD24
PORTAbits.RA4 = 0;

while(RATO!=0x05){

while(RATO!=0X03){
SPI_WRITE(0x58);
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x01);
SPI_WRITE(0xFF);

for(i=0;i<64;i++)
{
if(SSPSTATbits.BF==1){
RATO=SSPBUF;
// RATO=0x00;
if(RATO==0x00)
{

break;
}
}
SPI_WRITE(0xFF);
}

for(i=0;i<64;i++)
{

if(SSPSTATbits.BF==1){
RATO=SSPBUF;
// RATO=0x00;
if(RATO==0x00)
{
break;
}
}
SPI_WRITE(0xFF);
}


for(i=0;i<64;i++)
{
if(SSPSTATbits.BF==1){
RATO=SSPBUF;
// RATO=0x00;
if(RATO==0x00)
{
break;
}
}
SPI_WRITE(0xFF);
}

}

SPI_WRITE(0xFF);
SPI_WRITE(0xFF);
SPI_WRITE(0xFE);

for(i=0;i<512;i++)
{
SPI_WRITE(0x68); //Datos a Escribir
}
SPI_WRITE(0xFF);
SPI_WRITE(0xFF);


for(i=0;i<64;i++)
{

if(SSPSTATbits.BF==1){
RATO=SSPBUF;
RATO=RATO&0X0F;

if(RATO==0x05)
{
PORTBbits.RB4=1;
Delay10KTCYx (250);
PORTBbits.RB4=0;
Delay10KTCYx (250);
PORTBbits.RB4=1;
Delay10KTCYx (250);
PORTBbits.RB4=0;
Delay10KTCYx (250);
break;
}
}
SPI_WRITE(0xFF);
}

}

while(RATO!=0xFF)
{
if(SSPSTATbits.BF==1){
RATO=SSPBUF;
}
SPI_WRITE(0xFF);
}


PORTAbits.RA4 = 1;
SPI_WRITE(0XFF);
Delay10KTCYx (250);
 
Hola a todos. Yo también estuve dandole vueltas al asunto y me encontré el compilador Mikrobasic de Mikroelectronica que ya implementan un montón de rutinas para las mmc o sd. tanto formateo, inicialización, creación de archivos e inclusión de datos en los archivos.

Yo quería hacer un grabador en plan log de puerto serie, como sniffer el mismo para no tener que poner un pc capturando, pero ahora viendo que hay mucha gente por aquí lo mismo me animo y vuelvo a las andadas.

Muy bueno el adaptador de sd, usando el adaptador. muy bueno.

Os sigo leyendo.

Un saludo.
 
Atrás
Arriba