Loading src/arch/msp430fr5969lp/arch.cc +2 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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 Loading src/arch/msp430fr5969lp/driver/i2c.cc +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; Loading Loading @@ -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; Loading Loading @@ -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; Loading
src/arch/msp430fr5969lp/arch.cc +2 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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 Loading
src/arch/msp430fr5969lp/driver/i2c.cc +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; Loading Loading @@ -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; Loading Loading @@ -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;