I2C software seltsames Verhalten

Gast #3217622
Hallo,

ich benutze die Library von Peter Fleury und habe da ein komisches 
Verhalten wenn ich nach der Startbedingung die Adresse für den Slave 
sende z.B. 0x16 geht alles ordentlich raus (bekomme jedoch kein ACK vom 
Slave) was auch ok ist, weil die Adresse von dem IC nicht 0x16 ist 
sondern 0x12. Und jetzt kommt der interessante part sobald ich die 
Adresse 0x12 raussende (welche vom Slave ist) habe ich dauerhaft ein 
high Signal sowohl bei der SCL auch auch bei SDA Leitung.


Wie kann das sein ? Ich dachte immer das der Slave nur die Datenleitung 
auf low ziehen kann ?
Moderator (Firma: Titel) Persönliche Seite
Beginner schrieb:
> habe ich dauerhaft ein high Signal sowohl bei der SCL auch auch bei
> SDA Leitung.
Ja, da gibt der Master offenbar keinen Takt mehr aus...

> Ich dachte immer das der Slave nur die Datenleitung auf low ziehen kann
Denken kann fehlen. Du solltest dir mal das Kapitel "Clock Stretching" 
beim I2C Bus ansehen. Wenn der Slave nicht so schnell getaktet werden 
möchte, dann hält er die Leitung "unten" fest. Aber du hast ja ein ganz 
anderes Problem...

> Ich dachte immer das der Slave nur die Datenleitung auf low ziehen kann
> ?
Tja, das freistehende Fragezeichen kommt vom Plenken (= unnötige 
Leerzeichen vor Interpunktionszeichen einfügen)...
Gast
hier ist der Quellcode vllt lässt sie so mehr daraus ersehen
1
 #include "i2cmaster.h"
2

3

4

5
 #define AdresseSlave  0x16    // device address of EEPROM 24C02, see datasheet
6

7
 #include <avr/io.h>
8
 #include <util/delay.h>
9

10

11

12

13
 int main(void)
14
 {
15
   unsigned char ret;
16

17
   smb_init();                             // initialize I2C library
18

19
   // write 0x75 to EEPROM address 5 (Byte Write)
20
   smb_start_wait(AdresseSlave+SMB_WRITE);     // set device address and write mode
21
   smb_write(0x05);                        // write address = 5
22
   smb_write(0x75);                        // write value 0x75 to EEPROM
23
   smb_stop();                             // set stop conditon = release bus
24

25

26
   // read previously written value back from EEPROM address 5
27
   smb_start_wait(AdresseSlave+SMB_WRITE);     // set device address and write mode
28

29
   smb_write(0x05);                        // write address = 5
30
   smb_rep_start(AdresseSlave+SMB_READ);       // set device address and read mode
31

32
   ret = smb_readNak();                    // read one byte from EEPROM
33
   smb_stop();
34
          
35
   
36
   for(;;);
37
     
38

39
       
40
     
41
return 0;   
42
 }

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.