Ahoi! Ich arbeite mit dem STM32-P103 Board von Olimex. Im Anhang befindet sich der Sourcecode meines "Projekts". Ich versuche 32 Werte aus einem Array über die SPI2 auszugeben. Die Routine wird so wie ich das sehe (Kontrolle per blinkender LED) auch korrekt ausgeführt, leider bleibt aber der SPI2 Pin tot. Könnte bitte jemand kurz meinen Code überfliegen? Ich habe schon mit dem Baudrateprescaler rumgespielt, brachte keinen Erfolg (hatte in einem anderen Thread zur Lösung geführt). Die Defines zum SPI_Master sind in der main.h Vielen Dank und Gruß vaid
Versuchs mal so
1 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO |
2 | , ENABLE); |
Hatte ich schon versucht (und jetzt eben nochmal getestet), geht aber nicht. Hatte gelesen, dass wird nur benötigt wenn die Pins remapped sind. Was auch immer das heisst :-) Nur zum Verständnis, die Werte sollten doch auch ohne Beschaltung ausgegeben werden? (sprich NSS wird verwendet)
Ich verstehe die main nicht so ganz: Wird in main TxIdx auch irgendwo wieder zurückgesetzt? Sonst wird die "Schleife" while (1) ja nur ein mal durchlaufen, da while (TxIdx < BufferSize) nur beim ersten Durchlauf erfüllt ist (wegen [TxIdx++]). Verfolge am besten mal die Werte von TxIdx durch die ganze main und schaue, ob es das ist, was Du wolltest. Remappen heißt übrigens, daß die Pinfunktionalität auf andere Pins umgeschaltet werden kann. Man kann also eine bestimmte Funktion auf alternativ auf andere Pins "remappen".
Lutz schrieb: > Ich verstehe die main nicht so ganz: Wird in main TxIdx auch irgendwo > wieder zurückgesetzt? Sonst wird die "Schleife" > while (1) > ja nur ein mal durchlaufen, da > while (TxIdx < BufferSize) > nur beim ersten Durchlauf erfüllt ist (wegen [TxIdx++]). > Verfolge am besten mal die Werte von TxIdx durch die ganze main und > schaue, ob es das ist, was Du wolltest. Das "soll" auch so sein. Ich möchte eigentlich ein Display an SPI2 knoten. Bevor ich das aber tue schaue ich erst, ob da überhaupt was gesendet wird. Und das ist nicht der Fall ;-)
>Das "soll" auch so sein.
Zum testen eher schlecht. Stell das mal auf
Dauerfeuer und sende ein 0xAA. An der Clockleitung
und auf MOSI sollte es dann takten. Vieleicht misst du
ja auch am falschen Pin.
PS: Du hast MISO auf Ausgang geschaltet.
GPIO Takt für Port B freigeben was nun B oder C? /* Enable GPIOB clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); Versuch mal zu warten bis SPI wieder komplett frei ist. while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET); // Warten bis letztes Byte vollständig gesendet ist
He, he. Fällt da was auf? #define SPI_MASTER_GPIO_CLK RCC_APB2Periph_GPIOB ^ | RCC_APB1PeriphClockCmd(SPI_MASTER_GPIO_CLK | SPI_MASTER_CLK, ENABLE); ^ |
holger schrieb: > He, he. Fällt da was auf? Astrein, Danke. Warum wird in der Standard Lib auch immer die Schnittstelle genommen die ich NICHT benutze ;-) Über den Fehler stolpere ich nun zum 2. mal. Wenn das so weiter geht schmeiss ich die scheiss Lib weg und beschreib Register. Kann dann zwar keine Sau mehr verstehen, aber kann z.Z. ja irgendwie auch niemand ;-)
vaid schrieb: > Über den Fehler stolpere ich nun zum 2. mal. Wenn das so weiter geht > schmeiss ich die scheiss Lib weg und beschreib Register. Kann dann zwar > keine Sau mehr verstehen, aber kann z.Z. ja irgendwie auch niemand ;-) Das ist bei dieser Lib der einzig richtige Weg. Reinschauen was man alles machen muss, dann eigenen Code optimiert entwickeln. Was durch Komprimierung, Vereinfachung und Effektivität an Verstehbarkeit verloren geht, kann durch ein paar sinnvolle Kommentare wieder wett gemacht werden. Gruß, Ulrich
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.