Nachweis beteiligter TWI- Adressaten

Gast #1904148
Lesenswert?

Moin!

In meiner Atmega8535-Schaltung sind mehrere TWI-Bausteine verbaut. Ich 
habe Fleury´s TWI-libs verwendet.
Nun möchte ich einfachstmöglich abfragen und -erstmal- am Terminal 
anzeigen, ob alle Bausteine ansprechbar sind.
Dazu habe ich folgende, hochkomplexe Schleife gebaut:

  for ( pruefwert = 0; pruefwert < 255; pruefwert ++ )
  {
    rueckmeldung= i2c_start(pruefwert);
    if (rueckmeldung == 0)
    {
       place ( 10 , 10 , pruefwert, "Rueckmeldung bei", " ");
    }
  }

Meine Prozedur "place" gibt auf meinem Terminal an bestimmter Stelle die 
ansprechbare Adresse aus.

Meine Vorstellung: der Rückgabewert von Fleury´s Funktion "i2c_start" 
liefert 0, wenn bei angegebener Adresse ein Baustein ansprechbar war.

Frage: Trifft das auf alle I2C- Bausteine zu?

(Problem: HMC6343 antwortet nicht)
Gast #1904243
Lesenswert?

Hi

>Um mal zur Frage zurückzukommen: liefert Fleury´s Funktion denn nun
>immer eine 0 bei angesprochenem Adressaten?

Ich kenne die Lib nicht. Aber der Name "i2c_start" hört sich mehr nach 
Generierung einer Start-Condition an. Um einen Teilnehmer zu adressieren 
wären 2 Parameter, Adresse und R/W, notwendig.

MfG Spess
Gast #1904253
Lesenswert?

Gerne liefere ich sie nach:
Was mich wundert/ärgert: ein angeschlossener DS1631 (Temperaturfühler) 
liefert "bei 158 eine 0" als Rückgabewert (ist ansprechbar und läuft). 
Mein geliebter HMC liefert eine 1.



unsigned char i2c_start(unsigned char address)
{
    uint8_t   twst;

  // send START condition
  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);

  // wait until transmission completed
  while(!(TWCR & (1<<TWINT)));

  // check value of TWI Status Register. Mask prescaler bits.
  twst = TW_STATUS & 0xF8;
  if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;

  // send device address
  TWDR = address;
  TWCR = (1<<TWINT) | (1<<TWEN);

  // wail until transmission completed and ACK/NACK has been received
  while(!(TWCR & (1<<TWINT)));

  // check value of TWI Status Register. Mask prescaler bits.
  twst = TW_STATUS & 0xF8;
  if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;

  return 0;

}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren