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.
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.
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.
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:
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?
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.
joe hass
AndrejaKo
Andy alias
AndrejaKo
Andy alias
AndrejaKo