Forum: Mikrocontroller und Digitale Elektronik problem i2c SDA High oder Low bei Terminierung


von Andi (Gast)


Lesenswert?

Hallo,

Habe eine Frage zur Terminierung des I2C.

AUF SDA und SCL habe ich ein 10K wiederstand gegen 5V+ geschalten.
Auf der SCL Seite messe ich einen High Pegel im Ruhezustand auf der SDA 
Seite einen Low Pegel. Ist das so IO muß nicht auch der SDA High sein 
vor der Init des TWI???
Desweiteren habe ich eine Endlosschleife in folgenden Bereich

bei dieser Stelle
while (!(TWCR & (1<<TWINT)));
 liegt das damit zusammen.
wenn ich mit den oszi messe ist an dieser stelle ein sehr schneller 
pegelwechsel zu sehen im dauerfeuer high + Low Linie.
Auf der SDA Seite tut sich nix.

AM code kanns eigendlich nicht liegen habe diesen schonmal mit einer 
Schalktung benutzt.


Danke





ublic Function: TWIM_Start

 Purpose: Start the TWI Master Interface

 Input Parameter:
   - uint8_t  Device address
   - uint8_t  Type of required Operation:
        TWIM_READ: Read data from the slave
        TWIM_WRITE: Write data to the slave

 Return Value: uint8_t
    - TRUE:    OK, TWI Master accessible
   - FALSE:  Error in starting TWI Master

*******************************************************/
uint8_t TWIM_Start (uint8_t Address, uint8_t TWIM_Type)
  {
  uint8_t    twst;
/*
** Send START condition
*/
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
/*
** Wait until transmission completed
*/
------##########################Hier beginnt die Endlosschleife

  while (!(TWCR & (1<<TWINT)));
/*
** Check value of TWI Status Register. Mask prescaler bits.
*/
  twst = TWSR & 0xF8;
  if ((twst != TWI_START) && (twst != TWI_REP_START)) return FALSE;
/*
** Send device address
*/
  TWDR = (Address<<1) + TWIM_Type;
  TWCR = (1<<TWINT)|(1<<TWEN);
/*
** Wait until transmission completed and ACK/NACK has been received
*/
---------########################### Hier auch wenn ich die erste 
auskommentiere


  while (!(TWCR & (1<<TWINT)));
/*
** Check value of TWI Status Register. Mask prescaler bits.
*/
  twst = TWSR & 0xF8;
  if ((twst != TWI_MTX_ADR_ACK) && (twst != TWI_MRX_ADR_ACK)) return 
FALSE;

  return TRUE;
  }

von Klaus R. (klara)


Lesenswert?

Hallo,
ich meine, nach der Initialisierung müssen beide Pegel High sein.
Schau mal in ein Datenblatt eines I2C-Bausteins. Da findest Du immer 
eine Grafik der Pegel-Zustände.
Gruss Klaus.

von andi (Gast)


Lesenswert?

Hallo,

Es war so alle pegel müssen am anfang auf high sein.
Der Fehler eine Kurzschluß gegen masse Draht Haar.
Nun gehts einwandfrei.

Danke

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.