RX4045 RTC von Epson macht Probleme

Gast #3740554
Hallo,
versuche mich gerade an der RTC 4045 von Epson.
Es funktioniert leider nicht viel. Habe Versucht das Control Register 
auszulesen. Zur Hardware: Habe sie nach dem Datenblatt aufgebaut. Wenn 
ich jetzt den Code ausführen lasse, kommen nur 0xFF zurück. Ein paar 
Fakten:

Die RTC 4045 ist CE High aktiv, das Signal kommt auch am Chip an.
Die CLK Frequenz darf maximal 1MHz betragen, hier wird ein ATMega644 mit 
einem externen 12 MHz Quarz benutzt. Teiler der SPI: 32
Der Chip 4045 richtet sich beim High schalten der CE-Line an der SCK 
Line aus, siehe auch Datenblatt.

Datenblatt: http://www.promelec.ru/pdf/RX4045SAA.pdf

Leider habe ich zurzeit keinen Logic-analyser zur Hand. Hat jemand 
Erfahrung mit dem Chip und einen Lösungsansatz? Was habe ich übersehen?
1
// SPI-Init:
2
  DDRB |= (1<<PORTB4)|(1<<PORTB5)|(1<<PORTB7);  
3
  DDRB &= ~(1<<PORTB6);
4
  
5
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPI2X);         
6

7
   
8
   _delay_ms(3000);
9
   
10
  uart_init();
11

12
  
13
  sei();
14

15
  // Echtzeituhr:
16
  rx4045_init();
...
1
void rx4045_init(void)
2
{
3
  // Echtzeituhr Chanelselect:
4
  RX4045_CS_PORT &= ~(1 << RX4045_CS_PIN);
5
  RX4045_CS_DDR |= (1 << RX4045_CS_PIN);
6
  
7
  while(1)
8
  {
9
    uint8_t a = rx4045_single_read(0x0F);  
10
    _delay_ms(1);
11
  }      
12
}
13

14
uint8_t rx4045_single_read(uint8_t Adress)
15
{
16
  uint8_t Commando;
17
  uint8_t Antwort;
18
  
19
  _delay_ms(10);
20
  // Chipselect:
21
  RX4045_CS_PORT |= (1 << RX4045_CS_PIN);
22
  _delay_ms(10);
23
  
24
  Commando = ((Adress & 0x0F) << 4) | (0x04 & 0x0F); // Ersten vier Bits von der Adresse, dann den Befehl anhängen
25
  
26
  uart_putc(Commando);
27
      
28
   SPDR = Commando;
29
   while(!(SPSR & (1<<SPIF)));  
30
  Antwort = SPDR;  
31
  
32
  RX4045_CS_PORT &= ~(1 << RX4045_CS_PIN);  
33
  uart_putc(Antwort);
34
  _delay_ms(500);    
35
}
Dein SPI klopft mit 8 Takten Adresse und und Befehl raus. Dann müssen 
aber noch weitere (8) Takte kommen, in denen die gelesenen Daten vom RTC 
geholt werden. IIRC macht das normale SPI aber nur 8 Takte und dann ist 
Feierabend.
Gast
Also sendet er nur ein Byte und hört dann auf, aber ich hole mir doch 
die "Antwort" aus dem SPDR Register.
Beim RFM12 z.B. funktioniert das doch so:
1
unsigned short rf12_trans(unsigned short wert)
2
{
3
    CONVERTW val;
4
  
5
  // SPI Anpassen:
6
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //|(1<<SPI2X); 
7
  SPSR &= ~(1 << SPI2X);
8

9
  val.w = wert;
10
  cbi(RF_PORT, CS);
11
  SPDR = val.b[1];
12

13
  while(!(SPSR & (1<<SPIF)));
14

15
  val.b[1]=SPDR;
16
  SPDR = val.b[0];
17

18
  while(!(SPSR & (1<<SPIF)));
19

20
  val.b[0]=SPDR;
21
  sbi(RF_PORT, CS);  
22

23
  return val.w;
24
}
Das Datenblatt des RTC sagt eindeutig, dass die Daten erst mit den 
zweiten 8 Takten geliefert werden. Der RFM12 liefert mit den ersten 
Takten den Status, den Rest muss man ihm extra heraus locken (indem man 
z.B. eine 0 hinterher schiebt).
Gast
Okay hab ich übersehen. Wenn ich eine Null hinterherschiebe, verhält 
sich der Chip genauso, es kommt nur 0xFF zurück, statt 0x10 wie für das 
F-Register im default angegeben:
1
uint8_t rx4045_single_read(uint8_t Adress)
2
{
3
  uint8_t Commando;
4
  uint8_t Antwort;
5
  
6
  _delay_ms(10);
7
  // Chipselect:
8
  RX4045_CS_PORT |= (1 << RX4045_CS_PIN);
9
  _delay_ms(10);
10
  
11
  Commando = ((Adress & 0x0F) << 4) | (0x0C & 0x0F); // Ersten vier Bits von der Adresse, dann den Befehl anhängen
12
  
13
  uart_putc(Commando);
14
      
15
   SPDR = Commando;
16
   while(!(SPSR & (1<<SPIF)));  
17
  
18
  SPDR = 0;
19
  while(!(SPSR & (1<<SPIF)));
20
  Antwort = SPDR;
21
  
22
  _delay_us(10);  
23
  
24
  RX4045_CS_PORT &= ~(1 << RX4045_CS_PIN);  
25
  uart_putc(Antwort);
26
  _delay_ms(500);    
27
}
Gast
Manu schrieb:
> Okay hab ich übersehen. Wenn ich eine Null hinterherschiebe, verhält
> sich der Chip genauso, es kommt nur 0xFF zurück, statt 0x10 wie für das
> F-Register im default angegeben:

 SPI MODE richtig eingestellt ?

Antwort schreiben

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