Forum: Mikrocontroller und Digitale Elektronik RX4045 RTC von Epson macht Probleme


von Manu (Gast)


Lesenswert?

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
}

von Georg G. (df2au)


Lesenswert?

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.

von Manu (Gast)


Lesenswert?

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
}

von Georg G. (df2au)


Lesenswert?

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).

von Manu (Gast)


Lesenswert?

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
}

von Bole aus Serbien (Gast)


Lesenswert?

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 ?

von Manu (Gast)


Lesenswert?

Nein das war der Fehler, CPHA muss an. Dass auch jeder seinen eigenen 
Saft braut. :D jetzt gehts, vielen Dank!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.