Forum: Mikrocontroller und Digitale Elektronik I2C software seltsames Verhalten


von Beginner (Gast)


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 ?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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)...

von Beginner (Gast)


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
 }

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.