Comunicazione SPI Atmega328 (Arduino UNO) e Digipot AD5206

Salve a tutti,
sono un pioniere tecnologico di Bari e mi occupo di integrazioni fra meccanica, elettronica e acustica.
Sto sviluppando alcuni progetti che sfruttano i digipot in comunicazione sia SPI che I2C, ma sto incontrando un problema probabilmente banale nella comunicazione SPI con un digital potentiometer tipo AD5206.
Premettiamo che il circuito è uno standalone realizzato su PCB fotoincisa, quindi collegata via seriale RX/TX alla scheda originale di arduino per gli ovvi scopi programmativi.
I pin di alimentazione e comunicazione sono tutti collegati correttamente. Lo slave select è controllato dal pin numero 8 per questioni tecniche.
Lo sketch in uso è il più semplice che prevede la libreria SPI.h ed è quello base, proposto un po' dappertutto. Lo riporto qui di seguito:

#include <SPI.h>

void digitalPotWrite(int address, int value) {
  // take the SS pin low to select the chip:
  digitalWrite(8, LOW);
  delay(100);
  //  send in the address and value via SPI:
  SPI.transfer(address);
  SPI.transfer(value);
  delay(100);
  // take the SS pin high to de-select the chip:
  digitalWrite(8, HIGH);
}

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

void loop() {
  // go through the six channels of the digital pot:
  for (int channel = 0; channel < 6; channel++) {
    // change the resistance on this channel from min to max:
    for (int level = 0; level < 255; level++) {
      digitalPotWrite(channel, level);
      delay(10);
    }
    // wait a second at the top:
    delay(1000);
    // change the resistance on this channel from max to min:
    for (int level = 0; level < 255; level++) {
      digitalPotWrite(channel, 255 - level);
      delay(10);
    }
  }
}

Questo semplicissimo sketch non funziona, in quanto i digipot non rispondono e assumono valori fissi.
Ci tengo a precisare che a un certo punto nella giornata di ieri il circuito ha cominciato a funzionare, ma uno sbalzo di corrente mi ha fatto spegnere il computer con lo sketch che avevo revisionato più e più volte, per cui sono sicuro che il circuito che ho bromografato sia corretto almeno a livello hardware.
Probabilmente si tratta di qualche tipo di svista sulle istruzioni della libreria SPI.h, oppure qualcosa che ha a che fare con una versione buggata della stessa o dell'IDE che sto usando al momento su piattaforma Win XP (IDE versione 1.8.8 ). Dal momento che sul circuito stesso sto affrontando un collaudo di una certa complessità, il fatto che questo semplicissimo sketch abbia ricominciato a fare i capricci mi ha fatto un attimo perdere le staffe.
Aprendo questo post chiedo quindi l'aiuto degli esperti, magari offrendo un thread di discussione risolutivo ad eventuali posteri che si trovino nella mia stessa situazione.
Un saluto e grazie a tutti coloro che contribuiranno alla soluzione di questo enigma

Buongiorno e benvenuto :slight_smile: ,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink:

Leggi il manuale alla pagina 12 "Table 6. Serial Data-Word Format" i primi 3 bit devono essere MSB (data address), quindi devono trovarsi a sinistra, i restanti 8 bit sono il data value, in totale serve una variabile di tipo uint16_t (sarebbe 16-bit senza segno).

Spi ha anche un metodo inline static uint16_t transfer16(uint16_t data) ed è questo che devi usare.
Inoltre leggendo la doc della libreria scopro che consigliano di inizializzare la SPI tramite
la funzione

inline static void beginTransaction(SPISettings settings)

SPISettings è la classe che contiene la configurazione, se usi il costruttore di default
la configurazione è questa

SPISettings() {
    init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0);

clock = 4000000
bitOrder = MSBFIRST
mode = SPI_MODE0

che dovrebbe essere sufficiente.

void setup() {
  // set the slaveSelectPin as an output:
  pinMode(8, OUTPUT);
  // initialize SPI:

 SPISettings spiSets;
 SPI.beginTransaction(spiSets);

  SPI.begin();
}

Ciao.