Forum: Mikrocontroller und Digitale Elektronik AT89C51AC3 und DS1305 - SPI ?


von R. B. (rabis)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe einen DS1305 an einen AT89C51AC3 (mit 29,4912 Mhz Takt) 
angeschlossen.
Da ich die Zeit aus den DS1305-Registern nicht auslesen kann, hab ich 
mit dem Oszi nachgemessen und festgestellt, dass der (bzw. die) DS1305 
beim Senden des Registerwertes (z.B. Minuten) die H-Pegel nicht 
erreichen (nur ca. 0.8V bei 3.3 VCC).
Der H-Pegel bei Adresse(z.B 0x01 für Minuten) senden stimmt aber. Hier 
mal das Oszillogramm dazu.
Kann das jemand evtl. erklären?

Die init-Routine (SDCC) sieht so aus:
1
void SPI_InitRTC (void) {
2
  SPCON &= ~0x40;   // Cleared and reset SPI interface
3
  SPCON  = MSTR + !SSDIS + SPR2 + SPR1 + !SPR0 + !CPOL + CPHA ;
4
  IEN1  &= ~0x08;   // disable SPI interrupt 
5
  SPCON |=  SPEN ;  // run spi
6
}
Gruß
RABIS

von Mathias H. (mathias_h)


Lesenswert?

SPI hat aber doch 4 Kabel oder verwendest du den DS1305 im 3-Wire-Modus 
(hat der den überhaupt?)

du sendest 0x01 (auf MOSI) und erwartest die Minuten die sind aber dann 
nicht auf dem selben Kabel sondern auf dem 2. MISO ...

edit:
okay hab gesehn es geht auch im 3-wire modus ... hast du dazu ansonsten 
noch deine Schaltung und den Code wo du das ausliest?

von R. B. (rabis)


Lesenswert?

@ mathias_h
Hier "meine" Code-snippets. Die Schaltung ist normal SPI und P2.3 für 
RTC_CS.

Gruß
RABIS
1
//-----------------------------------------------------------------------------
2
unsigned char make_bcd(unsigned char byte) {
3
   unsigned char result;
4
   result = (byte >> 4) * 10;
5
   result += (byte & 0x0F);
6
   return result;
7
}
8
//-----------------------------------------------------------------------------
9
unsigned char RTC_RD(unsigned char add) { 
10
     unsigned char byte,i;
11
     RTC_CS = ON;
12
     for(i=0;i<0x02;i++);
13
     SPI_masterIO(add);
14
     byte = SPI_masterIO(0x00);  // dummy = 0x00
15
     for(i=0;i<0x02;i++); 
16
     RTC_CS = OFF;           
17
     return byte;
18
}
19
20
//-----------------------------------------------------------------------------
21
void RTC_get_time(void) {
22
   RTC_sec    = make_bcd(RTC_RD(RTC_TIME_SEC_RD));
23
   RTC_min    = make_bcd(RTC_RD(RTC_TIME_MIN_RD));
24
   RTC_hours  = make_bcd(RTC_RD(RTC_TIME_HRS_RD));
25
}

von Thomas K. (tomthegeek)


Lesenswert?

Interessant zu wissen wäre, was bei
1
 RTC_CS = ON;
passiert.
Ich denke RTC_CS ist als Makro definiert? Wenn ja, wie genau?
Wird denn P2.3 wirklich gesetzt?

von Mathias H. (mathias_h)


Lesenswert?

hast du jetzt 3 oder 4 - wire - betrieb?

weil du sendest gleichzeitig, während du empfängst ... d.h. du versaust 
dir dein "empfangenes" mit dem senden von 0x00 ... dein code spricht für 
4-wire-betrieb, ich bin leider nicht der at89 experte, mei msp430 hätt 
ich dir sicher besser helfen können ... guck dir mal (wenn deine 
Schaltung im 3-Wire-Modus ist) die Register an, und schau nochmal nach 
ob es im 3-wire modus oder 4-wire konfiguriert ist ... irgendwas ist da 
noch nicht astrein ... sprich schaltung und code passen nicht zusammen 
würde ich sagen


edit: ich find im AT89C51AC3 - Datenblatt nichts zur Konfiguration im 
3-wire-Betrieb des SPI-Bus ... also liegt es an der Verkabelung?! es 
gibt eben kein "standart-SPI" ;)

von R. B. (rabis)


Lesenswert?

@tomhegeek

P2.3 = 1;

Der DS1305 ist High-aktiv, alle anderen SPI-Bausteine sind Low-aktiv.

@mathias_h

Dacht ich auch erst, aber beim SPI-Bus ist MISO=MOSI, d.h. empfangene 
Daten sind immer auch gleich den gesendeten Daten.
Und wenn da was "versaut" wird, warum dann nicht bei der Adresse?

Konkret ist es so:
AT89C51AC3    DS1305
P2.3          RTC_CS
P4.2 (MISO)   SDO
P4.3 (SCK)    SCLK
P4.4 (MOSI)   SDI

von R. B. (rabis)


Lesenswert?

Hier nochmal meine SPI-Funktion:
1
//-----------------------------------------------------------------------------  
2
3
unsigned char SPI_masterIO (unsigned char spi_data) {  // 8 Bit
4
   SPDAT = spi_data;
5
  while (SPSCR != SPIF + SPTE);
6
  return SPDAT;
7
}  
8
9
//-----------------------------------------------------------------------------

von Mathias H. (mathias_h)


Lesenswert?

Bei der Adresse sendest du nur, der DS1305 ist "Stumm" ... es müssen 4 
Leitungen vorhanden sein: SCK, CS, MOSI, MISO ...
http://www.maxim-ic.com/images/qv/2686.gif
dort sind MOSI und SIMO zusammengeführt, das muss man aber nicht ... du 
solltest gucken wo an deinem µC diese Leitungen sidn und die einfach 
verbinden ... also SO an MI und SI an MO ... und: den reset-Pin nicht 
vergessen ... sonst wird das immernoch nix ^^

von Mathias H. (mathias_h)


Lesenswert?

Ich seh grad du hast ja 2 Leitungen für MOSI und MISO ... miss mal bitte 
die andere Leitung mit dem OSzi .. da müsste das Ergebnis erscheinen ... 
dann wäre es höchstens ein Fehler in der Konfiguration, sorich dem 
SPI-Mode...

Was hast du mit dem Reset pin gemacht??

von R. B. (rabis)


Lesenswert?

@mathias_h

Es gibt keinen Reset-pin und diese Schaltung ist für 3-wire 
communication.
Mit SERMODE = VCC wird SPI communication ausgewählt, okay ? Natürlich 
liegt bei mir SERMODE an VCC ;-) - bei DIP ist das Pin 9. Pin 14 und 16 
ebenfalls an VCC = 3.3V

Gruß
RABIS

von Mathias H. (mathias_h)


Lesenswert?

okay kein reset pin ^^

Du sagst du hast 3 -wire, aber wieso hast du dann
P4.2 (MISO)   SDO
und
P4.4 (MOSI)   SDI

von Mathias H. (mathias_h)


Lesenswert?

Serial Interface Mode. The SERMODE pin offers the flexibility to choose
between two serial interface modes. When connected to GND, standard 
3-wire
communication is selected. When connected to VCC, SPI communication is
selected ...


also was denn nun 3 wire oder 4 -wire??

von R. B. (rabis)


Lesenswert?

@mathias_h

AT89C51AC3    DS1305
P2.3          CE (RTC_CS)
P4.2 (MISO)   SDO
P4.3 (SCK)    SCLK
P4.4 (MOSI)   SDI

Das sind vier.
Das SPI Interface ist master für den AT89C51AC3 ohne /SS.

Gruß
RABIS

von Mathias H. (mathias_h)


Lesenswert?

Gut, dann willst du jetzt die Minute auslesen ... sendest erst 0x01 auf 
SDO und dann 0x00 als Dummy. Deine Daten aus der RTC erscheinen auf SDI 
(kannst du diese Leitung auch nochmal messen?

von R. B. (rabis)


Lesenswert?

@mathias_h

Fehler gefunden, teilweise. Es hatte sich eine Brücke zwischen MISO und 
MOSI gebildet. Bei der Stundenausgabe driftet der Pegel noch weg, wenn 
ichs hab,
dann poste ich es noch.

Das war der entscheidende Hinweis:
... irgendwas ist da
noch nicht astrein ... sprich schaltung und code passen nicht zusammen
würde ich sagen

Danke!
RABIS

von Mathias H. (mathias_h)


Lesenswert?

bitte ;) und viel Glück!

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.