STM32 SPI2 als Master sendet nichts

Gast #2207264
Lesenswert?

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
Angehängte Dateien:
Gast #2207284
Lesenswert?

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)
Gast #2207303
Lesenswert?

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".
Gast #2207315
Lesenswert?

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 ;-)
Gast #2207337
Lesenswert?

>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.
#2207340
Lesenswert?

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
Gast #2207491
Lesenswert?

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 ;-)
(Firma: DC3AX) #2207563
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren