#include #include #include #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