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:
-
He establecido el CS bajo para toda la secuencia de lectura, y no hay cambios en la respuesta.
-
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