Forum: Mikrocontroller und Digitale Elektronik STM32 SPI mit MAX6675 buffer overrun


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.
von Der Noob (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute, folgendes Problem:
Ich versuche einen MAX6675 an einem STMF412 zum laufen zu bekommen.

So ganz will das nicht funktionieren: Die ausgelesenen Daten sind zwar 
manchmal richtig, allerdings erhalte ich nach jedem read-cycle einen 
overrun im Statusregister des SPI.
Die Daten sind nach einigen Sekunden immer gleich auch wenn sich die 
Temperatur merklich geändert hat. Ab und zu kommen auch total 
unplausible Werte heraus. Wenn ich einen Reset durchführe sind die neuen 
Daten kurz wieder richtig aber frieren dann auch schon wieder ein.

Der Code ist für einige vllt. "schwer" zu lesen, oder umständlich, aber 
ich bin blutiger Anfänger und komme im Moment gut damit klar.
Hier ist der Ausschnitt
1
  RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN); //GPIOA clock enable
2
  RCC->APB2ENR |= (RCC_APB2ENR_SPI1EN); //SPI1 clock enable
3
  GPIOA->PUPDR |= (1<<30); //ss pullup
4
  GPIOA->MODER |= (2<<10 | 2<<12 | 2<<14 | 2<<30); //enable af mode
5
  GPIOA->AFR[0] |= (0b0101<<20 | 0b0101<<24 | 0b0101<<28); //SCK,MOSI,MISO AF
6
  GPIOA->AFR[1] |= (0b0101<<28); //NSS AF
7
  SPI1->CR1 |= (0b11<<10 | 0b111<<3 | 1<<2 | 1<<0); //rx only, 16 bit word length; clock prescale 256; master mode, CPHA 1
8
  SPI1->CR2 |= (1<<2); //enable hardware ss
9
10
11
12
  unsigned int a;
13
  float temp;
14
  //Infinite loop
15
  while (1)
16
  {
17
18
    SPI1->CR1 |= (1<<6); //enable SPI
19
    while((SPI1->SR & SPI_SR_RXNE_Msk) == 0); //loop while buffer empty
20
    SPI1->CR1 &= ~(1<<6); //disable SPI
21
    a = SPI1->DR; //read spi data to int var
22
    a = a>>3; //right shift read data by 3 (not needed for temp measurement)
23
    temp = a* 0.25f;
24
    printf("%f\r\n", temp);
25
    HAL_Delay(200);
26
27
28
  }

Ich habe im Code auch den entsprechenden Pin für MOSI aktiviert. Ist 
unnötig, ich weiß, aber ändert nichts am Ergebnis.

Mache ich elementare Fehler oder übersehe ich einfach etwas?
Habe leider nur ein analoges Oszi und keinen Logic Analyzer und kann 
daher gerade nicht auf dem Bus lauschen.

Übrigens: Ich versuche so wenig wie möglich die HAL Bibliotheken zu 
nutzen und alles mit direktem Registerzugriff zu machen. Komme ich 
einfach viel besser mit klar.

von scsi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>overrun im Statusregister des SPI

Ähm, der MAX ist doch ein SPI-Slave, oder?

Du musst irgendwie eine SPI transfer auslösen.
Reicht da ein a = SPI1->DR?

von A. B. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Der Noob schrieb:
>   unsigned int a;

>     a = SPI1->DR; //read spi data to int var

Das DR ist nur 16 Bit breit. Also eher

uint16_t a;

Im RM sehe ich keinen Kommentar, was bei wortweisem Zugriff passiert, 
aber ...

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Der Noob schrieb:
> //rx only
> Mache ich elementare Fehler oder übersehe ich einfach etwas?
Wie stellst du dir einen SPI Transfer vor? Das ist pures Geben und 
Nehmen:
du als Master(!!) schickst 1 Bit an den Slave und bekommst 1 Bit 
zurück...

: Bearbeitet durch Moderator
von Darth Moan (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Moin,

im Kommentar steht, du konfigurierst RX-Only Master mode.
Die Hauptschleife will dann (soweit korrekt) Die SPI enablen, Daten
empfangen, SPI disablen sobald ein Datenwort da ist.
Wenn du den MOSI Pin frei hast, wuerde ich dringend empfehlen, nicht
RX-Only zu machen. Beim Voll-Duplex mit HW-SS kann man einen Transfer
inclusive SS handling ganz bequem dadurch einleiten, dass ein
Datenwort (hier 16bit) ins DR register geschrieben wird.
Dann muss man nicht dauernd die SPI enablen/disablen. Ausserdem kann
man zB einen simplen Wortzaehler hernehmen und is DR schreiben, und
diesen dann mit dem Oszi draussen sehen (wenn man MOSI konfiguriert
hat).
Ist denn der RX-Only Mode mit dem MAX6675 ueberhaupt machbar?
Ich kenne den jetzt nicht.
Stimmen Phase und Polaritaet? (Oszi)

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]
  • [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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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