Hola ya he en contrado un programa por si le puede servir a alguien es el Hexplorer. Mi codigo de escritura es
int mmc_response(unsigned char response)
{
unsigned long count = 0xFFFF; // Repetir 16 bits, puede ser posible para reducir esta a 8 bits, pero no tiene mucho sentido
// Son 32bits 65535=FFFF es exadecimal 8bits=1byte luego son 4bytes= 1 word una palabra son 16bits
// F=15=4bits
while(ReadSPI2() != response && --count > 0); // Lee lo que hay en el buffer de entrada y mientras sea distinto de la reuspuesta continua
if(count==0) return 1; // bucle se sale por tiempo de espera
else return 0; // bucle se salió antes de tiempo de espera
// El bloque espera a que recibir la respuesta obternida, si el tiempo de espera llega a 0 (count)revuelve un 1 indicando error si es distinto
// de cero esque a recibido el dato deseado y devuelve un 0 indicando que esta todo ok.
}
//------------------------------------------- Fin Bloque que espera la respuesta de la tarjeta _---------------------------------------------------------
//----------------------------------------- Bloque de escritura ------------------------------------------------------------------------
int mmc_write_block(unsigned long block_number,int porcentaje2, int Valor2 )
{
char direccion[4]={0,0,0,0};
char porcentaje[2]={0,0}; // estas dos las tendre que poner en el main
char Valor[2]={0,0};
int i;
direccion[0]=block_number>>24; // aqui intento guardar la direccion que le paso la divido en dos hay que comprobar si guarda bien
direccion[1]=block_number>>16;
direccion[2]=block_number>>8;
direccion[3]=block_number; // si hace el desplazamiento bien y guarda la parte alta
porcentaje[0]=(porcentaje2>>
; // aqui intento guardar el porcentaje que le paso la divido en dos hay que comprobar si guarda bien
porcentaje[1]=porcentaje2;
Valor[0]=(Valor2>>
; // aqui intento guardar el porcentaje que le paso la divido en dos hay que comprobar si guarda bien
Valor[1]=Valor2;
PORTAbits.RA5 = 1;
for(i=0;i<10;i++) // inicializar la tarjeta MMC en modo SPI mediante el envío de los CLK on
{ // esto igual lo tengo que borrar no quiero que cada vez que se inicie me borre la tarjeta
WriteSPI2(0xFF); // lo podria usar para resetear la tarjeta si me interesaras pero probar a ver si me resetea la tarjeta
}
PORTAbits.RA5 = 0;
WriteSPI2(0x58); // envia mmc escribe en el bloque
WriteSPI2(direccion[0]); // aqui le indicamos con estas 4 instrucciones la direccion de memoria donde queremos que escriba
WriteSPI2(direccion[1]); // en el 0 metemos la parte mas alta y el en 3 la mas baja este sera el orden en el 0 la mas alta
WriteSPI2(direccion[2]);
WriteSPI2(direccion[3]); // siempre cero en múltiplos de 8 porque yo he definido el tamaño en 8
WriteSPI2(0xFF); // suma de comprobación no es necesaria, pero siempre enviar 0xFF
// 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
if((mmc_response(0x00))==1) return 1; // espera respuesta de que todo esta correcto
WriteSPI2(0xFE); // envia datos token
for(i=0;i<512;i++)
{
WriteSPI2(0xFF); // escribo 512 bytes
}
WriteSPI2(0xFF); // erro CRC
WriteSPI2(0xFF);
i=0;
while((ReadSPI2()&0x0F)!=0x05)
{
if(i==30) return 1; // nos indica si hay fallo en la escritura si hay fallo devuelve un 1 si leo un 5 es que esta bien y saca un 0
i++;
}
return 0;
}
//-----------------------------------------Fin Bloque de escritura ------------------------------------------------------------------------
El problema aque tengo es que me empieza en lugar de escribir el FE antes de eso me pone 0000 0000 0000 0 y despues de eso ya escribe lo que yo le pongo
quedando la secuencia de lectura 0x00 0x07 0xF7 y ya FF... osea 0000 0000 0000 0111 1111 0111 lo que hace la tarjeta es meter antes una serie de ceros 13 en concreto y luego ya va mentiendo los datos que yo le digo. Como se ve parte del FE que le pongo esta dividida en dos parte esta en el 2 byte y el resto en el bit 3. Alguien sabe porque puede ser esto? Saludox