mikrocontroller.net

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


Autor: R. B. (rabis)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
void SPI_InitRTC (void) {
  SPCON &= ~0x40;   // Cleared and reset SPI interface
  SPCON  = MSTR + !SSDIS + SPR2 + SPR1 + !SPR0 + !CPOL + CPHA ;
  IEN1  &= ~0x08;   // disable SPI interrupt 
  SPCON |=  SPEN ;  // run spi
}
Gruß
RABIS

Autor: Mathias H. (mathias_h)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: R. B. (rabis)
Datum:

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

Gruß
RABIS
//-----------------------------------------------------------------------------
unsigned char make_bcd(unsigned char byte) {
   unsigned char result;
   result = (byte >> 4) * 10;
   result += (byte & 0x0F);
   return result;
}
//-----------------------------------------------------------------------------
unsigned char RTC_RD(unsigned char add) { 
     unsigned char byte,i;
     RTC_CS = ON;
     for(i=0;i<0x02;i++);
     SPI_masterIO(add);
     byte = SPI_masterIO(0x00);  // dummy = 0x00
     for(i=0;i<0x02;i++); 
     RTC_CS = OFF;           
     return byte;
}

//-----------------------------------------------------------------------------
void RTC_get_time(void) {
   RTC_sec    = make_bcd(RTC_RD(RTC_TIME_SEC_RD));
   RTC_min    = make_bcd(RTC_RD(RTC_TIME_MIN_RD));
   RTC_hours  = make_bcd(RTC_RD(RTC_TIME_HRS_RD));
}

Autor: Thomas K. (tomthegeek)
Datum:

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

Autor: Mathias H. (mathias_h)
Datum:

Bewertung
0 lesenswert
nicht 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" ;)

Autor: R. B. (rabis)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R. B. (rabis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier nochmal meine SPI-Funktion:
//-----------------------------------------------------------------------------  

unsigned char SPI_masterIO (unsigned char spi_data) {  // 8 Bit
   SPDAT = spi_data;
  while (SPSCR != SPIF + SPTE);
  return SPDAT;
}  

//-----------------------------------------------------------------------------

Autor: Mathias H. (mathias_h)
Datum:

Bewertung
0 lesenswert
nicht 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 ^^

Autor: Mathias H. (mathias_h)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: R. B. (rabis)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mathias H. (mathias_h)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mathias H. (mathias_h)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: R. B. (rabis)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mathias H. (mathias_h)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: R. B. (rabis)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mathias H. (mathias_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bitte ;) und viel Glück!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.