AT89C51AC3 und DS1305 - SPI ?

OP #2009215
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:
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
@ 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
}
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
@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
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
//-----------------------------------------------------------------------------
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 ^^
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??
OP
@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
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??
OP
@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

Eine eigene Frage? Dieser Thread ist über 15 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.