spess53 schrieb:
> Das ist aber nicht im Sinne des Erfinders von I2C. Die I2C-Pins sind
> Open Collektor. Da gibt es nur nur aktiv L. Das H wir durch die
> Pull-Up-Widerstände erzeugt. Praktisch mach man das, indem man den Port
> auf L setzt und nur zwischen Ein- und Ausgang umschaltet.
Hab ich grade geändert
1 | PORTE.OUTCLR=0x03; //Beide auf LOW
|
2 | I2C_Start();
|
3 | if(I2C_SendByte(0xD0))
|
4 | {
|
5 | I2C_SendByte(0x00);
|
6 | I2C_SendByte(0x02);
|
7 | I2C_SendByte(0x02);
|
8 | I2C_SendByte(0x02);
|
9 | I2C_SendByte(0x02);
|
10 | }
|
11 | I2C_Stop();
|
12 |
|
13 | int I2C_SendByte(unsigned short int Byte)
|
14 | {
|
15 | int Vergl=0x80;
|
16 | _delay_us(20);
|
17 | for(int i=0;i<8;i++,Vergl=Vergl/2)
|
18 | {
|
19 | PORTE.DIRSET=0x02; //SCL=Ausgang->LOW --> Daten änderbar
|
20 | _delay_us(20);
|
21 | if(Byte&Vergl) // ->1 Senden
|
22 | {
|
23 | PORTE.DIRCLR=0x01; //SDA=Eingang->High
|
24 | }
|
25 | else // ->0 Senden
|
26 | {
|
27 | PORTE.DIRSET=0x01; //SDA=Ausgang->Low
|
28 | }
|
29 | _delay_us(20);
|
30 | PORTE.DIRCLR=0x02; //SCL=Eingang->High --> Daten Gültig
|
31 | _delay_us(20);
|
32 | }
|
33 | //9. Bit für Ack
|
34 | PORTE.DIRSET=0x02; //SCL=Ausgang->LOW --> Daten änderbar
|
35 | _delay_us(10);
|
36 | PORTE.DIRCLR=0x01; //SDA=Eingang->High
|
37 | _delay_us(20);
|
38 | PORTE.DIRCLR=0x02; //SCL=Eingang->High --> Slave gibt Ack
|
39 | _delay_us(20);
|
40 | //Nun sollte Ack Anliegen
|
41 | if(PORTE.IN&0x01) //Ack Negativ
|
42 | {
|
43 | _delay_us(20);
|
44 | PORTE.DIRSET=0x02; //SCL=Ausgang->LOW --> Daten änderbar
|
45 | return(0x00);
|
46 | }
|
47 | else //Ack Positiv
|
48 | {
|
49 | _delay_us(20);
|
50 | PORTE.DIRSET=0x02; //SCL=Ausgang->LOW --> Daten änderbar
|
51 | return(0x01);
|
52 | }
|
53 | }
|
54 |
|
55 | int I2C_Start() //SDA->GND, SCL=HIGH
|
56 | {
|
57 | PORTE.DIRCLR=0x02; //SCL=Eingang->High
|
58 | _delay_us(20);
|
59 | PORTE.DIRSET=0x01; //SDA=Ausgang->LOW
|
60 | _delay_us(20);
|
61 | }
|
62 |
|
63 | int I2C_Stop() //SDA->High, SCL=HIGH
|
64 | {
|
65 | PORTE.DIRSET=0x01; //SDA=Ausgang->LOW
|
66 | _delay_us(20);
|
67 | PORTE.DIRCLR=0x02; //SCL=Eingang->High
|
68 | _delay_us(20);
|
69 | PORTE.DIRCLR=0x01; //SDA=Eingang->High
|
70 | _delay_us(20);
|
71 | }
|
Sebastian Wangnick schrieb:
> Ja eben. Bei D1 ist das Lesebit gesetzt, aber danach schreibst Du
> FF.
A. K. schrieb:
> Fig 3 beschreibt die Sequenz zum Schreiben eines Registers vom DS3231.
>
> Wenn du hingegen lesen willst, dann halte dich an Fig 5 (mein erstes
> Beispiel) oder Fig 4 (mein zweites).
Stimmt, das ist mir nicht aufgefallen, dachte ich müsste in jedem fall
eine Addresse angeben ab der ich Lesen/Schreiben möchte.
Gemäß des Lesens denke ich nun, dass er mit einem Zeiger seine Register
einfach durchliest.
So muss man wohl Figure 5 realisieren um mit sicherheit zu wissen wo man
liest.