4 votos

La tarjeta MicroSD no se devuelven los datos en el comando de lectura

Sólo quiero aclarar que con todos los que he agotado todas mis opciones de búsqueda en busca de una respuesta, y todavía no puede encontrar la respuesta a mi problema.

Estoy tratando de interfaz de una ranura de tarjeta micro sd con mi pic32 proyecto por poco golpea un spi. No he tenido ningún problema al inicializar, y puedo leer la OCR y el CSD registrar bien, pero cuando voy a enviar la lectura sector de comandos, tengo 512 Bytes de 0, no importa qué.

He probado con varias tarjetas con el mismo resultado con todos. Estoy usando SanDisk de 2 gb de tarjeta MicroSD estándar. Son formateado como FAT(FAT16) por Windows y el uso de la SDFormatter proporcionada por sdcard.org. He usado el Disco Investigador para confirmar que el MBR contiene los datos correctos.

Aquí está la secuencia estoy utilizando 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 tengo que enviar el comando de lectura, he de hacer una correcta R1 respuesta 0x00, a continuación, un par de transferencias de Byte más tarde, recibí 0xFE que indica el inicio de datos, pero los datos de la línea de baja de 512 Bytes, y nada de lo que se lee.

He intentado escribir en un sector con datos ficticios, obteniendo los datos de 'aceptado' respuesta, pero cuando traté de leer de nuevo, tengo todos los ceros de nuevo. Me pregunto si estoy haciendo algo mal con mi inicialización.

Estoy seguro de que no es un problema con mi programa de envío de la orden equivocada, como lo tengo todo conectado a un ámbito, y todo parece estar correcto. Aquí están las capturas de pantalla:

Aquí está la lectura de la secuencia estoy enviando Here is the read command sequence I am sending

E inmediatamente después, la respuesta que recibo And immediately following, the response I get

Alguna idea de por qué esto no funciona se agradece. He pasado mucho más tiempo en esto que me gustaría, y como muchas cosas, es probable que sea un simple problema de que no estoy viendo. Estoy esperando extra pares de ojos que notara mi problema. Gracias de antemano, y voy a actualizar con toda la información necesaria para ayudar a resolver este problema.

EDITAR más cosas que he probado:

  1. He instalado el CS baja para toda la lectura de la secuencia, y ningún cambio en la respuesta.

  2. He cambiado el fijo de la CRC para el real CRC necesario por la lectura de la secuencia, no hay cambio en la respuesta.

Mediante el uso de Disk Investigator para leer la tarjeta en el ordenador, puedo ver el resultado esperado a partir de la lectura del 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 CE 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 . . 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 . . . . . . . .
\begin{align*}
ds^2=dr^2+\psi(r,\theta)^2d\theta^2,
\endTodos Los Ceros ------------- ---------------
01F0 00 00 00 00 00 00 00 00 . . . . . . . .
01F8 00 00 00 00 00 00 55 AA . . . . . . U .

Lista de Miso y Mosi bloques durante init (formato s-ámbito de aplicación de la imagen):

// se despierta con 80 clk pulsos w/ cs de alta no se muestra aquí
// Primero CMD0 enviar:
00 00 00 00 00 00 3F 01
40 00 00 00 00 95 FF FF

//Segundo CMD0 enviar:
FF FF FF FF FF FF FF C1 7F
40 00 00 00 00 95 FF FF FF

//Tercera CMD0 enviar:
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 bandera 6 veces antes de 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 leer 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 para establecer la longitud del bloque de
FF FF FF FF FF FF FF 00 FF
50 00 00 02 00 95 FF FF FF

Después de esto es la función de lectura se muestra arriba

4voto

Rob Lachlan Puntos 7880

La publicación de esta respuesta como un extracto de los comentarios, ya que el problema parece haber sido resuelto.

Los registros en la tarjeta SD pueden ser más tolerantes a las caídas de voltaje que la real de acceso a la memoria, por lo que esto podría ser un problema de poder, tal vez usted puede consultar con su alcance de que el suministro de voltaje a la tarjeta de estancias dentro de 2.7 a 3.6 V todo el tiempo. – apalopohapa

@apalopohapa Éxito, Mirando a la tensión de entrada, se multa de hasta hasta el ACMD41 init, luego bajó a 2. Mi jefe señaló un diodo en una página diferente de la esquemático que debería haber sido atado baja. Ahora me estoy leyendo todo correctamente, y puede continuar. Estoy solo frustrada porque una y otra vez he tenido que decirme que me compruebe la alimentación si tienen problemas, y yo no puede simplemente asumir que no es un problema debido a que se trabaja la mitad del tiempo. Les agradezco a todos sus chicos' ayuda. – farraman

2voto

markpasc Puntos 775

El azul "4" de la línea se ve como un "automático" CS señal generada por el SPI peripherial. Esto no va a funcionar de forma fiable con la tarjeta SD, ya que requieren de la CS de la línea de bajo (=seleccionado) durante todo el comando de lectura de la secuencia.

Pero el automático CS va a girar a la de alta, en caso de que algo como una interrupción retrasos en la realimentación de la salida SPI registrarse con un nuevo valor causantes de la tarjeta para cancelar el comando.

Funcionamiento de la línea CS manualmente utilizando un puerto GPIO, evita este problema.

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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X