Estoy utilizando la plataforma de lanzamiento Tiva C de Texas Instruments para comunicarme con una tarjeta micro SD y una tarjeta micro SDHC. La placa de desarrollo utiliza el chip TM4C123GH6PM y estoy usando el ejemplo FatFS de TI RTOS para que el Launchpad acceda a la tarjeta. En el ejemplo, el puerto SSI2 se utilizó 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 - al campo de launchpad
+ 3.3V - desde el regulador de Launchpad
Detección de tarjeta - no conectado
DATA2 - no conectado
Selección de chip - conectado a SSI2
MOSI - conectado a SSI2
Reloj - conectado a SSI2
MISO - conectado a SSI2
DATOS1 - no conectado
Para que el ejemplo FAT funcione, tuve que hacer algunas modificaciones, ya que obviamente no fue probado.
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 un archivo en la tarjeta correctamente.
Ahora viene la pregunta 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 un condensador que se está cargando.
ElcanalrojoesMOSIyelcanalamarilloesMISO.
Alprincipio,penséquepodríaserlalíneaMISOquecargalacapacitanciaparásitaentrelospinesMISOyMOSIenlaplacadedesarrollo,yaqueesosdospinesestánunoalladodelotro.Despuésdeprobarunpocomás,lleguéalaconclusióndequeestanoeslacausaprincipaldelfenómeno.
Aquí podemos ver que todavía hay algo de acción de carga en la línea MOSI, incluso aunque la línea MISO esté baja en este momento.
En el adaptador de la tarjeta SD en sí, la línea de clocl está entre las líneas MOSI y MISO, así que pensé que podría estar causando el problema, pero mientras que el MOSI se está cargando, la línea del reloj también está baja.
ElrojoeslalíneaMOSI,elamarilloeselreloj.
Aquíhayunafotodel"triángulo" más pequeño y la línea del reloj:
Durante todo esto, la línea de Selección de Chip se mantiene baja, por lo que no podría estar cargando el pin de salida maestro.
Entonces, ¿alguna idea de qué podría estar causando este tipo de comportamiento?