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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.