Comunicazione I2C comandi

Salve,
dovrei instaurare, via I2C, con uno Slave, la seguente istruzione:
Start+Address+bit W(0)+ack+command(8bit)+ack+command(8bit)+ack+Start+command(8bit)+ack+command(8bit)+ack
Qualcuno saprebbe indicarmi alcune righe dello sketch?
Grazie

ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso e stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana... la prossima volta potrebbe venire direttamente eliminato

@ardmicese : ... inoltre, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… 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 succitato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà (eventuali risposte verrebbero cancellate), quindi ti consiglio di farla al più presto. :wink:

Allora, intanto è fondamentale che ti studi come funziona il bus I2C QUI e ti studi bene i vari metodi ed esempi della libreria Wire.

In questo modo capirai che NON sei tu che devi trasmettere tutto quello che indichi, ma che tu devi solo dare l'indirizzo del device e i bytes che vuoi inviargli (o ricevere) , al resto pensa la libreria utilizzando gli appositi registri della MCU.

Guglielmo

Grazie Guglielmo,
ho già studiato il funzionamento della comunicazione I2C e la libreria wire.h. Non riesco a trovare, però, una descrizione dettagliata sui comandi wire.beginTransmission(), wire.write(), wire.endTransmission(). Come operano sulla sequenza Sda? Il bit w/r quando viene inserito? Come inserirlo? Se lo Slave(sensore) ha un indirizzo 1, posso dialogare comunque?

Grazie
Michele

Devi dimenticare tutte quello cose, te l'ho già detto ... sono i metodi utilizzati della libreria che fanno il tutto, per cui .... studiati gli esempi di come si scrive e si legge su un device I2C.

Oppure scaricati una libreria, ad esempio quella del DS1307 (un piccolo RTC), e guarda le chiamate che fanno per scrivere e leggere nei suoi regsitri. :wink:

Guglielmo

Guglielmo,
sto lavorando sulla comunicazione I2C con questo sensore da un po' di tempo.

Ho già usato in passato l'RTC, un Adc 16 bit ed un LCD in I2C, tutto ok. Li le librerie risolvevano il tutto con comandi già stabiliti.

Ho controllato la libreria RTC, e le istruzioni per scrivere sono simili alle mie, qui deve esserci qualcosa in più che mi sfugge.

Posso allegare lo sketch che ho redatto o la sequenza da inviare al sensore?

Grazie

Michele

Metti il link al sensore che stai usando ... così si riesce a recuperare le informazioni tecniche e metti anche il codice (mi raccomando, come da regolamento, il codice, una volta inserito va TUTTO selezionato e va premuta l'icona </> nella barra degli strumenti per contrassegnarlo, appunto come codice. Inoltre, affinché sia ben leggibile, esso deve essere correttamente "indentato" ... questo lo si fa premendo ctrlT su un PC o cmd T su un Mac all'intero del IDE).

Guglielmo

Code

#include <Wire.h>
  
  unsigned int Command = 164;
  unsigned int Data = 4;
  
  void setup() {
    Serial.begin(9600);
    delay(500);
  
    Wire.begin();
    Wire.beginTransmission(0x01);    //Slave Address
    Wire.write(Command);             //Command I2C Address
    Wire.write(Data);                //New Address 0x10 (16)
    Wire.write(0x1C);                //CRC-8-ATM
    Wire.endTransmission();
  
    Serial.println("Tentativo effettuato");
  }
  
  void loop() {
  }

Risolto

Code

#include <Wire.h>

void setup() {
  Serial.begin(9600);
  delay(500);
  Wire.begin();
  Wire.beginTransmission(1);    //Slave Address
  Wire.write((uint8_t)0x00);    //Command I2C Address HW
  Wire.write((uint8_t)0xA4);    //Command I2C Address LW
  Wire.write((uint8_t)0x00);    //New Address 0x00
  Wire.write((uint8_t)0x20);    //New Address 0x10 (16)+ wbit=0   ==== 0x20
  Wire.write((uint8_t)0xE0);    //CRC-8-ATM Calcolato con i due precedenti byte 0x0020 dal sito https://crccalc.com/
  Wire.endTransmission();

  Serial.println("Tentativo effettuato");
  Serial.println("New Address= ");
  Serial.println("0x10 == 16 ");
}

void loop() {
}

Grazie

Michele

Ottimo ... :+1: :+1: :+1:

Guglielmo