La tarjeta MicroSD no devolverá ningún dato en el comando de lectura

4

Solo quiero aclarar con todos que he agotado todas mis opciones de búsqueda en busca de una respuesta y aún no puedo encontrar la respuesta a mi problema.

Estoy tratando de conectar una ranura de tarjeta micro sd con mi proyecto pic32 al golpear un spi. No he tenido ningún problema al inicializar, y puedo leer el registro de OCR y CSD, pero cuando envío el comando de lectura del sector, obtengo 512 bytes de 0 sin importar qué.

He intentado con varias tarjetas con el mismo resultado con todos. Estoy usando tarjetas MicroSD estándar SanDisk de 2GB. Están formateados como FAT (FAT16) tanto por Windows como mediante el SDFormatter proporcionado por sdcard.org. He utilizado Disk Investigator para confirmar que el MBR contiene los datos correctos.

Aquí está la secuencia que estoy usando para inicializar:

//Low speed
Send 10 Bytes of data to 'wake up' card w/ CS High
Send CMD0 to reset until response is idle (0x01)
Send CMD8 w/ arg 0x1AA and read correct response to verify SDC V2
Send ACMD41 w/ HCS flag to initialize until no longer idle (0x00)
//High speed
Send CMD58 to read OCR and check CCS flag in response
Send CMD16 to set block length to 512 Bytes
//At this point I should be able to read the MBR but get nothing
Send CMD17 /w arg 0x00 to read very first sector

Cuando envío el comando de lectura, obtengo una respuesta R1 correcta 0x00, luego, algunas transferencias de bytes más adelante, recibo 0xFE que indica el inicio de los datos, pero la línea de datos solo baja para 512 bytes y no se lee nada .

He intentado escribir en un sector con datos ficticios, obteniendo la respuesta de 'datos aceptados', pero cuando intenté leerlos nuevamente, obtuve todos los ceros nuevamente. Me pregunto si estoy haciendo algo mal con mi inicialización.

Estoy seguro de que no es un problema que mi programa envíe el comando incorrecto, ya que tengo todo conectado a un ámbito y todo parece estar correcto. Aquí están las capturas de pantalla:

Aquí está la secuencia de lectura que estoy enviando

Einmediatamentedespués,larespuestaquerecibo

Cualquier información sobre por qué esto no funciona sería apreciada. He pasado mucho más tiempo en esto de lo que me gustaría, y como muchas cosas, probablemente sea un problema simple que no estoy viendo. Espero que conjuntos adicionales de ojos detecten mi problema. Gracias de antemano, y actualizaré con la información necesaria para ayudar a resolver este problema.

EDITAR, más cosas que he probado:

  1. He establecido el CS bajo para toda la secuencia de lectura, y no hay cambios en la respuesta.

  2. He cambiado el CRC fijo al CRC real requerido por la secuencia de lectura, sin cambios en la respuesta.

Al usar Disk Investigator para leer la tarjeta en la computadora, puedo ver el resultado esperado al leer el primer sector como se muestra:

0000  EB 00 90 20 20 20 20 20   . . .          
0008  20 20 20 00 02 40 01 00         . . @ . .
0010  02 00 02 00 00 F8 EC 00   . . . . . . . .
0018  3F 00 40 00 87 00 00 00   ? . @ . . . . .
0020  79 EF 3A 00 80 00 29 10   y . : . . . ) .
0028  41 2E 17 4E 4F 20 4E 41   A . . N O   N A
0030  4D 45 20 20 20 20 46 41   M E         F A
0038  54 31 36 20 20 20 00 00   T 1 6       . .
0040  00 00 00 00 00 00 00 00   . . . . . . . .
----  All Zeros -------------   ---------------
01F0  00 00 00 00 00 00 00 00   . . . . . . . .
01F8  00 00 00 00 00 00 55 AA   . . . . . . U .

Lista de bloques de Miso y Mosi durante el inicio (formateado como imagen de alcance):

// wake up with 80 clk pulses w/ cs high not shown here
// First CMD0 send:
00 00 00 00 00 00 3F 01
40 00 00 00 00 95 FF FF

//Second CMD0 send:
FF FF FF FF FF FF FF C1 7F
40 00 00 00 00 95 FF FF FF

//Third CMD0 send:
FF FF FF FF FF FF FF 01 FF
40 00 00 00 00 95 FF FF FF

//CMD8 w/ 0x1AA arg
FF FF FF FF FF FF FF 01 00 00 01 AA FF
48 00 00 01 AA 87 FF FF FF FF FF FF FF

//ACMD41 w/ HCS flag          6 times before 00-vv
FF FF FF FF FF FF FF 01 FF FF FF FF FF FF FF FF 01 FF
77 00 00 00 00 95 FF FF FF 69 40 00 00 00 95 FF FF FF

//CMD58 read OCR
FF FF FF FF FF FF FF 00 80 FF 80 00 FF
7A 00 00 00 00 95 FF FF FF FF FF FF FF

//CMD16 to set block length
FF FF FF FF FF FF FF 00 FF
50 00 00 02 00 95 FF FF FF

After this is the read function shown above
    
pregunta farraman

2 respuestas

4

Publicar esta respuesta como un extracto de los comentarios, ya que el problema parece haberse resuelto.

  

Los registros en la tarjeta SD pueden ser más tolerantes a las caídas de voltaje   acceso a la memoria real, por lo que esto podría ser un problema de alimentación, tal vez usted   Puede verificar con su alcance que el suministro de voltaje a la tarjeta permanece   Dentro de 2.7 a 3.6 V todo el tiempo. - apalopohapa

     

@apalopohapa Success, Mirando el voltaje de entrada, estaba bien arriba   hasta el inicio del ACMD41, luego bajó a 2. Mi jefe señaló una   diodo en una página diferente del esquema que debería haber sido atado   bajo. Ahora estoy leyendo todo correctamente, y puedo continuar. Sólo soy   frustrado porque una y otra vez he tenido que decirme que   verifique el poder cuando tengo problemas, y no puedo simplemente asumir que no es un   Problema porque funciona la mitad del tiempo. Aprecio a todos tus chicos   ayuda. - farraman

    
respondido por el apalopohapa
2

La línea azul "4" se parece a una señal CS "automática" generada por el periférico SPI. Esto no funcionará de manera confiable con la tarjeta SD, ya que requieren que la línea CS esté baja (= seleccionada) durante toda la secuencia del comando de lectura.

Pero el CS automático se pondrá alto en caso de que algo como una interrupción demore la recarga del registro de salida SPI con un nuevo valor, lo que provocará que la tarjeta aborte el comando.

El funcionamiento manual de la línea CS mediante un puerto GPIO evita este problema.

Editar: Su "primer sector" es el primer sector de la primera partición , no el primer sector del "disco" (o tarjeta en este caso). Leer el primer sector de la tarjeta (la tabla de particiones) requerirá privilegios de administrador, y no puede usar la letra de unidad. Debe utilizar el nombre del dispositivo pyhsical. El investigador del disco no parece ser capaz de esto.

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas