Forum: Mikrocontroller und Digitale Elektronik SPI3 am STM32


von Karl D. (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag,

ich versuche gerade den SPI3 (GPIOC 10-13) an meinem STM32F407VG zum 
laufen zu bekommen und benutzte folgenden Code:
1
SPI_HandleTypeDef hspi3;
2
uint8_t aTxMasterBuffer[] = {0xF0, 0x0F};
3
4
void SPI3_Init(void)
5
{
6
  /* GPIO Ports Clock Enable */
7
  __HAL_RCC_GPIOC_CLK_ENABLE(); // ?
8
  __GPIOC_CLK_ENABLE();
9
  __SPI3_CLK_ENABLE();
10
11
  /* SPI3 parameter configuration*/
12
  hspi3.Instance = SPI3;
13
  hspi3.Init.Mode = SPI_MODE_MASTER;
14
  hspi3.Init.Direction = SPI_DIRECTION_2LINES;
15
  hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
16
  hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
17
  hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
18
  hspi3.Init.NSS = SPI_NSS_SOFT;
19
  hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
20
  hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
21
  hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
22
  hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
23
  hspi3.Init.CRCPolynomial = 10;
24
  if (HAL_SPI_Init(&hspi3) != HAL_OK)
25
  {
26
    //Error_Handler();
27
  }
28
29
  GPIO_InitTypeDef GPIO_InitStruct;
30
31
  GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
32
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
33
  GPIO_InitStruct.Pull = GPIO_PULLUP;
34
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
35
  GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
36
37
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
38
39
  for(;;) {
40
    HAL_SPI_Transmit(&hspi3, (uint8_t *)aTxMasterBuffer, strlen(aTxMasterBuffer), HAL_MAX_DELAY);
41
  }
42
}

Das Signal, welches ich mit WaveShare (über meinem Analog Discovery) 
empfange ist aber nur Kauderwelsch.
Ich kann da gerade auch kein System entdecken. Habe ich etwas falsch 
eingestellt?

von FachLaie (Gast)


Lesenswert?

Karl D. schrieb:
> hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;

Wenn dem so ist dann gehst du vermutlich mit geschätzten
168 MHz / 4 (oder /8?) auf den SPI Clock. Das will erst
mal richtig gemessen werden.

Da ich deine Clock Konfiguration nicht kenne (du sie nicht
veröffentlicht hast) ist das nur erst mal eine grobe Schätzung.

von Karl D. (Gast)


Lesenswert?

Danke für die Anregung. Ich werde mir nochmal die genauen Clocks 
ansehen.
Es wäre echt schade, wenn es daran liegt, zumal der AD2 eine Samplerate 
von 100 Mhz hat (wenn ich mich richtig erinnere).

von FachLaie (Gast)


Lesenswert?

Karl D. schrieb:
> Es wäre echt schade, wenn es daran liegt

Was wäre schade? Wenn es woran liegt?

Ein SPI Datenverkehr den du wegen der hohen Frequenz
nicht messen bzw. nicht analysieren kannst bedeuted ja
nicht dass er nicht funktioniert.

Oder wie sollte man deine Äusserungen sonst verstehen?

Karl D. schrieb:
> zumal der AD2 eine Samplerate von 100 Mhz hat

Was hat der AD2 mit der SPI Datenrate zu tun?

Vielleicht müsstest du noch ein paar klärende Worte zu
deinen sehr vagen Gedankenfragmenten fallen lassen.

von Karl D. (Gast)


Angehängte Dateien:

Lesenswert?

Hey.

Also im Grund genommen möchte ich über den SPI3 Bus eine Kommunikation 
zwischen STM32 und Computer aufbauen, um mir so schnell Daten anzeigen 
zu lassen.
Beim setzen des Prescalers auf "SPI_BAUDRATEPRESCALER_32" ergibt sich 
eine Frequenz von 1,287 Mhz auf der SCK Leitung. Ich habe jetzt gedacht, 
dass ich den AD2 als Logger benutzen kann, da ich mir die Werte mit der 
WaveForms Software anzeigen lassen kann. Der AD2 spielt also den Slave.

Das Signal der MOSI und SCK Leitung sieht am Oszilloskop auch gut aus, 
jedoch sind die Werte falsch, die bei mir ankommen.

1
uint16_t aTxMasterBuffer[] = {0xFFFF};
2
  for(;;) {
3
    HAL_SPI_Transmit(&hspi3, (uint16_t *)aTxMasterBuffer, strlen(aTxMasterBuffer), HAL_MAX_DELAY);
4
  }
Sollte am AD2 auch die 0xFFFF anzeigen, auch wenn ich ggf. das Startbit 
verschieben müsste. Aber die Ausgabe sieht man auf dem Screenshot im 
Anhang.

Mir ist absolut nicht klar wo der Fehler liegt.
Ich hoffe, meine Erklärung war verständlich.

von FachLaie (Gast)


Lesenswert?

Karl D. schrieb:
> dass ich den AD2 als Logger benutzen kann

Wer ist AD2?

Kennst du BY53?

Fragen über Fragen.

Kannst du dich in jemanden hineinversetzen der nicht deine
Entwicklungsumgebung kennt?

von Karl D. (Gast)


Angehängte Dateien:

Lesenswert?

AD2: = Analog Discovery 2.
Der AD2 (Analog Discovery 2) ist ein kleines Prüfinstrument mit dem ich 
mir Signale angucken und aufnehmen kann. Er hat zum Beispiel ein 2 Kanal 
Oszilloskop (14-Bit, 100 Msample/Sek), einen Zweikanal 
Funktionsgenerator, einen 16-Kanal-Digital-Logik-Analysator, digitale 
Busanalysatoren (SPI, I²C) und noch ein paar Sachen mehr.


Ich habe also mein STM32F407VG Board (selbstentwickelt). Auf dem habe 
ich u.a. den oben genannten Code aufgespielt. Die Pins PC10 bis PC13 
gehen direkt zu einem Pinheader, ohne das an diesen Leitungen sonst noch 
irgendetwas angeschlossen ist. Der Analog Discovery 2 ist direkt mit dem 
Pinheader verbunden. GND, SCK, MOSI.
Ich versuche nun einen vordefinierten Wert vom STM32 zu versenden und 
mit meinem Analog Discovery 2 zu empfangen, bevor ich dazu übergehen 
meine Messwerte zu verschicken.

Um mir die Signale und Werte anzeigen zu lassen benutze ich ich 
WaveForms, welches über USB mit dem Analog Dscovery kommuniziert. In 
WaveForms gibt es bereits verschiedene Bussysteme die analysiert werden 
können. Etwas kann man auch den angehängten Bildern entnehmen.

Im Anhang habe ich einmal ein Bild von den MOSI und SCK Signal gepackt.

Danke!

von nfet (Gast)


Lesenswert?

Und dein Signal sieht doch sauber aus. Wo liegt denn jetzt genau dein 
Problem?
Gefällt dir nicht, was du sendest?
Was in deinem Code auf jeden Fall gefährlich ist, ist das strlen. Dein 
Array ist kein String und auch nicht null terminiert. Kannst dir ja mal 
ansehen, wie groß strlen ist.

von FachLaie (Gast)


Lesenswert?

Karl D. schrieb:
> Danke!

Du schaffst es leider nicht auf Nachfragen die sich auf deine
unklaren Angaben beziehen, zu antworten bzw. dies zu klären.

z.B.

FachLaie schrieb:
> Was wäre schade? Wenn es woran liegt?

Deswegen (und wegen des Chaos hier) bin ich dann mal weg.

von FachLaie (Gast)


Lesenswert?

Nachtrag:

Und das SPI Signal schaut scheisse aus. An solchen
"Kleinigkeiten" sieht man wie unprofessionell gearbeitet wird.

nfet schrieb:
> Und dein Signal sieht doch sauber aus.

von Karl D. (Gast)


Lesenswert?

@nfet: Das Problem liegt aktuell darin, dass das ankommende Signal aber 
nicht dem gesendeten entspricht. Ich werde mir die alles nochmal 
gründlicher ansehen, habe aber im ersten Moment einen Softwarefehler 
vermutet, da ich noch neu mit der HAL bin.

FachLaie:
Du verursachst das Chaos hier. Wenn du nicht helfen kannst, dann mach 
mach keine Szene und antworte einfach nicht statt wie ein verzogenes, 
ätzendes Kleinkind zu meckern. Dir habe ich alles jetzt mehr als genug 
erklärt. Bleib einfach von diesem Topic fern.

von FachLaie (Gast)


Lesenswert?

Karl D. schrieb:
> Dir habe ich alles jetzt mehr als genug erklärt.

Ja schon klar.
Ich bin der Bittsteller und du der grosse Meister.

von Karl D. (Gast)


Lesenswert?

> Ich bin der Bittsteller und du der grosse Meister.

Auch wenn man nicht jede Information liefert, kann man trotzdem normal 
danach fragen oder es halt lassen. Ich habe dir jetzt genau genug den 
Aufbau erklärt. Wenn du es nicht verstehst, dann kannst du mir auch 
nicht helfen.


>> Beitrag "Re: SPI3 am STM32"
Baby.

von nfet (Gast)


Lesenswert?

Was denkst du denn zu senden und was kommt an? Auch mir ist absolut 
unklar, wo drin Problem ist. FachLaie vergreift sich komplett im Ton und 
ist nicht hilfreich, aber deine Problembeschreibung ist leider auch 
nicht dass gelbe vom Ei.
Rein elektrisch sieht dein Signal gut aus.

Wenn ich raten müsste: du erwartest 16 CLK cycle mit 0x0F und 0xF0 auf 
der Datenleitung, die dauerhaft wiederholt werden.
Mein Vorschlag: Lass doch mal die Wiederholung raus und auf mein strlen 
Problem hast du auch noch nicht geantwortet.

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.