Autor Tema: SD Card - Error en lectura con comando 17  (Leído 8733 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
SD Card - Error en lectura con comando 17
« en: 01 de Febrero de 2015, 21:27:50 »
Hola  :(

Tengo una SD Card de 2GB sin formato usada como una EEPROM muy grande y un PIC32 leyéndola.

He tenido muchos problemas usándola porque en nuestro primer diseño de la PCB nos equivocamos en el pin SDI de la tarjeta y tuvimos que poner un alambre para corregirlo. La SD Card es inicializada a 125kHz y la máxima velocidad que pongo una vez inicializada es de 1MHz. Con 1MHz me permitía leerla en varios bloques sin problema. Con 6MHz (por ejemplo) me fallaba por cualquier parte del código de inicialización o de lectura.

Ahorita que estoy volviendo a usar el programa ya me volvió a dar lata. Siempre me falla la lectura con el comando 17 (leer single block), pero curiosamente siempre después de haber leído 7 bloques (512 por bloque). Me falla en la línea marcada abajo...

Código: [Seleccionar]
void SD_Card_Read(uint32_t loc, uint8_t* data)
{
   uint16_t i;
   uint8_t r;

   SD_Card_Chip_Select(0);

   r = SD_Card_Send_Command(17, loc, 0xFF);   //read single-sector
   if (r != 0)
   {
      SD_Card_Error(__LINE__);
   }

   // wait for not busy
   do
   {
      r = SD_Card_Write_SPI(0xFF);
   }while(r == 0xFF);

   if(r != 0xFE)
   {
      SD_Card_Error(__LINE__); //------------> Aquí me devuelve una r = 0 (data token)
   }

   for (i = 0; i < SD_CARD_BLOCK_SIZE; i++)
   {
      data[i] = SD_Card_Write_SPI(0xFF);
   }
   SD_Card_Write_SPI(0xFF);  //discard of CRC
   SD_Card_Write_SPI(0xFF);

   SD_Card_Chip_Select(1);

   SD_Card_Write_SPI(0xFF);
}

Leyendo la especificación dice que siempre debe devolver un data token de 0xFE que indica que está listo para enviarme los 512 bytes del sector que pedí. El problema es que en vez de devolver un data token me devuelve un data token error en 0x00. Pero también leyendo la especificación dice que el error debe traer al menos un bit levantado, pero todos vienen en cero.  :?

La librería SD que uso es una mezcla de muchas librerías que fui recolectando de internet. Tiene lo mejor de todas buscando que cuadre con la especificación. Mi mayor problema es la conexión volada que tenemos de SDI.

Adjunto mi librería. Me gustaría saber si hay algo que me puedan sugerir para corregir este problema. Ya bajé la velocidad a 125kHz e igualmente me falla la lectura con 0x00 en el data token.

A continuación detallo que hago en la inicialización...

Inicialización
+ Uso SPI a 125kHz
+ CS en alto
+ Envío 100 relojes SPI
+ CS en bajo
+ Envía CMD0 reset con CRC 0x95
+ Envía otros comandos que no son tan relevantes
+ Envía CMD16 para definir el tamaño de bloque en 512
+ CS en alto
+ Cambio velocidad SPI a 1MHz

La conexión de la SD es como adjunto. MISO y CS llevan pull-up a 3V3.

Cualquier sugerencia me ayudará.  :)

Gracias.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SD Card - Error en lectura con comando 17
« Respuesta #1 en: 01 de Febrero de 2015, 21:37:09 »
Probé una A-Data de 2GB y una SanDisk de 1GB y ambas fallan en la lectura del token con r = 0x00.  :?

Desconectado vixctor

  • PIC16
  • ***
  • Mensajes: 109
Re: SD Card - Error en lectura con comando 17
« Respuesta #2 en: 01 de Febrero de 2015, 21:47:35 »
"+ Envía otros comandos que no son tan relevantes"

Creo que los comandos enviados después del comando 00 son más que relevantes.

Sobre todo por como se estarán manejando los comandos, lo cual depende de si la tarjeta es SD, SDH o SDHC.

Entre tarjetas SD y SDH - SDHC el modo en el que se envian las direcciones de los sectores cambian acorde al tipo de tarjeta

Yo tengo un sistema corriendo a una frecuencia SPI de 16 Mhz y nunca he tenido problemas, claro que la inicialización es más que importante...

Saludos

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SD Card - Error en lectura con comando 17
« Respuesta #3 en: 01 de Febrero de 2015, 21:59:51 »
"+ Envía otros comandos que no son tan relevantes"

Creo que los comandos enviados después del comando 00 son más que relevantes.

Sobre todo por como se estarán manejando los comandos, lo cual depende de si la tarjeta es SD, SDH o SDHC.

Entre tarjetas SD y SDH - SDHC el modo en el que se envian las direcciones de los sectores cambian acorde al tipo de tarjeta

Yo tengo un sistema corriendo a una frecuencia SPI de 16 Mhz y nunca he tenido problemas, claro que la inicialización es más que importante...

Saludos

Hola!

Sí, son relevantes, disculpa... son estos...

Código: [Seleccionar]
void SD_Card_Initialize(void)
{
   uint8_t i;
   uint8_t r[4];
   uint8_t res;
   uint16_t retries;

   SD_Card_Set_Slow_Clock();
   SD_Card_Chip_Select(1);

   for (i = 0; i < 16; i++)
   {
      SD_Card_Write_SPI(0xFF); // min 100 clocks
   }
   SD_Card_Chip_Select(0); // Enabled for SPI mode

   /* Reset the SD Card */
   retries = SD_CARD_MAX_RETRIES;
   do
   {
      res = SD_Card_Send_Command(0x00, 0, 0x95);
   }while((res != 1) && retries--);
   if (res != 1)
   {
      SD_Card_Error(__LINE__);
   }

   /* Read the OCR register */
   res = SD_Card_Send_Command(58, 0, 0xFF);
   if(res != 1)
   {
      SD_Card_Error(__LINE__);
   }
   //read CCS in the OCR - SD or Is_SDHC
   r[0] = SD_Card_Write_SPI(0xFF);
   r[1] = SD_Card_Write_SPI(0xFF);
   r[2] = SD_Card_Write_SPI(0xFF);
   r[3] = SD_Card_Write_SPI(0xFF); //rest of R3
   Is_SDHC = r[0] & 0x40;
   if (Is_SDHC)
   {
      SD_Card_Error(__LINE__);
   }
   /* check that the SDCard supports 3.3V */
   if((r[1] & 0x03) != 0x03)
   {
      SD_Card_Error(__LINE__);
   }

   /* Start the card initialization process */
   retries = SD_CARD_MAX_RETRIES;
   do
   {
      res = SD_Card_Send_Command(1, 0, 0xFF);
   }while(((res & 0x01) != 0) && retries--);

   /* The command 55 shall precede all application specific commands */
   SD_Card_Send_Command(55, 0, 0xFF);

   /* Start the SD Card mode ACMD41 */
   retries = SD_CARD_MAX_RETRIES;
   do
   {
      res = SD_Card_Send_Command(41, 0, 0xFF);
   }while(((res & 0x01) != 0) && retries--);

   //Set sector size to 512
   res = SD_Card_Send_Command(16, SD_CARD_BLOCK_SIZE, 0xFF);
   if(res)
   {
      SD_Card_Error(__LINE__);
   }

   SD_Card_Chip_Select(1);
   SD_Card_Set_Fast_Clock();
}

No estoy usando SDHC y la dirección la mando en múltiplos de 512, que es como las SD normales lo soportan.

La inicialización igualmente verifica que la SD sea normal, soporte 3V3, y que el tamaño de bloque sea 512.

vixctor, si tu inicialización fuera diferente por favor avísame  :mrgreen:

Gracias!

Desconectado vixctor

  • PIC16
  • ***
  • Mensajes: 109
Re: SD Card - Error en lectura con comando 17
« Respuesta #4 en: 01 de Febrero de 2015, 22:15:27 »
Yo lo hago todo en ensamblador, pero practicamente hago esto cada que leo un sector...

Código: [Seleccionar]

rcall CMD_16 ; Envio el comando CMD16: set# bytes = 512...    (Si no lo envio cada que leo un bloque la tarjeta se traba)

        rcall Set_Sector_Add          ; Establezco la dirección del SECTOR a leer

;****************************************************************************************************************
; Ahora procederé a enviar el comando de LECTURA CMD17...
;****************************************************************************************************************
movlw 0x51 ; CMD17: read single block
movwf mmc_cmd ; comando a enviar cargado...
setf mmc_crc ; CRC = 0xFF
bcf mmc_cs ; mmc_cs pasa a bajo para aceptar los datos... (Hasta que se termine TODA la lectura)
rcall DATA_Command ; Envio el comando y sus datos a la tarjeta SD...
;****************************************************************************************************************
addr
;****************************************************************************************************************
rcall spi_card_FF ; Envio 0xFF al bus SPI de la tarjeta SD...
nop ; NOP para concluir 11 tcy que requiere la lectura via SPI
tstfsz SSP1BUF ; La tarjeta debe enviar 0x00 una vez aceptado el comando...
bra addr ; La tarjeta aun no ha enviado 0x00, seguir esperando...
;****************************************************************************************************************
; Ahora la tarjeta me debe de contestar 0xFE para poder empezar la transferencia de datos...
;****************************************************************************************************************
wait_FE
;****************************************************************************************************************
rcall spi_card_FF ; Envio 0xFF a la tarjeta SD...
movlw 0xFE ; Esta debe de ser la contestación de la tarjeta SD...
cpfseq SSP1BUF ; data_a = 0xFE?
bra wait_FE ; Aún no, seguir enviando 0xFF hasta que la tarjeta conteste 0xFE...
return ; Listo, comando enviado, la tarjeta deberá estar lista para enviarme los datos.  =O)





Despues de eso transfiero mis 512 bytes y deshabilito la memoria, lo que si he notado es que en casi todas las tarjetas, sino envio constantemente CMD_16 se traba la tarjeta

Y si, la tarjeta efectivamente responde 0x00 y luego 0xFE SIEMPRE

Igual y por ahí esta el problema

Saludos

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SD Card - Error en lectura con comando 17
« Respuesta #5 en: 01 de Febrero de 2015, 22:26:52 »
Sí, son semejantes las rutinas de lectura. Yo antes usaba el comando 18 para lecturas múltiples, pero había que terminarlo con el comando 12. Voy a intentar el envío del comando 16 siempre que quiera leer. Puede que me ayude como a ti.

En cuanto a la inicialización, ¿notas alguna diferencia con respecto a tu rutina?

Gracias!

Desconectado vixctor

  • PIC16
  • ***
  • Mensajes: 109
Re: SD Card - Error en lectura con comando 17
« Respuesta #6 en: 01 de Febrero de 2015, 22:44:20 »
Yo creo que la única diferencia es el manejo del OCR.

Mientras que tu lo lees pero no parece que hagas algo mas alla del voltaje de las tarjetas, yo lo uso para determinar el tipo de tarjeta y el modo de comandos que estará usando, y pues también añado el comando CMD_59 para desactivar el CRC.  (De hecho lo hago así para no tener problemas en las rutinas de escritura de la tarjeta, al no tener que calcular el CRC).

De ahí en fuera, no note otras diferencias.

Y alguna vez hice lecturas múltiples de sectores, en donde efectivamente se tenían que concluir con un comando de Stop RD.  Lo que si cambia mucho como siempre es el manejo de los comandos en modo SD y en modo SDH

Saludos

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SD Card - Error en lectura con comando 17
« Respuesta #7 en: 01 de Febrero de 2015, 23:00:56 »
Probablemente, lo de los comandos entre tarjetas diferentes no lo conozco bien. Sólo tengo 2 a la mano.

Agregué la deshabilitación del CRC después del CMD_1 para inicializar la SD. Igualmente agregué el CMD_16 antes de leer con el CMD_17, pero ahora la respuesta de la SD falla en el CMD_16.

La SD responde con 0x84 o 0x8c al CMD_16, después de ya haber leído 7 bloques exitosamente.

Sobre el tipo de tarjeta, no necesitamos SDHC. Sobre el modo de los comandos que soporta la tarjeta, ¿qué me recomiendas?  :o

Tengo la sospecha de que mi modo SPI (fase y clock) están mal. También los voy a checar.

Aquí lo que tengo hasta ahora... gracias!

Código: [Seleccionar]
void SD_Card_Initialize(void)
{
   uint8_t i;
   uint8_t r[4];
   uint8_t res;
   uint16_t retries;

   SD_Card_Set_Slow_Clock();
   SD_Card_Chip_Select(1);

   for (i = 0; i < 16; i++)
   {
      SD_Card_Write_SPI(0xFF); // min 100 clocks
   }
   SD_Card_Chip_Select(0); // Enabled for SPI mode

   /* Reset the SD Card */
   retries = SD_CARD_MAX_RETRIES;
   do
   {
      res = SD_Card_Send_Command(0x00, 0, 0x95);
   }while((res != 1) && retries--);
   if (res != 1)
   {
      SD_Card_Error(__LINE__);
   }

   /* Read the OCR register */
   res = SD_Card_Send_Command(58, 0, 0xFF);
   if(res != 1)
   {
      SD_Card_Error(__LINE__);
   }
   //read CCS in the OCR - SD or Is_SDHC
   r[0] = SD_Card_Write_SPI(0xFF);
   r[1] = SD_Card_Write_SPI(0xFF);
   r[2] = SD_Card_Write_SPI(0xFF);
   r[3] = SD_Card_Write_SPI(0xFF); //rest of R3
   Is_SDHC = r[0] & 0x40;
   if (Is_SDHC)
   {
      SD_Card_Error(__LINE__);
   }
   /* check that the SDCard supports 3.3V */
   if((r[1] & 0x03) != 0x03)
   {
      SD_Card_Error(__LINE__);
   }

   /* Start the card initialization process */
   retries = SD_CARD_MAX_RETRIES;
   do
   {
      res = SD_Card_Send_Command(1, 0, 0xFF);
   }while(((res & 0x01) != 0) && retries--);

   /* Disable the CRC */
   res = SD_Card_Send_Command(59, 0, 0xFF);
   if(res)
   {
      SD_Card_Error(__LINE__);
   }

   /* The command 55 shall precede all application specific commands */
   SD_Card_Send_Command(55, 0, 0xFF);

   /* Start the SD Card mode ACMD41 */
   retries = SD_CARD_MAX_RETRIES;
   do
   {
      res = SD_Card_Send_Command(41, 0, 0xFF);
   }while(((res & 0x01) != 0) && retries--);

   //Set sector size to 512
   res = SD_Card_Send_Command(16, SD_CARD_BLOCK_SIZE, 0xFF);
   if(res)
   {
      SD_Card_Error(__LINE__);
   }

   SD_Card_Chip_Select(1);
   SD_Card_Set_Fast_Clock();
}

Código: [Seleccionar]
void SD_Card_Read(uint32_t loc, uint8_t* data)
{
   uint16_t i;
   uint8_t r;
   uint16_t retries;

   SD_Card_Chip_Select(0);

   r = 0xFF;
   retries = SD_CARD_MAX_RETRIES;
   while(r && --retries)
   {
      r = SD_Card_Send_Command(16, SD_CARD_BLOCK_SIZE, 0xFF);
   }
   if(0 != r)
   {
      SD_Card_Error(__LINE__);
   }

   r = 0xFF;
   retries = SD_CARD_MAX_RETRIES;
   while(r && --retries)
   {
      r = SD_Card_Send_Command(17, loc, 0xFF);   //read single-sector
   }
   if(0 != r)
   {
      SD_Card_Error(__LINE__);
   }

   // wait for not busy
   do
   {
      r = SD_Card_Write_SPI(0xFF);
   }while(r == 0xFE);

//   if(r != 0xFE)
//   {
//      SD_Card_Error(__LINE__);
//   }

   for (i = 0; i < SD_CARD_BLOCK_SIZE; i++)
   {
      data[i] = SD_Card_Write_SPI(0xFF);
   }
   SD_Card_Write_SPI(0xFF);  //discard of CRC
   SD_Card_Write_SPI(0xFF);

   SD_Card_Chip_Select(1);

   SD_Card_Write_SPI(0xFF);
}

Desconectado vixctor

  • PIC16
  • ***
  • Mensajes: 109
Re: SD Card - Error en lectura con comando 17
« Respuesta #8 en: 01 de Febrero de 2015, 23:11:56 »
Probablemente, lo de los comandos entre tarjetas diferentes no lo conozco bien. Sólo tengo 2 a la mano.

Agregué la deshabilitación del CRC después del CMD_1 para inicializar la SD. Igualmente agregué el CMD_16 antes de leer con el CMD_17, pero ahora la respuesta de la SD falla en el CMD_16.

La SD responde con 0x84 o 0x8c al CMD_16, después de ya haber leído 7 bloques exitosamente.

Sobre el tipo de tarjeta, no necesitamos SDHC. Sobre el modo de los comandos que soporta la tarjeta, ¿qué me recomiendas?  :o

Tengo la sospecha de que mi modo SPI (fase y clock) están mal. También los voy a checar.


Creo que podrias tener un problema en el MODO de uso de SPI, las tarjetas SD solo soportan modo 0 o 3, que ojo, en el standar SPI, el modo 0 y 3 no son los mismo que los de microchip 0 y 3, aunque en el datasheet SI existe una equivalencia...

Así es como yo tengo la configuración del modo SPI, aunque es para pics serie 18XXXX

Código: [Seleccionar]
;****************************************************************************************************************
; According to Chan, (u)SD cards can work in SPI MODE 0 & MODE 3: SPI mode = 0, CKP = 0, CKE = 1
;****************************************************************************************************************
movlw b'01000000' ; SMP=0 (sample at middle), CKE = 1 (Transmit IDLE to active: 1 to 0), BF=0
movwf SSP1STAT ;
movlw b'00100010' ; No collision, No overflow, SSPEN Enabled, CKP IDLE = Low, SPI MASTER (FOSC/64) =O(
movwf SSP1CON1 ; Listo, Modo SPI MASTER configurado...
;****************************************************************************************************************
; CKP [4] => SSP1CON1 = 0   <= 0 = Idle state = 0, 1 = Idle state = 1
; CKE [6] => SSP1STAT = 1   <= 0 = Transmit Idle to Active, 1 = Transmit Active to Idle
; SMP [7] => SSP1STAT = 0   <= 0 = Sample at middle out, 1 = Sample at end


De hecho una vez inicializada la tarjeta solo cambio la velocidad del SPI a 16 Mhz que es lo máximo a lo que puede llegar para un 18F46K22 @ 64 Mhz

Código: [Seleccionar]
movlw b'00100000' ; No collision, No overflow, SSPEN Enabled, CKP IDLE = Low, SPI MASTER (FOSC/64) =O)
movwf SSP1CON1 ; Listo, Modo SPI MASTER configurado... (SPI MODE 0)
bcf Mode_slow_SPI ; A partir de este momento la tarjeta será leida con una frecuencia de 16 Mhz... =O)



Entonces si esta muy raro las respuestas que estas obteniendo, sobre todo porque la inicialización no suele dar problemas...

Quizas tambien te falto enviar un 0xFF al final?


Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SD Card - Error en lectura con comando 17
« Respuesta #9 en: 02 de Febrero de 2015, 01:52:32 »
Entonces si esta muy raro las respuestas que estas obteniendo, sobre todo porque la inicialización no suele dar problemas...

Sí, la inicialización pasa sin problemas. Leo 7 bloques también correctamente. Cuando quiero leer de nuevo el bloque 1 es cuando falla.

Modifiqué los modos SMP, CKE y CKP. Los tenía en 1, 0 y 0 y mostraba el error. Los cambié a 1, 1 y 0 y el error sigue apareciendo al pedir el CMD_17 (borré el CMD_16 al querer leer). Ahora me regresa un 0x8F.

Probé otros modos pero en esos de plano no inicializaba.

Quizas tambien te falto enviar un 0xFF al final?

¿Al final de qué sección? Normalmente el 0xFF lo mando antes de enviar cualquier comando.

Código: [Seleccionar]
static uint8_t SD_Card_Send_Command(uint8_t frame1, uint32_t adrs, uint8_t frame2)
{
   uint16_t i;
   uint8_t res;

   SD_Card_Write_SPI(0xFF);
   SD_Card_Write_SPI(frame1 | 0x40); //first 2 bits are 01
   SD_Card_Write_SPI((adrs & 0xFF000000) >> 24); //first of the 4 bytes address
   SD_Card_Write_SPI((adrs & 0x00FF0000) >> 16);
   SD_Card_Write_SPI((adrs & 0x0000FF00) >> 8);
   SD_Card_Write_SPI(adrs & 0x000000FF);
   SD_Card_Write_SPI(frame2 | 1); //CRC and last bit 1

   for (i = 0; i < SD_CARD_MAX_RETRIES; i++)   // wait for OK
   {
      res = SD_Card_Write_SPI(0xFF);
      if (res != 0xFF)
      {
         break;
      }
   }
   return res;
}

Mientras que tu lo lees pero no parece que hagas algo mas alla del voltaje de las tarjetas, yo lo uso para determinar el tipo de tarjeta y el modo de comandos que estará usando...
Saludos

¿A qué modo de comandos te refieres?

Gracias.

Desconectado vixctor

  • PIC16
  • ***
  • Mensajes: 109
Re: SD Card - Error en lectura con comando 17
« Respuesta #10 en: 02 de Febrero de 2015, 15:41:11 »
Tengo una duda, dices que lees 7 bloques y luego quieres leer el 1ro de nuevo?  ¿No sería el 8vo bloque?

Si fuera el 1ero, tendrías que darle nuevamente la dirección del 1er bloque, porque la lectura es consecutiva

Si fuera el 8vo, ahí si aun no se porque...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: SD Card - Error en lectura con comando 17
« Respuesta #11 en: 02 de Febrero de 2015, 15:45:04 »
Santiago, no tengo mucha experiencia en SD card, pero sí recuerdo un problema que nos trajo de cabeza a Diego y a mí con un proyecto, y que finalmente se solucionó cambiando de marca de tarjeta SD.
¿Has probado con otras?


Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SD Card - Error en lectura con comando 17
« Respuesta #12 en: 02 de Febrero de 2015, 16:23:57 »
Tengo una duda, dices que lees 7 bloques y luego quieres leer el 1ro de nuevo?  ¿No sería el 8vo bloque?

Si fuera el 1ero, tendrías que darle nuevamente la dirección del 1er bloque, porque la lectura es consecutiva

Si fuera el 8vo, ahí si aun no se porque...

No, es cíclica la lectura y debo leer el bloque que empieza en el byte 512 de nuevo. Sí, mando la dirección del bloque 1 de nuevo (512).

Santiago, no tengo mucha experiencia en SD card, pero sí recuerdo un problema que nos trajo de cabeza a Diego y a mí con un proyecto, y que finalmente se solucionó cambiando de marca de tarjeta SD.
¿Has probado con otras?

Hola Manolo. Sólo tengo dos minis, la A-Data y la SanDisk. Ambas fallaban igual.  :(

---

Después de pasar escoba por tercera vez a la librería y borrar cosas que pienso que estaban de más (link), dejé las librerías como las adjunto. Por ahora están funcionando bien a 1MHz... a partir de 2MHz falla por nuestro puentecito de SDI.

Qué cambié:
+ En envíos de datos con respuesta R1 sólo espero 10 bytes (no afecta)
+ Envío 80 relojes SPI en la inicialización en vez de 128
+ Espero 512 intentos en el reset de la SD (no afecta)
+ Envío el CMD_1 de inicialización antes de cualquier otro comando, no había visto este error  :(
+ Ya no envío el CMD_58 para leer el OCR
+ Mando el CMD_16 para elegir el tamaño de bloque en 512
+ No envío comandos avanzados CMD_55 ni ACMD_41
+ Deshabilito el CRC con CMD_59

Parece que la SD nunca estuvo bien inicializada :S

Gracias!  :mrgreen:

Seguiré haciendo pruebas, espero que ya se porte bien la SD.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SD Card - Error en lectura con comando 17
« Respuesta #13 en: 02 de Febrero de 2015, 19:31:11 »
Ya encontré la causa raíz del problema, la SD volvió a fallarme.

En el PIC32 tengo 5 SPIs independientes funcionando. Cuando pedía el comando 16 ó 17 a la SD es justo cuando arranco los otros SPIs del PIC a 12.5MHz. Meten mucho ruido y atrofian la comunicación de la SD. Los SPIs de 12.5MHz arrancan justo cuando quiero leer un octavo bloque.

Espero que sólo sea error de nuestro hardware y su diseño, porque no me gustaría que fuera otro problema del silicio del PIC.  :5]

Parece que no...

http://ww1.microchip.com/downloads/en/DeviceDoc/80000588G.pdf

 :(

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: SD Card - Error en lectura con comando 17
« Respuesta #14 en: 03 de Febrero de 2015, 02:45:48 »
Joe, qué difícil de encontrar el fallo. Ahora resulta que es culpa de los otros SPI   :?