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


von Der Noob (Gast)


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)


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)


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. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)


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)

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.