Señal de carga de condensador en la línea MOSI del puerto SPI

Estoy usando Texas Instruments Tiva C Launchpad para comunicarme con tarjetas micro SD y micro SDHC. La placa de desarrollo usa el chip TM4C123GH6PM y estoy usando el ejemplo FatFS de TI RTOS para que Launchpad acceda a la tarjeta. En el ejemplo, se utilizó el puerto SSI2 para la comunicación SPI. El puerto SSI2 está conectado a los pines del puerto B. El puerto se conecta mediante cables de puente a un adaptador de tarjeta micro SD colocado en una placa de pruebas.

Aquí está el pinout del adaptador:

GND - a tierra del Launchpad
+3.3V - desde el regulador del Launchpad
Detección de tarjeta - no conectado
DATA2 - no conectado
Chip Select - conectado a SSI2
MOSI - conectado a SSI2
Reloj - conectado a SSI2
MISO - conectado a SSI2
DATA1 - no conectado

Para que el ejemplo FAT funcionara, tuve que hacerle algunas modificaciones, ya que obviamente no se probó.

En el archivo EK_TM4C123GXL.c hice los siguientes cambios:

const SDSPITiva_HWAttrs sdspiTivaHWattrs[EK_TM4C123GXL_SDSPICOUNT] = {
    {
        SSI2_BASE,          /* SPI base address */

        GPIO_PORTB_BASE,    /* The GPIO port used for the SPI pins */
        GPIO_PIN_4,         /* SCK */
        GPIO_PIN_6,         /* MISO */
        GPIO_PIN_7,         /* MOSI */

        GPIO_PORTB_BASE,    /* Chip select port, in TI's example was PORTA_BASE */
        GPIO_PIN_5,         /* Chip select pin */

        GPIO_PORTB_BASE,    /* GPIO TX port */
        GPIO_PIN_7,         /* GPIO TX pin */
    }
};

y

Void EK_TM4C123GXL_initSDSPI(Void)
{
    /* Enable the peripherals used by the SD Card */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2);

    /* Configure pad settings */
//This was original TI's code
//    GPIOPadConfigSet(GPIO_PORTB_BASE,
//            GPIO_PIN_4 | GPIO_PIN_7,
//            GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD);
//
//    GPIOPadConfigSet(GPIO_PORTB_BASE,
//            GPIO_PIN_6,
//            GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD_WPU);
//
//    GPIOPadConfigSet(GPIO_PORTB_BASE,
//            GPIO_PIN_5,
//            GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD);//Used to be PORTA_Base, but this didn't work
    GPIOPinTypeSSI(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5 |
                                        GPIO_PIN_6 | GPIO_PIN_7);//Copied from SPI-loopback example

    GPIOPinConfigure(GPIO_PB4_SSI2CLK);
    GPIOPinConfigure(GPIO_PB5_SSI2FSS);//added
    GPIOPinConfigure(GPIO_PB6_SSI2RX);
    GPIOPinConfigure(GPIO_PB7_SSI2TX);



    /*
     * These GPIOs are connected to PB6 and PB7 and need to be brought into a
     * GPIO input state so they don't interfere with SPI communications.
     */
    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_0);
    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_1);

    SDSPI_init();
}

Después de esto, el código logró escribir correctamente un archivo en la tarjeta.

Ahora viene la pregunta real en sí:

Mientras probaba la comunicación entre el microcontrolador y la tarjeta SD, noté que en el pin MOSI hay una forma de onda que me recuerda a la carga de un capacitor.

Línea MOSI cargándose, línea MISO alta

El canal rojo es MOSI y el canal amarillo es MISO.

Al principio, pensé que podría ser la línea MISO cargando la capacitancia parásita entre los pines MISO y MOSI en la placa de desarrollo, ya que esos dos pines están uno al lado del otro. Después de investigar un poco más, llegué a la conclusión de que esta no es la causa principal del fenómeno.

Línea MOSI cargándose, línea MISO baja

Aquí podemos ver que todavía hay algo de acción de carga en la línea MOSI, aunque la línea MISO está baja en este momento.

En el adaptador de la tarjeta SD, la línea clocl está entre las líneas MOSI y MISO, así que pensé que podría estar causando el problema, pero mientras se carga el MOSI, la línea del reloj también está baja.

[Línea MOSI cargándose, reloj en amarillo, 1

El rojo es la línea MOSI, el amarillo es el reloj.

Aquí hay una foto del "triángulo" más pequeño y la línea del reloj:

Línea MOSI cargándose, reloj en amarillo, 2

Durante todo esto, la línea Chip Select se mantiene baja, por lo que podría no estar cargando el pin maestro de salida.

Entonces, ¿alguna idea de qué podría estar causando este tipo de comportamiento?

¿Es posible que esté cambiando accidentalmente la línea MOSI a una salida de colector abierto o a una entrada con un pullup débil?
@Joe Hass No estoy seguro, este es mi primer proyecto "real" con este micro y todavía no he digerido las bibliotecas que se usan aquí. En la superficie, no parece que eso esté sucediendo, pero hasta que investigue el código fuente, no puedo decirlo con seguridad. El micro tiene la opción de establecer salidas a colector abierto.
¿Estás mostrando todo el material de tu código porque crees que puede estar relacionado con tu código?
@Andy alias Bueno, sí. Tal vez sería un poco más exacto decir que no puedo decir que el código que estoy usando no está relacionado con esto. Por el momento, no veo cómo el código que publiqué podría producir el efecto que se muestra, pero aún no me siento lo suficientemente cómodo con la cadena de herramientas para decir que el error no está en el código. En realidad, sospecho que probablemente esté en algún lugar de una de las funciones llamadas, ya que el microcontrolador tiene resistencias de pull-up débiles como característica, pero deberían desactivarse durante todo el procedimiento, hasta donde entiendo cómo funcionan las cosas.
tal vez, si es posible, programe los pull ups para que tengan valores más regulares como 10k o simplemente coloque una resistencia externa de 10k. Parece una carga de tapa y con una resistencia de valor bajo conocida, la curva de carga le indicaría la capacitancia de la línea y brindaría una mejor explicación.
@Andy, también conocido como Sí, sería útil obtener un valor aproximado de la capacitancia y luego intentar compararlo con los valores de las resistencias pull-up. Esto me permitiría determinar si son la causa. Lo agregaré a la lista de cosas para probar.

Respuestas (1)

Parece que su línea MOSI está en estado Z a veces y un pull-up débil en esta línea la está cargando. Esto no es una interferencia de línea cruzada.