Forum: Mikrocontroller und Digitale Elektronik STM32 SPI2 als Master sendet nichts


von vaid (Gast)


Angehängte Dateien:

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

von holger (Gast)


Lesenswert?

Versuchs mal so
1
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO
2
, ENABLE);

von vaid (Gast)


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)

von Lutz (Gast)


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".

von vaid (Gast)


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 ;-)

von holger (Gast)


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.

von Matthias K. (matthiask)


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

von holger (Gast)


Lesenswert?

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);
         ^
         |

von vaid (Gast)


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 ;-)

von Ulrich P. (uprinz)


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

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
Noch kein Account? Hier anmelden.