Hallo,
Ich möchte einen I2C DS3231 RTC Auslesen.
Dazu habe ich eine Funktion SendByte geschrieben, welche beim 1. Aufruf
auch korrekt das übergebene Byte Sendet, auch Ack wird erkannt.
Da ich den DS3231 aber zuerst "Auswählen" muss, (0xD1) wird dadurch der
1. Aufruf der Funktion schon verbraucht.
Nun muss ich die Funktion noch ein 2. Mal aufrufen, um mitzuteilen
welche Addresse ich lesen möchte.
Hier geht auf einmal vieles Schief, was tatsächlich gesendet wird hat
nichts mit dem zu tun was der Funktion übergeben wird.
Wenn z.b. 0xff gesendet werden soll, so sendet sie 0x88.
Auch das Timing wird nicht mehr eingehalten, so ändern ich SDA und SCL
zum Ende eines Bits gleichzeitig.
Ich sehe nicht wie dass in der Funktion möglich sein sollte.
Beim 1. Aufruf ändert sich SDA "Schön" innerhalb des SCL-High.
Wie kann das sein?
spess53 schrieb:> Hi>>>for(int i=0;i<=7;i++,Vergl=Vergl/2)>> Das werden nur 7 Datenbits.
es werden schon 8.
Dieser Unsinn mit dem kleiner-gleich stirbt wohl nie aus.
Die I2C Sequenz ist nicht zulässig. Entweder schreiben (0xD0), oder
lesen (0xD1), nicht aber frei nach Laune beides.
Wenn der I2C Slave mit der 8-Bit Adresse 0xD0 eine Registernummer oder
ein Kommandobyte verlangt, dann liest man ein Register üblicherweise so:
start condition
Adresse 0xD0 schreiben
Registernummer schreiben
repeated start condition
Adresse 0xD1 schreiben
Registerinhalt lesen
stop condition
Bei manchen Slaves geht es auch so:
start condition
Adresse 0xD0 schreiben
Registernummer schreiben
stop condition
start condition
Adresse 0xD1 schreiben
Registerinhalt lesen
stop condition
A. K. schrieb:> Die I2C Sequenz ist nicht zulässig. Entweder schreiben (0xD0), oder> lesen (0xD1), nicht aber frei nach Laune beides.
Ich versuche eigentlich nicht beides, oder wie ist das gemeint?
A. K. schrieb:> Wenn der I2C Slave eine Registernummer verlangt, dann geht das> üblicherweise so:> start condition> Adresse 0xD0 schreiben> Registernummer schreiben
Start Condition, ist drin.
Addresse D0 --> Bauteil Auswählen, zusammen mit info ob Lesen oder
Schreiben.
Registernummer schreiben --> Hier Hackts
Anbei ein Auszug aus dem Datenblatt zu DS3231.
A. K. schrieb:> I2C Slave mit der 8-Bit Adresse
Er hat eine 7 Bit Addresse, was soweit ich weiss auch normal ist.
Das 8. Bit entscheidet über lesen/Schreiben.
Hi
>Dieser Unsinn mit dem kleiner-gleich stirbt wohl nie aus.
Stimmt, das <= hatte ich übersehen.
@Matze (Gast)
> PORTE.DIRSET=0x03; //I2C Auf Ausgang> ...> PORTE.OUTSET=0x01; //SDA=High> }> else // ->0 Senden> {> PORTE.OUTCLR=0x01; //SDA=Low
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.
MfG Spess
Matze schrieb:> Er hat eine 7 Bit Addresse, was soweit ich weiss auch normal ist.> Das 8. Bit entscheidet über lesen/Schreiben.
Ja eben. Bei D1 ist das Lesebit gesetzt, aber danach schreibst Du
FF.
LG, Sebastian
Matze schrieb:>> I2C Slave mit der 8-Bit Adresse>> Er hat eine 7 Bit Addresse, was soweit ich weiss auch normal ist.> Das 8. Bit entscheidet über lesen/Schreiben.
Ich unterscheide so zwischen der 7-Bit Adresse 0x68 und der 8-Bit
Adresse 0xD0. Manche I2C APIs verlangt es nach der 7-Bit Variante (die
shiften dann intern), bei anderen schreibt man es so wie hier.
Matze schrieb:> Anbei ein Auszug aus dem Datenblatt zu DS3231.
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).
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
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.