Commit 658ca283 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

MSP430: Some idle waiting

parent c8482531
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ void Arch::idle_loop(void)
		asm volatile("nop");
		__bis_SR_register(LPM2_bits);
		asm volatile("nop");
		__dint();
#if defined(WITH_LOOP)
		if (run_loop) {
			loop();
@@ -97,6 +98,7 @@ void Arch::idle(void)
	asm volatile("nop");
	__bis_SR_register(LPM2_bits);
	asm volatile("nop");
	__dint();
#ifdef WITH_WAKEUP
		wakeup();
#endif
+23 −6
Original line number Diff line number Diff line
#include "driver/i2c.h"
#include "arch.h"
#include <msp430.h>

volatile unsigned short old_ifg = 0;

signed char I2C::setup()
{
	UCB0CTL1 = UCSWRST;
@@ -47,17 +50,25 @@ signed char I2C::xmit(unsigned char address,
	if (tx_len) {
		UCB0CTL1 |= UCTR | UCTXSTT;
		for (i = 0; i < tx_len; i++) {
			while (!(UCB0IFG & (UCTXIFG0 | UCNACKIFG | UCCLTOIFG)));
			if (UCB0IFG & (UCNACKIFG | UCCLTOIFG)) {
				UCB0IFG &= ~UCNACKIFG;
				UCB0IFG &= ~UCCLTOIFG;
			UCB0IFG = 0;
			old_ifg = 0;
			UCB0IE = UCTXIE0 | UCNACKIE | UCCLTOIE;
			while (!(old_ifg & (UCTXIFG0 | UCNACKIFG | UCCLTOIFG))) {
				arch.idle();
			}
			UCB0IE = 0;
			if (old_ifg & (UCNACKIFG | UCCLTOIFG)) {
				UCB0CTL1 |= UCTXSTP;
				return -1;
			}
			old_ifg = 0;
			UCB0TXBUF = tx_buf[i];
		}
		while (!(UCB0IFG & (UCTXIFG0 | UCNACKIFG | UCCLTOIFG)));
		UCB0IFG &= ~(UCTXIFG0 | UCNACKIFG);
		UCB0IE = UCTXIE0 | UCNACKIE | UCCLTOIE;
		while (!(old_ifg & (UCTXIFG0 | UCNACKIFG | UCCLTOIFG))) {
			arch.idle();
		}
		UCB0IE = 0;
		//if (UCB0IFG & (UCNACKIFG | UCCLTOIFG)) {
		//	UCB0IFG &= ~UCNACKIFG;
		//	UCB0IFG &= ~UCCLTOIFG;
@@ -90,4 +101,10 @@ signed char I2C::xmit(unsigned char address,
	return 0;
}

__attribute__((interrupt(USCI_B0_VECTOR))) __attribute__((wakeup)) void handle_usci_b0()
{
	old_ifg = UCB0IFG;
	UCB0IFG = 0;
}

I2C i2c;