DIGITAL Poti über SPI

Moin ich möchte ein digital Potentiometer TYP AD8400 über SPI regeln.

Mein Code lautet

void digitalPotWrite(int address, int value, int resistor) {
  switch (resistor){
  case 1: {
 // take the SS pin low to select the chip:
    digitalWrite(slaveSelectPinStrom, LOW);
  //  send in the address and value via SPI:
    SPI.transfer(address);
    SPI.transfer(value);
  // take the SS pin high to de-select the chip:
    digitalWrite(slaveSelectPinStrom, HIGH);
    break;
  }
  case 2:
  {
    // take the SS pin low to select the chip:
    digitalWrite(slaveSelectPinSpg, LOW);
    //  send in the address and value via SPI:
    SPI.transfer(address);
    SPI.transfer(value);      // Poti Wert übertragen
    // take the SS pin high to de-select the chip:
    digitalWrite(slaveSelectPinSpg, HIGH);  
    break;
  }
  default: break;
  }
}

zum ausführen schreibe ich: digitalPotWrite(0, level, 2);

leider passiert einfach mal gar nichts. Was mache ich falsch? Wie finde ich die Adresse heraus vom Poti? Wenn ich das Datenblatt richtig verstehe 00 !?!

Link zum Datenblatt:

Ad8400

MfG Florian

Florian_beginner:
Link zum Datenblatt:

Ad8400

Beim überfliegen des Datenblattes bin ich auf folgende Stelle gestoßen:
Seite 11
SERIAL DATA-WORD FORMAT
Table 6

Der Baustein erwartet ein 10 Bit Format, dass kann das, in deinem AVR eingebaute SPI, nicht leisten.

Kannst du einem Laien das genauer erklären?

Ich hatte dieses Projekt noch gefunden und gehofft ich muss einfach nur meine Adressierung o.ä ändern?

Link

Florian_beginner:
Kannst du einem Laien das genauer erklären?

Ich hatte dieses Projekt noch gefunden und gehofft ich muss einfach nur meine Adressierung o.ä ändern?

Link

Ein Irrtum:

  1. SPI kennt keine Addressierung
  2. Ein MCP41010 ist kein AD8400! Das sieht man an der Aufschrift, und auch mehrfach im Datenblatt.

Der AD8400 hat ein 10 Bit Schieberegister und der MCP41010 16Bit.
Tada!
(und das ist nur 1 Unterschied)

Deine Möglichkeiten:

  1. Du könntest deinem AD8400 16Bit schicken, die überflüssigen 6 schiebt er wieder raus.
  2. SoftwareSPI

combie:
Der Baustein erwartet ein 10 Bit Format, dass kann das, in deinem AVR eingebaute SPI, nicht leisten.

Das geht schon. Es ist nur sehr verwirrend. Die Datenbits werden in ein Schieberegister geschoben. Man schickt zwei Bytes hintereinander. Und die 6 Bits die wegfallen werden zu erst geschickt so dass sie am Ende nicht im SR stehen. Man muss dann nur die Bit-Ordnung richtig machen damit es in der richtigen Reihenfolge steht.

Also das als:
D7 D6 D5 D4 D3 D2 D1 D0 | D7 D6 x x x x x x

EDIT:
Der Chip erwartet das MSB first. Dadurch geht es wenn man einfach beide Bytes direkt hintereinander schickt. Ohne sie irgendwie aufzubereiten :slight_smile:

Im Prinzip schicke ich ja 16bit. Meine "Adresse" besteht ja nur aus 8bit nullen. Und danach schiebe ich meinen Value ins Register.

Funktioniert in einem vereinfachten Aufbau auch. Ich muss nur noch heraus finden warum in meinem Gesamtaufbau nicht...

Ah ich sehe wieso es geht. Steht auch im Datenblatt:

The format of this data-word is two address bits, MSB first, followed by eight data bits, also MSB first.

Also nicht LSB first wie man naiv denkt

Dadurch hat man das:

D7 D6 D5 D4  D3 D2 D1 D0 | x x x x  x x A1 A0

Und es passt direkt man einfach beide Bytes MSB first sendet (und das Adress-Byte zuerst). Dadurch kommen die überflüssigen Bits zuerst an