Hardware SPI mit MAX6675 ?

Hallo,

sämtliche Bsp. beruhen entweder auf Software SPI oder nutzen irgendwelche Adressen die die verwendeten IC mit Register haben. Jetzt wollte ich den MAX6675 mittels Hardware SPI auslesen. Nur was schreibe ich in die Klammer von spi.transfer ( ); ? Der hat kein Register was man angeben kann. Sobald CS low Pegel hat geht's los wenn Clock taktet.

Vorgestellt habe ich mir das so

digitalWrite(CS, LOW);             // auslesen starten
byte MSB = SPI.transfer( ???);     // höherwertiges Byte zuerst
byte LSB = SPI.transfer( ???);     // nierdertiges Byte zum Schluss
digitalWrite(CS, HIGH);            // Ende

                                // ... LSB und MSB sortieren und zusammenwerfen ...

Der Chip hat ja auch keinen SI pin und somit keine Verbindung zum MOSI pin des Arduinos, also kannst Du der transfer()-Methode übergeben, was Du willst. Meist wird 0 gewählt, da dies quasi einen neutralen Wert darstellt.

Hallo,

alles klar. Danke. Dann werde das mal weiter umsetzen.

Hallo,

ich erhalte sturre Werte: MSB LSB 10 11011000 egal ob ich den Fühler berühre oder nicht. Es ändert sich nichts. Bin mir sicher das DataMode 0 richtig ist, laut Datenblatt Diagramm. Habe den SPI Takt schon variiert. Macht keinen Unterschied. Wartezeit nach CS auf Low spielt auch keine Rolle.

Edit: doch funktioniert, Drähte hatten Kontaktprobleme

#include 

int LED = 42;           // Status LED Pin
int CS = 29;            // CS  pin 29 
                        // SO  pin 50 Mega 2560
                        // CLK pin 52 Mega 2560
                        
void setup() {
  
  Serial.begin(9600);
  
  //SPI.setBitOrder(MSBFIRST); 
  SPI.setClockDivider(SPI_CLOCK_DIV8);  // wären 2 MHz SPI Takt
  SPI.setDataMode(SPI_MODE0);           // DataMode 0
  SPI.begin();
  
  pinMode(53, OUTPUT);       // wegen SPI Funktion notwendig
  pinMode(LED, OUTPUT);
  pinMode(CS, OUTPUT);
  digitalWrite(CS, HIGH);
}


void loop()
{
  digitalWrite(LED, HIGH);
  
  digitalWrite(CS, LOW);
  delayMicroseconds(1);        // zusätzliche Wartezeit, 100ns erforderlich
  byte MSB = SPI.transfer(0);  // höherwertiges Byte einlesen, D15 ... D8
  byte LSB = SPI.transfer(0);  // nierderwertiges Byte einlesen, D7 ... D0
  digitalWrite(CS, HIGH);
  
  digitalWrite(LED, LOW);
  
  Serial.print("MSB LSB ");
  Serial.print(MSB, BIN);  
  Serial.print(" ");
  Serial.println(LSB, BIN);    
  
  delay(2000); 
}

Wieso benutzt Du nicht die MAX6675- Bibliothek? Grüße Uwe

Hallo,

weil die mit Software SPI arbeitet. Ich möchte gern die vorhandene Hardware SPI nutzen.

Mir fällt dazu noch eine Frage ein. Kann man folgende Settings, falls notwendig jederzeit im Code je nach SPI Device ändern? Oder gilt eine erstmalige Festlegung für alle SPI Devices am Bus? Oder muß man erst SPI beenden und dann wieder SPI starten im Code nach Änderungen der Settings. Das lese ich nicht heraus ob es etwas zubeachten gilt oder nicht.

SPI.setBitOrder( );
SPI.setClockDivider( );
SPI.setDataMode( );

Dann schau wenigstens wie die MAX6675 Bibliothek funktioniert / es macht. Grüße Uwe

Kann man folgende Settings, falls notwendig jederzeit im Code je nach SPI Device ändern? Oder gilt eine erstmalige Festlegung für alle SPI Devices am Bus? Oder muß man erst SPI beenden und dann wieder SPI starten im Code nach Änderungen der Settings. Das lese ich nicht heraus ob es etwas zubeachten gilt oder nicht.

SPI.setBitOrder( ); SPI.setClockDivider( ); SPI.setDataMode( );

Diese Settings kannst Du mitten im Code ändern, bei gewissen Device-Kombinationen ist das sogar nötig.

Hallo,

vielen Dank für die Information.