Forum: Mikrocontroller und Digitale Elektronik I²C bricht zusammen


von Dimithri (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich kämpfe gerade mit I²C bus. Ich steuer über ein Master, 2 Slaves. Der 
Master kommuniziert und der Slave empfängt(nur ein Slave empfängt und 
der zweiter reagiert nicht mal auf seine Adresse). Nun das Hauptproblem 
ist, soald ich den zweiten Slave dazu schalte, dass mein I²C Bus 
zusammenbricht. Ich habe die Platinen nach kurzschlüsse überprüft und 
die SCL und SDA Leitungen überprüft und nichts gefunden.

Kann mir jem. helfen?

Danke.

von Bülent C. (mirki)


Lesenswert?

Zwei Sachen Spontan...hast Du Dein Slave wirklcih richtig beschaltet und 
hat es überhaupt ein I2C...(D- und D+ sieht mir nach was anderem aus)?
Zum anderen, Wie groß sind Deine Pull-Up's und an was für einer 
Versorgungsspannung hängen die?

von Dimithri (Gast)


Lesenswert?

ich verwende ein Atmega 168 als slave. Die Pullups sind 15K(hatte kein 
10K)

Danke

von operator (Gast)


Lesenswert?

Widerstände kleiner machen, das hilft die Kapazität der Leitung wieder 
schneller aufzuladen (glaube zwar nicht dasses das ist, aber man hat ja 
keine Angaben über deine Leitungslänge)

Mit welcher Geschwindigkeit kommunizierst du?

von Bülent C. (mirki)


Lesenswert?

15k ist zuviel..... gehe eher runter als hoch.... 2k2 - 4k7 sind optimal

von Dimithri (Gast)


Lesenswert?

Hallo Die Leitung ist nicht länger als 30cm. Ich kommuniziere mit 2kHz. 
Sobald ich den zweiten an die Leitung anschließe bircht der Bus 
zusammen.

Ist mein Slave prog so richtig? oder habe ich da was vergessen?

int main()
{
  init_input();

      TWAR = 0x80; //Slave address --> 0x40
      TWCR = ((1<<TWEA)|(1<<TWEN)); // Activate slave acknowledge

      while(1)
      {
                          data == TWDR;
                        }


          switch(data)
          {
                                          case(0x80):
                                           {
            TWCR = ((1<<TWEA)|(1<<TWEN)); // Activate slave acknowledge
            dimming_function();
                                           }
            break;

                                              case(0x20):
                                           {

            TWCR = ((1<<TWEA)|(1<<TWEN)); // Activate slave acknowledge
            pwm_function();
                                            }
                                           break;
          }



}

Danke

von operator (Gast)


Lesenswert?

Dimithri schrieb:
> Ich kommuniziere mit 2kHz

Schau dir die Spezifikationen an, ich denke 100kHz ist Standard. 
Versuchs mal damit.

von spess53 (Gast)


Lesenswert?

Hi

>Ist mein Slave prog so richtig? oder habe ich da was vergessen?

Bitte lesen:

http://www.atmel.com/Images/doc2565.pdf
http://www.atmel.com/Images/AVR311.zip

MfG Spess

von NA (Gast)


Lesenswert?

Bülent C. schrieb:
> (D- und D+ sieht mir nach was anderem aus)

D- / D+ ist USB

von Dimithri (Gast)


Lesenswert?

weil laut DB muss ich nur den TWAR mit der Adresse und TWCR für ACK 
aktivieren.

so wie es aussieht muss ich noch einiges beachten.

danke

von Bülent C. (mirki)


Lesenswert?

NA schrieb:
> D- / D+ ist USB

Eben!
und die 15k Pullups sind eindeutig zuviel!

von Manfred G. (magroma)


Lesenswert?

Kannst du die Slave's ansprechen, wenn immer nur einer am Bus hängt? Ich 
vermute einen Programmfehler der Slaves, die nach der ersten 
Kommunikation den Bus nicht wieder freigeben.

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.