import c2_ulx3s_test from examples
[Arduino] / c2_ulx3s_test / rtc.cpp
1 /* RTC MCP7940N test
2  * Battery required: CR1225 3V
3  * Board v1.7 needs changes: D11=RED LED, R4=4.7k
4  * To enter sleep mode, D18 (GREEN LED) should be OFF
5  * D18 is OFF by default when FT231x usb-serial is not enumerated
6  * Either plug FPGA into 5V USB charger
7  * or reprogram FT231x to drive D18 OFF:
8  * ftx_prog --cbus 3 drive_0
9  * to restore default D18 state:
10  * ftx_prob --cbus 3 sleep
11  */
12
13 #include <SoftwareWire.h>
14 SoftwareWire Wire(32+29,32+28);
15
16 #define I2CADDR 0x6F // Microchip MCP7940N
17
18 void regwrite(uint8_t reg, uint8_t value)
19 {
20   Wire.beginTransmission(I2CADDR);
21   Wire.write(byte(reg));
22   Wire.write(byte(value));
23   Wire.endTransmission();  
24 }
25
26 int regread(uint8_t reg, int8_t n)
27 {
28   Wire.beginTransmission(I2CADDR);
29   Wire.write(byte(reg));
30   Wire.endTransmission();
31
32   Wire.requestFrom(I2CADDR, n);
33   if(Wire.available()) // slave may send less than requested
34     return Wire.read();
35   return -1;  
36 }
37
38 void rtc_clear_interrupts()
39 {
40 }
41
42 void rtc_set_clock()
43 {
44   // set clock
45   regwrite(0x06, 0x17); // year
46   regwrite(0x05, 0x12); // month
47   regwrite(0x04, 0x31); // day
48   regwrite(0x03, 0x07 | 8); // weekday | battery_backup
49   regwrite(0x02, 0x23); // hour
50   regwrite(0x01, 0x59); // minute
51   regwrite(0x00, 0x00 | 0x80); // second | start_oscillator
52 }
53
54 void rtc_set_alarm()
55 {
56   // set alarm (in 2 minutes)
57   regwrite(0x10, 0x18); // year
58   regwrite(0x0F, 0x01); // month
59   regwrite(0x0E, 0x01); // day
60   regwrite(0x0D, 0x01 | 0x70); // weekday | match_condition full timedate
61   regwrite(0x0C, 0x00); // hour
62   regwrite(0x0B, 0x00); // minute
63   regwrite(0x0A, 0x00); // seconds
64 }
65
66 void rtc_init() {
67   Wire.setClock(100000L); // 100000-400000 Hz i2c bus clock
68   Wire.begin();            // join i2c bus (address optional for master)
69
70   // set control register, enable only alarm0
71   regwrite(0x07, 0x10);
72
73   // set oscillator digital trim
74   regwrite(0x08, 0x45);
75 }
76
77 void rtc_read(char *a)
78 {
79   char *eval;
80   uint8_t yr = regread(0x06,1) & 0x3F;
81   if(yr >= 0x17 && yr <= 0x18)
82     eval = regread(0x0D,1) & 8 ? " OK " : "WAIT";
83   else
84     eval = "FAIL";
85   sprintf(a, "20%02x-%02x-%02x %02x:%02x:%02x %s *-%02x %02x:%02x:%02x\n",
86     regread(0x06,1) & 0x3F, // year
87     regread(0x05,1) & 0x7F, // month
88     regread(0x04,1) & 0x7F, // day
89     regread(0x02,1) & 0x3F, // hour
90     regread(0x01,1) & 0x7F, // minute
91     regread(0x00,1) & 0x7F, // second
92     eval,  // time evaluation and alarm flag
93     regread(0x0E,1) & 0x3F, // alarm day
94     regread(0x0C,1) & 0x3F, // alarm hour
95     regread(0x0B,1) & 0x7F, // alarm minute
96     regread(0x0A,1) & 0x7F  // alarm second
97   );
98 }