mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI3 am STM32


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Karl D. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,

ich versuche gerade den SPI3 (GPIOC 10-13) an meinem STM32F407VG zum 
laufen zu bekommen und benutzte folgenden Code:
SPI_HandleTypeDef hspi3;
uint8_t aTxMasterBuffer[] = {0xF0, 0x0F};

void SPI3_Init(void)
{
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE(); // ?
  __GPIOC_CLK_ENABLE();
  __SPI3_CLK_ENABLE();

  /* SPI3 parameter configuration*/
  hspi3.Instance = SPI3;
  hspi3.Init.Mode = SPI_MODE_MASTER;
  hspi3.Init.Direction = SPI_DIRECTION_2LINES;
  hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi3.Init.NSS = SPI_NSS_SOFT;
  hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi3.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi3) != HAL_OK)
  {
    //Error_Handler();
  }

  GPIO_InitTypeDef GPIO_InitStruct;

  GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;

  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  for(;;) {
    HAL_SPI_Transmit(&hspi3, (uint8_t *)aTxMasterBuffer, strlen(aTxMasterBuffer), HAL_MAX_DELAY);
  }
}

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?

Autor: FachLaie (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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.

Autor: Karl D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: FachLaie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl D. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.


uint16_t aTxMasterBuffer[] = {0xFFFF};
  for(;;) {
    HAL_SPI_Transmit(&hspi3, (uint16_t *)aTxMasterBuffer, strlen(aTxMasterBuffer), HAL_MAX_DELAY);
  }
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.

Autor: FachLaie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl D. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: nfet (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: FachLaie (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: FachLaie (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Karl D. (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: FachLaie (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Karl D. (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: nfet (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.