STM32 SPI mit MAX6675 buffer overrun

Gast #5208120
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.
Gast #5208742
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

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.