Digitales Poti mit SPI, daisy chain

Hallo zusammen

Ich habe Probleme drei digitale Potentiometer per SPI anzusteuern (Arduino Uno). Es handelt sich dabei um drei Stück des AD5290 von Analog Devices.

https://www.analog.com/media/en/technical-documentation/data-sheets/AD5290.pdf

Ich habe die drei Potis als Daisy Chain hintereinandergeschalten gemäss Datenblatt, inklusiv den Pull-Up Widerständen. Leider tut sich gar nichts bei den Potis. Ich möchte nur z.B. alle in die Endstellung bringen.
Es handelt sich ja um einkanalige Potis, da muss ich ja zuerst keine Adress-Byte senden, sondern kann direkt mit den Daten beginnen, oder?

Die Potis arbeiten mit max. 4MHz, dazu habe ich auch den Clock-Speed des Arduino Unos herabgesetzt. Immernoch ohne Erfolg.

Ist meine Code so richtig? Ich sende drei mal Daten für die jeweiligen Potis, mehr nicht.

Was könnte wohl sonst noch der Fehler sein?

Vielen Dank für eure Hilfe.

#include <SPI.h>

const int slaveSelectPin = 10;





void setup() {
  // set the slaveSelectPin as an output:
  pinMode(slaveSelectPin, OUTPUT);
  // initialize SPI:
  
  SPI.begin();
  
  SPI.setClockDivider(SPI_CLOCK_DIV4);



  digitalWrite(slaveSelectPin, LOW);
  //delay(100);

  
  SPI.transfer(256); // Daten für das letzte Poti in der Daisy Chain
  SPI.transfer(256);
  SPI.transfer(256); // Daten für das erste Poti in der Daisy Chain

  delay(100);

  
  digitalWrite(slaveSelectPin, HIGH);
}

void loop() {
  // put your main code here, to run repeatedly:

}

SPI_test.ino (574 Bytes)

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

Für 3 SPI-Teilnehmer brauchst Du auch 3 /CS-Pins, die Du entsprechend schalten musst.

Gruß Tommy

@Tommy56

Danke für den Tipp.

Nein, in de Daisy Chain Konfiguration ist nur eine CS Leitung notwendig, siehe Datenblatt.

Ok, hast recht.

Gruß Tommy

Hallo,

ich welche "Stellung" fahren denn die Potis mit dem Sketch? Etwas auf 1?
Hier drin liegt der Fehler SPI.transfer(256)

Beide delays kannste ersatzlos streichen.

Sie fahren eben leider in gar keine Position. Sie befinden sich alle immer in der Mitte-Stellung.
Ich habe bei SPI.transfer() einige Werte ausprobiert.
z.B. 0, 1, 256 oder auch in hex. 0x00, 0xFF und auch Werte dazwischen. Leider passiert gar nichts. :confused:

Was ist der Maximalwert für 1 Byte?

Gruß Tommy

Ja das ist mir nun klar, dass dies 255 ist. Ich habe es aber ja auch wie erwähnt mit anderen Werten versucht und auch 0xFF. Aber leider geschieht nichts. Aber der Code scheint demnach in Ordnung zu sein?

Hallo,

ist in der Tat etwas seltsam. Aus der Ferne kann ich dir das zum testen geben.
Verkabelung stimmt? Massen sind alle verbunden?

#include <SPI.h>

const byte slaveSelectPin = 10;

void setup() {
  digitalWrite(slaveSelectPin, HIGH);
  pinMode(slaveSelectPin, OUTPUT);

  SPI.setDataMode(SPI_MODE0);    
  SPI.setBitOrder(MSBFIRST); 
  SPI.setClockDivider(SPI_CLOCK_DIV4);
  SPI.begin();

  digitalWrite(slaveSelectPin, LOW);
  delay(1);
  SPI.transfer(64);  // Daten für das letzte Poti in der Daisy Chain
  SPI.transfer(192); // Daten für das erste Poti in der Daisy Chain
  delay(1);
  digitalWrite(slaveSelectPin, HIGH);
  SPI.endTransaction();   // eigentlich hier nicht notwendig
}

void loop() {
 
}

Edit 1:
MSBFIRST ergänzt. Jetzt ist das "volle Programm" drin, wenn es jetzt nicht geht, bin erstmal ratlos ...

Edit 2:
Ach Mist, ganz wichtig, vielleicht lag es daran, CS muss ganz zu Beginn auf HIGH, der IC benötigt die high-low Flanke damit er sich angesprochen fühlt. Wenns geht kannste den Code sachte zurückbauen.

Danke dir!

Macht SPI.begin() nicht genau das? Also den CS zuerst gleich auf HIGH?

Ich werde es morgen damit mal versuchen. Ja Massen sind verbunden, Verkabelung sollte auch stimmen.

Danke für die Hilfe!

Hallo,

morgen ... naja egal, wirst jetzt Advent feiern wollen :slight_smile:

spi.begin konfiguriert nur die SPI Hardwareeinheit. Takt, Bitreihenfolge, Modus. Die weiß nichts von CS Pins. Du kannst ja sonst irgendwelche hunderte SPI ICs verwenden und damit hunderte CS Pins benötigen. Auch den einen CS Pin (/SS) in der Hardwareeinheit muss man separat konfigurieren.

Super danke dir.

Haha, nein nix von Advent feiern. Ich würde das sehr gerne gleich jetzt austesten, habe aber das nötige Equipment nicht zu Hause, sondern in der Schule!

Ich denke, es könnte das mit dem CS sein, dass der am Anfang nicht auf High ist!

Danke nochmals und schönen Abend.