I2C software seltsames Verhalten

Gast #3217622
Lesenswert?

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 #3217711
Lesenswert?

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 #3217742
Lesenswert?

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

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