Ich verwende Texas Instruments Tiva C Launchpad, um mit Micro-SD- und Micro-SDHC-Karten zu kommunizieren. Das Entwicklungsboard verwendet den TM4C123GH6PM- Chip und ich verwende das FatFS-Beispiel von TI RTOS für das Launchpad, um auf die Karte zuzugreifen. Im Beispiel wurde Port SSI2 für die SPI-Kommunikation verwendet. Der SSI2-Port ist mit den Pins von Port B verbunden. Der Port ist über Jumperdrähte mit einem Micro-SD-Kartenadapter verbunden, der auf einem Steckbrett positioniert ist.
Hier ist die Pinbelegung des Adapters:
GND – zur Masse des Launchpads
+3,3 V – von der Reglerkarte des Launchpads
– nicht verbunden
DATA2 – nicht verbunden
Chip Select – verbunden mit SSI2
MOSI – verbunden mit SSI2
Clock – verbunden mit SSI2
MISO – verbunden mit SSI2
DATA1 – nicht verbunden
Um das FAT-Beispiel zum Laufen zu bringen, musste ich einige Änderungen daran vornehmen, da es offensichtlich nicht getestet wurde.
In der Datei EK_TM4C123GXL.c habe ich folgende Änderungen vorgenommen:
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 */
}
};
Und
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();
}
Danach gelang es dem Code, eine Datei korrekt auf die Karte zu schreiben.
Jetzt kommt die eigentliche Frage selbst:
Während ich die Kommunikation zwischen dem Mikrocontroller und der SD-Karte untersuchte, bemerkte ich, dass es am MOSI-Pin eine Wellenform gibt, die mich an eine Kondensatorladung erinnert.
Der rote Kanal ist MOSI und der gelbe Kanal ist MISO.
Zuerst dachte ich, dass es die MISO-Leitung sein könnte, die die parasitäre Kapazität zwischen den MISO- und MOSI-Pins auf der Entwicklungsplatine auflädt, da diese beiden Pins nebeneinander liegen. Nach weiterem Nachforschen kam ich zu dem Schluss, dass dies nicht die Hauptursache des Phänomens ist.
Hier können wir sehen, dass auf der MOSI-Leitung noch etwas Ladevorgang stattfindet, obwohl die MISO-Leitung im Moment niedrig ist.
Auf dem SD-Kartenadapter selbst befindet sich die Taktleitung zwischen den MOSI- und MISO-Leitungen, daher dachte ich, dass dies das Problem verursachen könnte, aber während das MOSI aufgeladen wird, ist die Taktleitung ebenfalls niedrig.
Rot ist die MOSI-Linie, Gelb ist die Uhr.
Hier ist eine Aufnahme des kleineren "Dreiecks" und der Uhrlinie:
Während all dies wird die Chip-Select-Leitung niedrig gehalten, sodass sie den Master-Out-Pin nicht laden kann.
Also irgendwelche Ideen, was diese Art von Verhalten verursachen könnte?
Sieht so aus, als ob Ihre MOSI-Leitung manchmal Z-festgelegt ist und ein schwacher Pull-up auf dieser Leitung sie auflädt. Dies ist keine leitungsübergreifende Interferenz.
Joe Hass
Andreja Ko
Andi aka
Andreja Ko
Andi aka
Andreja Ko