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.