AT89C51AC3 und DS1305 - SPI ?

OP #2009215
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
Angehängte Dateien:
#2009232
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?
OP #2009247
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
}
#2009253
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" ;)
OP #2009264
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
OP #2009269
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
//-----------------------------------------------------------------------------
#2009270
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 ^^
OP #2009279
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
OP #2009433
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren