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 ?
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)...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.