Rv-3029 auslesen funktioniert nicht

Gast #2725035
hallo brauche mal dringend Hilfe.

Bin grad dabei die Uhr Rv3029 anzusteuern, habs geschafft, dass ich die 
Uhr mit bestimmten Zeitwerten schreiben kannm jedoch beim lesen, kommt 
zwar eine Zeit zurück aber nicht die die ich reingeschrieben habe, hab 
den 1Hz clock nicht eingeschaltet, da ich erst nur schreiben und lesen 
testen will.

Mein code sieht wiefolgt aus:

main.c:
1
struct tm time;
2

3
time.tm_sec = 2;
4
time.tm_min = 2;
5
time.tm_hour = 2;
6

7
rv3029_write(MASTER_BASE, &time, 3);
8

9
rv3029_read(MASTER_BASE, &time, 3);


rv3029.h:
1
unsigned int rv3029_write(unsigned long Base, struct tm *tm, unsigned int Len);
2
                      
3
unsigned int rv3029_read(unsigned long Base, struct tm *tm, unsigned int Len);

Base ist die ase Addresse des I2c Buses, tm ist eine Struktur mit 
Zeitdaten und Len ist die Länge der Daten.

rv3029.c:
1
unsigned int rv3029_write(unsigned long Base, struct tm *tm, unsigned int Len) {
2

3
unsigned int Data[3];
4

5
Data[0] = Convert_Int_Bcd(tm->tm_sec);
6
Data[1] = Convert_Int_Bcd(tm->tm_min);
7
Data[2] = Convert_Int_Bcd(tm->tm_hour);
8

9
I2C_StartTX(Base, RV3029_SLAVE_write, RV3029_SEC);
10
while (i < Len) {
11
  I2C_Send(Base, Data[i]);
12
  i++;
13

14
}
15

16
I2C_Stop(Base);
17
}
18

19
unsigned int rv3029_read(unsigned long Base, struct tm *tm, unsigned int Len) {
20

21
unsigned char Data[3];
22

23
I2C_StartTX(Base, RV3029_SLAVE_write, RV3029_SEC);
24
I2C_Stop(Base);
25
I2C_StartRX(Base, RV3029_SLAVE_read, Data);
26
for (i = 0 ; i < Len; i++) {
27
    Data[i] = I2C_Read(Base);
28
UARTprintf("Uhrzeit: %02d:%02d:%02d\n", BCDtoI(Data[2]), BCDtoI(Data[1]), BCDtoI(Data[0]));
29
  I2C_Stop(Base);
30
}

Bevor die daten geladen, werden, werden sie in bcd format umgewandelt 
und beim auslesen werden sie wieder vom BCD format zurück umgewandelt.
Kann mir da einer weiterhelfen, komme einfach nicht mehr weiter.
Danke.
Hallo,

du musst die Register beim Auslesen maskieren.

siehe meinen Code:

rtc_buf.sekunde  = rtc_bcd_to_hex(r_buffer[0])& 0x7f; //sek
rtc_buf.minute   = rtc_bcd_to_hex(r_buffer[1])& 0x7f; //min
rtc_buf.stunde   = rtc_bcd_to_hex(r_buffer[2])& 0x3f; //std
rtc_buf.tag      = rtc_bcd_to_hex(r_buffer[3])& 0x3f; //tag
rtc_buf.w_tag    = rtc_bcd_to_hex(r_buffer[4])& 0x07; //tag in der Woche
rtc_buf.monat    = rtc_bcd_to_hex(r_buffer[5])& 0x1f; //monat
rtc_buf.jahr     = rtc_bcd_to_hex(r_buffer[6])& 0x1f; //jahr


Gruß G.G.
Gast
Aha Danke, ich dachte ich könnte es irgendwie in der for schleife 
einbauen, aber was mir auch auffiel ist, dass ich den struct tm beim 
auslesen übergebe, aber ihn nicht im code benutze, also muss ich doch 
einzeln übergeben.

warum sek, min mit 0x7f maskieren, die sind doch nur maximal 59 und Tage 
24?
Gast
Hallo

Also wurde es dann so heißen:
1
unsigned int rv3029_read(unsigned long Base, struct tm *tm, unsigned int Len) {
2

3
unsigned char Data[3];
4

5
I2C_StartTX(Base, RV3029_SLAVE_write, RV3029_SEC);
6
I2C_Stop(Base);
7
I2C_StartRX(Base, RV3029_SLAVE_read, Data);
8
for (i = 0 ; i < Len; i++) {
9
    Data[i] = I2C_Read(Base);
10
}
11
tm->tm_sec = BCDtoI(Data[0]) & 0x7f;
12
tm->tm_min = BCDtoI(Data[1]) & 0x7f;
13
tm->tm_hour = BCDtoI(Data[2]) & 0x3f;
14
UARTprintf("Uhrzeit: %02d:%02d:%02d\n", tm->tm_hour, tm->tm_min, tm->tm_sec);
15
  I2C_Stop(Base);
16
}
Gast
Hab da noch ne Frage, in der read funktion, habe ich eine VAriable Data 
erstellt, die als Datenvariable für den I2C_RX eingesetzt wird, soll da 
eigentlich nicht mein tm da hin, ich glaube ich verwechse hier gerade 
etwas.

Danke.
Gast
Danke für deine Antwort. leider funktioniert es immer noch nicht so 
ganz.
Habs auf dem Oszi alles angeschaut jeden Schritt, laut dem Datenblatt 
(siehe unten) sollte nach dem Punkt 8 ein Acknowledgement kommen, das 
passiert bei mir nicht, ich komme einfach nicht drauf warum denn nicht.
Wie gesagt, das schreiben funktioniert. Auch im Read mode, funktionieren 
die Punkte 1 bis 6, dann Punkt 7 und Punkt 8 sehe ich auch auf dem Oszi 
nur im nächsten Bit kommt kein Acknowledgement.

Als Verständnis. Der Master ist ja der I2C Bus und Slave ist ja die 
RV3029 Uhr. Also ist im write mode der Master der Transmistter und Slave 
der Receiver, aber im Read mode ist dann der Master der Receiver und 
Slave der Transmitter, das heißt, dass der I2c bus kein acknowledge 
quittiert, dalso muss ich hier nach dem Fehler suchen.
1
1) Master sends-out the “Start Condition”.
2
2) Master sends-out the “Slave Address”, ACh for the RV-3029-C2; the R/W bit = “0” for write mode.
3
3) Acknowledgement from the RV-3029-C2.
4
4) Master sends-out the “Page & Word Address” to the RV-3029-C2.
5
5) Acknowledgement from the RV-3029-C2.
6
6) Master sends-out the “Stop Condition”.
7
7) Master sends-out the “Start Condition”.
8
8) Master sends-out the “Slave Address”, ADh for the RV-3029-C2; the R/W bit =”1” for read mode.
9
9) Acknowledgement from the RV-3029-C2.
10
At this point, the Master becomes a Receiver, the Slave becomes the Transmitter.
11
10) The RV-3029-C2 sends-out the “Data” from the “Page & Word Address” specified in step 4).
12
11) Acknowledgement from the Master. At this time, the “Page & Word” Address will be automatically incremented by 1.
13
12) Steps 10) and 11) can be repeated if necessary. Within the same Page-Address, the Word-Address will be
14
incremented automatically
15
13) The Master, addressed as Receiver, can stop data transmission by not generating an acknowledge on the last byte
16
that has been sent from the Slave Transmitter. In this event, the Slave-Transmitter must leave the data line HIGH
17
to enable the Master to generate a stop condition.
18
14) Master sends-out the “Stop Condition”.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.