Hallo Zusammen,
momentan schreibe ich einen Treiber für die RTC MCP79521. Auf diesem
Baustein befindet sich neben der RTC auch ein EEPROM und ein geschützter
Bereich für eine MAC-Adresse. Auf das EEPROM und den geschützten Bereich
komme ich drauf. Die RTC will einfach nicht starten. Ich habe schon
einiges mit dem Reg. ST, VBAT, OSC usw. probiert, und komme nicht
weiter. Es geht im wesentlichen um diese Code-Abschnitte. Habe hier ggf.
etwas vergessen? Kennt jemand diese RTC für den SPI-Bus?
Den kompletten Quelltext und das Datenblatt habe ich beigefügt. Wäre
schön wenn hier jemand etwas weiß.
Viele Grüße
Ingo
1 | #define MCP795XX_READ 0x13 // Read data from RTCC/SRAM array beginning at selected address
|
2 | #define MCP795XX_WRITE 0x12 // Write data to RTCC/SRAM array beginning at selected address
|
3 |
|
4 | /************************************************************************/
|
5 | // Uhrzeit
|
6 | /************************************************************************/
|
7 | #define RTCHSEC 0x00
|
8 | #define RTCSEC 0x01
|
9 | #define RTCMIN 0x02
|
10 | #define RTCHOUR 0x03
|
11 | #define RTCWKDAY 0x04
|
12 | #define RTCDATE 0x05
|
13 | #define RTCMTH 0x06
|
14 | #define RTCYEAR 0x07
|
15 | #define CONTROL 0x08
|
16 | #define OSCTRIM 0x09
|
17 | /************************************************************************/
|
18 |
|
19 | /************************************************************************/
|
20 | // Allgemeines Schreiben eines Bytes
|
21 | /************************************************************************/
|
22 | uint8_t MCP795XX_Write_Byte(uint8_t address, uint8_t data)
|
23 | {
|
24 |
|
25 | while (!SPI1_Open(SPI1_DEFAULT)); //4.00 MHz
|
26 | CS_RTC_SetLow();
|
27 | RTC_SPI_WRITE8(MCP795XX_WRITE);
|
28 | RTC_SPI_WRITE8(address);
|
29 | RTC_SPI_WRITE8(data);
|
30 | CS_RTC_SetHigh();
|
31 |
|
32 | SPI1_Close();
|
33 | __delay_ms(5); //Pausenzeit zum schreiben
|
34 |
|
35 | return 1;
|
36 | }
|
37 | /************************************************************************/
|
38 |
|
39 | /************************************************************************/
|
40 | // Allgemeines Lesen eines Bytes
|
41 | /************************************************************************/
|
42 | uint8_t MCP795XX_Read_Byte(uint8_t address)
|
43 | {
|
44 | uint8_t retval;
|
45 |
|
46 | while (!SPI1_Open(SPI1_DEFAULT)); //4.00 MHz
|
47 | CS_RTC_SetLow();
|
48 | RTC_SPI_WRITE8(MCP795XX_READ);
|
49 | RTC_SPI_WRITE8(address);
|
50 | retval = RTC_SPI_READ8();
|
51 | CS_RTC_SetHigh();
|
52 | SPI1_Close();
|
53 |
|
54 | return(retval);
|
55 | }
|
56 | /************************************************************************/
|
57 |
|
58 | //exemplarisch mal diesen Teil zum Schreiben der Sekunden
|
59 | /************************************************************************/
|
60 | void MCP795XX_Write_Sekunden(date_time_t *dt)
|
61 | {
|
62 | uint8_t bcd_Sekunden;
|
63 |
|
64 | bcd_Sekunden = BIN2BCD(dt->Sekunden);
|
65 | MCP795XX_Write_Byte(RTCSEC, (0x80 | ((bcd_Sekunden) & 0x7F))); // ST ON
|
66 | }
|
67 | /************************************************************************/
|