]> git.karo-electronics.de Git - oswald.git/blobdiff - metawatch/mw_acc.c
Start support for the accelerometer, change text position for clock setup
[oswald.git] / metawatch / mw_acc.c
diff --git a/metawatch/mw_acc.c b/metawatch/mw_acc.c
new file mode 100644 (file)
index 0000000..270f246
--- /dev/null
@@ -0,0 +1,71 @@
+#include <msp430.h>
+#include <msp430xgeneric.h>
+#include <stdint.h>
+
+#include "mw_main.h"
+
+#include "mw_acc.h"
+
+void mw_init_acc_i2c(void)
+{
+       /* enable reset before configuration */
+       ACCELEROMETER_CTL1 |= UCSWRST;
+
+       /* configure as master using smclk / 40 = 399.5 kHz */
+       ACCELEROMETER_CTL0 = UCMST + UCMODE_3 + UCSYNC;
+       ACCELEROMETER_CTL1 = UCSSEL__SMCLK + UCSWRST;
+       ACCELEROMETER_BR0 = 42;
+
+       ACCELEROMETER_BR1 = 0;
+       ACCELEROMETER_I2CSA = KIONIX_DEVICE_ADDRESS;
+
+       /* release reset */
+       ACCELEROMETER_CTL1 &= ~UCSWRST;
+}
+
+/*
+ * DMA2 = SPI for LCD
+ */
+static void mw_acc_i2c_write_byte(uint8_t byte)
+{
+       ACCELEROMETER_TXBUF = byte;
+       while ((ACCELEROMETER_CTL1 & ACCELEROMETER_IFG) == 0)
+               nop();
+}
+
+/* OK this is polling write, but data is small and 400kHz I2C, it should "just work" :) */
+void mw_acc_i2c_write(const uint8_t addr, const void *data, const uint8_t len)
+{
+       int i;
+
+       if (len == 0) {
+               return;  
+       }
+  
+       while (UCB1STAT & UCBBUSY)
+               nop();
+  
+       /* 
+        * setup for write and send the start condition
+        */
+       ACCELEROMETER_IFG = 0;
+       ACCELEROMETER_CTL1 |= UCTR + UCTXSTT;
+       while (!(ACCELEROMETER_IFG & UCTXIFG))
+               nop();
+  
+       /* 
+        * clear transmit interrupt flag,
+        * send the register address
+        */
+       ACCELEROMETER_IFG = 0;
+
+       mw_acc_i2c_write_byte(addr);
+
+       for (i=0; i<len; i++)
+               mw_acc_i2c_write_byte(*(uint8_t *)(data+i));
+
+       while (ACCELEROMETER_CTL1 & UCTXSTP)
+               nop();
+}
+
+