LTC2309 über I2C ansprechen und regelmäßig auslesen

Hallo liebe Forumsgemeinde,

kann mir jemand helfen einen Programcode aufzustellen das ich den LTC2309 mit seinen 8 Eingängen wiederkehrend auslesen kann und die werde alle Sekunde auf dem seriellen Monitor ausgegeben werden?

Vielen Dank!

www.linear.com/docs/43971
www.linear.com/docs/43924
www.linear.com/docs/43923

Uwe

Hallo Uwe,

danke für die Links.

Versuche mich einzulesen! Der Code ist natürlich ziemlich umfangreich, oder? Was wäre aus diesem Code zwingend nötig um den ADC auszulesen?

Es handelt sich um "single ended" Eingänge und die I2C Adresse ist 0001010

Gruß

Pippsen:
Hallo Uwe,

danke für die Links.

Versuche mich einzulesen! Der Code ist natürlich ziemlich umfangreich, oder? Was wäre aus diesem Code zwingend nötig um den ADC auszulesen?

Es handelt sich um "single ended" Eingänge und die I2C Adresse ist 0001010

Gruß

Ich kann nicht hellsehen und möchte mir weder die Arbeit machen den gesamten Code zu analysieren noch mir noch einen LTC2309 kaufen um resultierenden den Code dann zu kontrollieren.
Du mußt das Datenblatt studieren um zu verstehen wie der LTC2309 angesteuert werden muß.

Grüße Uwe

Hallo Uwe,

habe ich doch auch nicht verlangt.

Mir ging es nur darum das ich als Newbie nicht die Textzeile finde wo es auf den I2C Bus geht und wo es zurück kommt. Wenn ich mir die ganzen Tutorials durchlese wird immer mit der Wire.h und den dazugehörigen Befehlen gearbeitet und hier leider nicht.

Im Endeffekt weiß ich was ich möchte und wie der LTC2309 angesteuert werden soll, bekomme das aber nicht in einen Arduino Code zusammen.

Auszug aus dem Datenblatt und meiner Übersetzung in die Bits und Bytes:

I2C DATA FORMAT (MSB First):

Byte #1
START |SA6| SA5| SA4| SA3| SA2| SA1| SA0| W| SACK
? |0 |0 |0 |1 |0 |1 |0 |? |?

Byte #2
SD |OS |S1 |S0 |UNI |SLP |X |X |SACK
1 |0 |0 |0 |1 |0 |0 |0 |?

Byte #3
Repeat Start |SA6 |SA5 |SA4 |SA3 |SA2 |SA1 |SA0 |R |SACK
? |0 |0 |0 |1 |0 |1 |0 |? |?

Byte#4
D11 |D10 |D9 |D8 |D7 |D6 |D5 |D4 |MACK
D11 |D10 |D9 |D8 |D7 |D6 |D5 |D4 |?

Byte#5
D3 |D2 |D1 |D0 |X |X |X |X |MNACK |STOP
D3 |D2 |D1 |D0 |X |X |X |X |? |?

SACK : Slave Acknowledge
MACK : Master Acknowledge
MNACK : Master Not Acknowledge
SD : Single, Differential# Bit
OS : ODD, Sign# Bit
Sx : Address Select Bit
COM : CH7/COM Configuration Bit
UNI : Unipolar, Bipolar# Bit
SLP : Sleep Mode Bit
Dx : Data Bits
X : Don't care

Die Bits mit Fragezeichen sind für mich fraglich. Die ersten beiden Bytes sind sicher um die Kommunikation zu beginnen und die Bytes 3, 4, 5 um die Daten zu empfangen.

Wie gesagt, eine kurze Hilfe in Richtung Code würde mir genügen.

Danke und Gruß

Wire.h ist genau was du brauchst. Das übernimmt das ganze Gedöns mit den Start, Stop Conditions und Acknowledges für dich. Du musst nur wissen wie Adressiert wird und wieviele Bytes hin und her geschickt werden.

Gut gemachte RTC Libs sind da ein ganz guter Anhaltspunkt! :slight_smile:

z.B. Senden:

bool writeByte(byte adr, byte data)
{
  Wire.beginTransmission(DEVICE_ADR);

  Wire.write((uint8_t) adr)
  Wire.write(data);

  if (Wire.endTransmission() != 0) 
    return false;
  
  return true;
}

Lesen:

bool readByte(byte adr, byte& data)
{
  Wire.beginTransmission(DEVICE_ADR);

  Wire.write((uint8_t) adr); 
  if (Wire.endTransmission() != 0)
    return false;

  Wire.requestFrom(DEVICE_ADR, 1);
  if (Wire.available() < 1) 
	  return false;

  data = Wire.read();

  return true;
}

Man übergibt dabei eine Variable data als Parameter. Da steht dann das Ergebnis drin.

Das ist jetzt jeweils für nur 1 Byte. Aber sequentielle Zugriffe sind da genauso möglich. Und haargenauso wie im Datenblatt beschrieben.

Man schreibt erst mal das Adress-Byte. Beim Schreiben kann man dann beliebig viele weitere write()s machen und das IC inkrementiert automatisch seinen Adress-Zeiger. Mit endTransmission() werden die Daten aus dem Puffer auf dem Bus geschrieben.
Beim Lesen ist es ähnlich. Man übergibt bei requestFrom() wie viele Bytes man möchte und machst dann entsprechend oft read().

Die Daten kann man auch in einem Array übergeben/auslesen:

bool read(byte adr, byte* data, int size)
{
     ...

     Wire.requestFrom(DEVICE_ADR, size);

     ...
     for(int i = 0; i < size; i++)
          data[i] = Wire.read();
}

Für data übergibt man dabei ein Array. z.B.:

byte data[4];
read(0x05, data, 4);

Das geht soweit ich bisher gesehen habe mit allen I2C Devices nach diesem Muster.