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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren