Browse code

Start support for the accelerometer, change text position for clock setup

Nils Faerber authored on 04/05/2013 22:31:14
Showing 3 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,71 @@
1
+#include <msp430.h>
2
+#include <msp430xgeneric.h>
3
+#include <stdint.h>
4
+
5
+#include "mw_main.h"
6
+
7
+#include "mw_acc.h"
8
+
9
+void mw_init_acc_i2c(void)
10
+{
11
+	/* enable reset before configuration */
12
+	ACCELEROMETER_CTL1 |= UCSWRST;
13
+
14
+	/* configure as master using smclk / 40 = 399.5 kHz */
15
+	ACCELEROMETER_CTL0 = UCMST + UCMODE_3 + UCSYNC;
16
+	ACCELEROMETER_CTL1 = UCSSEL__SMCLK + UCSWRST;
17
+	ACCELEROMETER_BR0 = 42;
18
+
19
+	ACCELEROMETER_BR1 = 0;
20
+	ACCELEROMETER_I2CSA = KIONIX_DEVICE_ADDRESS;
21
+
22
+	/* release reset */
23
+	ACCELEROMETER_CTL1 &= ~UCSWRST;
24
+}
25
+
26
+/*
27
+ * DMA2 = SPI for LCD
28
+ */
29
+static void mw_acc_i2c_write_byte(uint8_t byte)
30
+{
31
+	ACCELEROMETER_TXBUF = byte;
32
+	while ((ACCELEROMETER_CTL1 & ACCELEROMETER_IFG) == 0)
33
+		nop();
34
+}
35
+
36
+/* OK this is polling write, but data is small and 400kHz I2C, it should "just work" :) */
37
+void mw_acc_i2c_write(const uint8_t addr, const void *data, const uint8_t len)
38
+{
39
+	int i;
40
+
41
+	if (len == 0) {
42
+		return;  
43
+	}
44
+  
45
+	while (UCB1STAT & UCBBUSY)
46
+		nop();
47
+  
48
+	/* 
49
+	 * setup for write and send the start condition
50
+	 */
51
+	ACCELEROMETER_IFG = 0;
52
+	ACCELEROMETER_CTL1 |= UCTR + UCTXSTT;
53
+	while (!(ACCELEROMETER_IFG & UCTXIFG))
54
+		nop();
55
+  
56
+	/* 
57
+	 * clear transmit interrupt flag,
58
+	 * send the register address
59
+	 */
60
+	ACCELEROMETER_IFG = 0;
61
+
62
+	mw_acc_i2c_write_byte(addr);
63
+
64
+	for (i=0; i<len; i++)
65
+		mw_acc_i2c_write_byte(*(uint8_t *)(data+i));
66
+
67
+	while (ACCELEROMETER_CTL1 & UCTXSTP)
68
+		nop();
69
+}
70
+
71
+
0 72
new file mode 100644
... ...
@@ -0,0 +1,109 @@
1
+#ifndef _MW_ACC_H
2
+#define _MW_ACC_H
3
+
4
+#define KIONIX_DEVICE_ADDRESS ( 0x0F )
5
+
6
+/* KIONIX accelerometer register addresses */
7
+#define KIONIX_XOUT_HPF_L        ( 0x00 )
8
+#define KIONIX_XOUT_HPF_H        ( 0x01 )
9
+#define KIONIX_YOUT_HPF_L        ( 0x02 )
10
+#define KIONIX_YOUT_HPF_H        ( 0x03 )
11
+#define KIONIX_ZOUT_HPF_L        ( 0x04 )
12
+#define KIONIX_ZOUT_HPF_H        ( 0x05 )
13
+#define KIONIX_XOUT_L            ( 0x06 )
14
+#define KIONIX_XOUT_H            ( 0x07 )
15
+#define KIONIX_YOUT_L            ( 0x08 )
16
+#define KIONIX_YOUT_H            ( 0x09 )
17
+#define KIONIX_ZOUT_L            ( 0x0A )
18
+#define KIONIX_ZOUT_H            ( 0x0B )
19
+#define KIONIX_DCST_RESP         ( 0x0C )
20
+#define KIONIX_WHO_AM_I          ( 0x0F )
21
+#define KIONIX_TILT_POS_CUR      ( 0x10 )
22
+#define KIONIX_TILT_POS_PRE      ( 0x11 )
23
+#define KIONIX_INT_SRC_REG1      ( 0x15 )
24
+#define KIONIX_INT_SRC_REG2      ( 0x16 )
25
+#define KIONIX_STATUS_REG        ( 0x18 )
26
+#define KIONIX_INT_REL           ( 0x1A )
27
+#define KIONIX_CTRL_REG1         ( 0x1B )
28
+#define KIONIX_CTRL_REG2         ( 0x1C )
29
+#define KIONIX_CTRL_REG3         ( 0x1D )
30
+#define KIONIX_INT_CTRL_REG1     ( 0x1E )
31
+#define KIONIX_INT_CTRL_REG2     ( 0x1F )
32
+#define KIONIX_INT_CTRL_REG3     ( 0x20 )
33
+#define KIONIX_DATA_CTRL_REG     ( 0x21 )
34
+#define KIONIX_TILT_TIMER        ( 0x28 )
35
+#define KIONIX_WUF_TIMER         ( 0x29 )
36
+#define KIONIX_TDT_TIMER         ( 0x2B )
37
+#define KIONIX_TDT_H_THRESH      ( 0x2C )
38
+#define KIONIX_TDT_L_THRESH      ( 0x2D )
39
+#define KIONIX_TDT_TAP_TIMER     ( 0x2E )
40
+#define KIONIX_TDT_TOTAL_TIMER   ( 0x2F )
41
+#define KIONIX_TDT_LATENCY_TIMER ( 0x30 )
42
+#define KIONIX_TDT_WINDOW_TIMER  ( 0x31 )
43
+#define KIONIX_SELF_TEST         ( 0x3A )
44
+#define KIONIX_WUF_THRESH        ( 0x5A )
45
+#define KIONIX_TILT_ANGLE        ( 0x5C )
46
+#define KIONIX_HYST_SET          ( 0x5F )
47
+
48
+/* CTRL_REG1 */
49
+#define PC1_STANDBY_MODE     ( 0 << 7 )
50
+#define PC1_OPERATING_MODE   ( 1 << 7 )
51
+#define RESOLUTION_8BIT      ( 0 << 6 )
52
+#define RESOLUTION_12BIT     ( 1 << 6 )
53
+#define DRDYE_DATA_AVAILABLE ( 1 << 5 )
54
+#define WUF_ENABLE           ( 1 << 1 )
55
+#define TAP_ENABLE_TDTE      ( 1 << 2 ) 
56
+#define TILT_ENABLE_TPE      ( 1 << 0 )
57
+
58
+/* CTRL_REG2 */
59
+#define TILT_LEM (1 << 5 )
60
+#define TILT_RIM (1 << 4 )
61
+#define TILT_DOM (1 << 3 )
62
+#define TILT_UPM (1 << 2 )
63
+#define TILT_FDM (1 << 1 )
64
+#define TILT_FUM (1 << 0 )
65
+
66
+/* CTRL_REG3 */
67
+#define SRST               ( 1 << 7 )
68
+#define TILT_ODR_1_6HZ     ( 0 << 5 )
69
+#define TILT_ODR_6_3HZ     ( 1 << 5 )
70
+#define TILT_ODR_12_5HZ    ( 2 << 5 )
71
+#define TILT_ODR_50HZ      ( 3 << 5 )
72
+#define DCST               ( 1 << 4 )
73
+#define TAP_ODR_50HZ       ( 0 << 2 )
74
+#define TAP_ODR_100HZ      ( 1 << 2 )
75
+#define TAP_ODR_200HZ      ( 2 << 2 )
76
+#define TAP_ODR_400HZ      ( 3 << 2 )
77
+#define WUF_ODR_25HZ       ( 0 << 0 )
78
+#define WUF_ODR_50HZ       ( 1 << 0 )
79
+#define WUF_ODR_100HZ      ( 2 << 0 )
80
+#define WUF_ODR_200HZ      ( 3 << 0 )
81
+
82
+/* INT_CTRL_REG1 */
83
+#define IEN ( 1 << 5 ) 
84
+#define IEA ( 1 << 4 )
85
+#define IEL ( 1 << 3 )
86
+#define IEU ( 1 << 2 )
87
+
88
+/* INT_CTRL_REG2 */
89
+#define XBW ( 1 << 7 ) 
90
+#define YBW ( 1 << 6 )
91
+#define ZBW ( 1 << 5 )
92
+
93
+/* INT_CTRL_REG3 */
94
+#define TLEM (1 << 5)
95
+#define TRIM (1 << 4)
96
+#define TDOM (1 << 3)
97
+#define TUPM (1 << 2)
98
+#define TFDM (1 << 1)
99
+#define TFUM (1 << 0)
100
+
101
+/* INT_SRC_REG2 */
102
+#define INT_TAP_SINGLE (0x04)
103
+#define INT_TAP_DOUBLE (0x08)
104
+
105
+/* for readability */
106
+#define ONE_BYTE ( 1 )
107
+
108
+#endif
109
+
... ...
@@ -219,18 +219,18 @@ void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
219 219
 
220 220
 	if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
221 221
 		if (OswaldClk.clk24hr) {
222
-			oswald_write_character(2, 76, FONT_DROID8x12, 'x');
222
+			oswald_write_character(2, 76, FONT_6x9, 'x');
223 223
 		} else {
224
-			oswald_write_character(2, 76, FONT_DROID8x12, '_');
224
+			oswald_write_character(2, 76, FONT_6x9, '_');
225 225
 		}
226 226
 	}
227 227
 	oswald_write_string(15, 73, FONT_DROID8x12, "24hr");
228 228
 
229 229
 	if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
230 230
 		if (OswaldClk.day_first) {
231
-			oswald_write_character(2, 87, FONT_DROID8x12, 'x');
231
+			oswald_write_character(2, 86, FONT_6x9, 'x');
232 232
 		} else {
233
-			oswald_write_character(2, 87, FONT_DROID8x12, '_');
233
+			oswald_write_character(2, 86, FONT_6x9, '_');
234 234
 		}
235 235
 	}
236 236
 	oswald_write_string(15, 83, FONT_DROID8x12, "dd.mm.  mm/dd");