From 658ca283452c5944c55d9c751868eef6c6f34138 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Tue, 17 Jul 2018 09:48:54 +0200 Subject: MSP430: Some idle waiting --- src/arch/msp430fr5969lp/arch.cc | 2 ++ src/arch/msp430fr5969lp/driver/i2c.cc | 29 +++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/arch/msp430fr5969lp/arch.cc b/src/arch/msp430fr5969lp/arch.cc index 3016842..9ea49b7 100644 --- a/src/arch/msp430fr5969lp/arch.cc +++ b/src/arch/msp430fr5969lp/arch.cc @@ -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 diff --git a/src/arch/msp430fr5969lp/driver/i2c.cc b/src/arch/msp430fr5969lp/driver/i2c.cc index 5f1f4c1..fffc28c 100644 --- a/src/arch/msp430fr5969lp/driver/i2c.cc +++ b/src/arch/msp430fr5969lp/driver/i2c.cc @@ -1,6 +1,9 @@ #include "driver/i2c.h" +#include "arch.h" #include +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; -- cgit v1.2.3