RX4045 RTC von Epson macht Probleme

Gast #3740554
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
}
Gast #3740595
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
}
Gast #3740612
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren