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 | }
|