#include <16f84a.h>
#fuses HS,NOWDT
#use delay(clock=10M)
#use spi(master,di=pin_a0,do=pin_a1,clk=pin_a2,bits=8)
#use rs232(xmit=pin_b0,rcv=pin_b1)
int1 cmd(int8 byte1,int32 arg,int8 crc,int8 resp){
int8 i;
int16 j=0xffff;
spi_xfer(byte1);
spi_xfer(make8(arg,3));
spi_xfer(make8(arg,2));
spi_xfer(make8(arg,1));
spi_xfer(make8(arg,0));
spi_xfer(crc);
while(i!=resp){
i=spi_xfer(0xff);
j--;
if(j==0) return 0;
}
return 1;
}
int1 sd_init(){
int8 i;
output_high(pin_a3);
for(i=0;i<10;i++){
spi_xfer(0xff);
}
output_low(pin_a3);
if(cmd(0x40,0,0x95,0x01)==0){
return 0;
}
if(cmd(0x41,0,0xff,0)==0){
return 0;
}
if(cmd(0x50,0xff,0xff,0)==0){
return 0;
}
return 1;
}
int1 sd_escribe(int32 dir){
if(cmd(0x58,dir,0xff,0x00)==0){
return 0;
}
return 1;
}
void main(){
int16 i, j=0x000f;
int32 direccion=0;
if(sd_init()==0){
printf("no se puedo inicializar tarjeta/n");
}
else{
printf("tarjeta inicializada /n/r");
}
output_high(pin_a3);
delay_ms(100);
output_low(pin_a3);
if(sd_escribe(direccion)==0){
printf("no se pudo escribir /n/r");
}
else{
spi_xfer(0xfe);
for(i=0;i<256;i++){
spi_xfer('e');
}
spi_xfer(0xff);
spi_xfer(0xff);
while(i!=0x05){
i=spi_xfer(0xff);
j--;
if(j==0) printf("error al escribir en direccion %Lu /n",direccion);
}
direccion++;
}
}
ese es mi codigo, el que estoy usando actualmente, el problema que tengo es que nunca llega la respuesta 0x05 despues de enviar los 512 bytes alguna sugerencia?