Forum: Mikrocontroller und Digitale Elektronik Rv-3029 auslesen funktioniert nicht


von Tom (Gast)


Lesenswert?

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.

von Gerhard G. (g_g)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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?

von Gerhard G. (g_g)


Lesenswert?

Hallo,

da in den jeweiligen Register noch mehr Infos stecken!

Datenblatt ansehen.


Gruß G.G.

von Tom (Gast)


Lesenswert?

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
}

von Tom (Gast)


Lesenswert?

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.

von Gerhard G. (g_g)


Lesenswert?

Hallo,

du ließt über I2C die Daten aus der RTC nach DATA[x]

Dann korrigierst du die Daten und bringst sie über die Zeiger in deine 
struct Time. Ist eigentlich ok.



Gruß G.G.

von Tom (Gast)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

Poste doch mal die Oszi-Bilder.

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.