¿Por qué enviamos algunos datos ficticios antes de enviar cualquier comando a una tarjeta microSD?

0

Estoy conectando una tarjeta microSD con un microcontrolador. El siguiente fragmento de código se toma de Nota de aplicación 189 (AN189), MMC DATA LOGGER EXAMPLE en la pagina no. 30. El MMC_Command_Exec () básicamente implementa los detalles para enviar los comandos apropiados a la tarjeta microSD.

// Send the SEND_OP_COND command until
// the MMC indicates that it is no
// longer busy (ready for commands).
do
{
    SPI0DAT = 0xFF;
    while (!SPIF) {
    }
    SPIF = 0;
    card_status.i = MMC_Command_Exec(SEND_OP_COND,EMPTY,EMPTY);
}
while ((card_status.b[0] & 0x01))
    ;

No puedo entender cuál es la necesidad de enviar FF (instrucción SPI0DAT = 0xFF;) antes de enviar el comando usando MMC_Commd_Exec?

He comprobado que si elimino SPI0DAT = 0xFF; y puse un retraso de 200 ms e incluso más, nunca obtengo un resultado correcto.

También, puedo ver en otros lugares que este tipo de datos ficticios no se enviaron, por ejemplo:

// Read the Operating Conditions Register (OCR).
do
{
    card_status.i = MMC_Command_Exec(READ_OCR,EMPTY,pchar);
}
while (!(*pchar&0x80))
    ; // Check the card busy bit of the OCR

Entonces, la pregunta simple es cuándo enviar y cuándo no.

    
pregunta gpuguy

3 respuestas

3

El protocolo bidireccional SPI requiere que cada vez que el maestro intente intercambiar un byte de datos, el esclavo siempre esté listo para recibir un byte de datos y escupir uno. El maestro alimentará al esclavo con un byte en MOSI sin importar si el esclavo está listo para hacer algo útil con él, y lo que haga el esclavo en el pin MISO será interpretado como un byte de datos por el maestro, ya sea que lo haga. El esclavo tenía algo útil que quería decir.

Para lidiar con esto, muchos chips SPI definen su comportamiento de modo que el primer byte que sigue a una selección de chip indicará si el dispositivo está listo para hacer algo con una solicitud de comando que no sea soltarlo. Efectivamente, lo primero que hace el maestro es preguntar "¿estás listo?" Si el esclavo responde "no", el maestro puede preguntar repetidamente tantas veces como quiera hasta que el esclavo diga "sí". Tal diseño es bastante simple de implementar en el lado esclavo, y es bastante fácil de usar desde el lado maestro. Además, generalmente no es difícil subdividir los diferentes tipos de operaciones que un dispositivo puede realizar en pasos que son lo suficientemente pequeños para que, una vez que el esclavo esté listo para comenzar a realizar un paso, pueda intercambiar todos los datos con ese paso tan rápido. como el maestro se preocupa por cronometrarlo, sin más demora.

Una ligera arruga en todo esto es que algunos esclavos pueden necesitar pulsos en el cable del reloj para realizar ciertas operaciones. Como ejemplo común, muchos diseños esperan bloquear los 8 bits del próximo byte que enviarán antes de recibir el primer impulso de reloj. Si un dispositivo que está preparado para enviar un byte que dice "no listo" está listo, no tendría forma de saber si un pulso de reloj podría llegar justo cuando se estaba preparando para cambiar el siguiente byte que transmitió, haciendo que ese byte contienen una mezcla de datos antiguos y nuevos. Una forma de evitar semejante peligro es hacer que un dispositivo decida en el sexto ciclo de reloj de cada byte si se notificará como listo en el siguiente byte. Incluso si el dispositivo está listo justo cuando recibe el sexto ciclo de un byte, para cuando se reciba el ciclo ocho, el dispositivo ya habría tenido la oportunidad de decidir si pensaba que estaba listo antes del sexto ciclo ( en cuyo caso el siguiente byte debe informar "listo") o no hacerlo (en cuyo caso debe informar otro byte "no listo").

    
respondido por el supercat
1

Supongo que es un marcador de posición para permitir que el procesador de la tarjeta realice un procesamiento de datos local.

También es posible que la lógica de la tarjeta esté usando el reloj SPI para sincronizar algunos registros internos. En ese caso, puede necesitar los 8 ciclos de reloj producidos al escribir SPI0DAT para preparar su respuesta.

Desde la página 5 del documento que vinculas:

Before the MMC can be used, it must be properly 
powered on and initialized. It must also be configured to 
SPI mode. Figure 5and the following steps show the 
initialization sequence:
1. After receiving power, transmitat least 74 SPI clock cycles 
so that all internal start up operations can complete.
2. Drive the CS pin low.
3. Transmit a CMD0 to switch the card into SPI mode.
4. Transmit 8 SPI clock cycles.
5. Transmit a CMD1.
6. If the response to CMD1 indicates that the card is busy, go 
back to step 4. Otherwise, the card initialization is 
successful and the card can now receive and respond to 
commands.
7. Once the card is initialized, the size must be determined. 
This is done by retrieving the card specific data register 
(CSD) using CMD9 (SEND_CSD). The card size fields are 
located within this register. See the comments of the Flash 
initialization function on MMC_FLASH_Init()for specific 
implementation details.

Y en la página 6:

Creo que, por el momento, simplemente debes asumir que es un capricho del diseño de la tarjeta SD. A menos que pueda obtener la documentación de bajo nivel del protocolo de interfaz SD / MMC, eso es todo lo que realmente puede determinar.

    
respondido por el Connor Wolf
1

Algunas tarjetas SD requieren ciclos de reloj adicionales para prepararse para el siguiente comando. El envío de datos ficticios de un byte está dando ocho ciclos a la tarjeta.

Pero es más común esperar una respuesta no ocupada de la tarjeta SD (enviando repetidamente 0xFF). Mientras que la tarjeta SD está ocupada, algunos mantienen su "pin de salida" alto, por lo tanto, los datos con los que se sincroniza siempre son 0xFF.

    
respondido por el Rev1.0

Lea otras preguntas en las etiquetas