diff --git a/src/usci-i2c.cpp b/src/usci-i2c.cpp index e153a95..a2ad296 100644 --- a/src/usci-i2c.cpp +++ b/src/usci-i2c.cpp @@ -6,47 +6,43 @@ namespace mardev::msp430::usci::i2c bool read_begin() { - // Set receive mode and generate the start condition. - *usci::registers::UCB0CTL1 ^= registers::masks::UCTR; + __rx_mode(); __start(); + while(__generating_start()); - // Wait to be ACKed or NACKed. - while(*usci::registers::UCB0CTL1 & registers::masks::UCTXSTT); - - // Read starts without any other intervention. + // Reception starts without any other intervention. // Checking UCTXNACK will discern an issue with communication. - if(*usci::registers::UCB0STAT ^ registers::masks::UCNACKIFG) + if(__nack_received()) { - return true; + __stop(); + return false; } else { - __stop(); - return false; + return true; } } uint8_t read() { - while(!(*interrupt::registers::IFG2 - & usci::registers::masks::UCB0RXIFG)); + while(!__rx_buffer_full()); return *usci::registers::UCB0RXBUF; } uint8_t read_end() { __stop(); - return *usci::registers::UCB0RXBUF; + return read(); } bool write_begin() { // Set transmit mode and generate the start condition. - *usci::registers::UCB0CTL1 |= registers::masks::UCTR; + __tx_mode(); __start(); // Wait to be ACKed or NACKed. - while(*usci::registers::UCB0CTL1 & registers::masks::UCTXSTT); + while(__generating_start()); if(*interrupt::registers::IFG2 & usci::registers::masks::UCB0TXIFG) { @@ -62,8 +58,7 @@ namespace mardev::msp430::usci::i2c void write(const uint8_t data) { *usci::registers::UCB0TXBUF = data; - while(!(*interrupt::registers::IFG2 - & usci::registers::masks::UCB0TXIFG)); + while(!__tx_buffer_empty()); return; } diff --git a/src/usci-i2c.h b/src/usci-i2c.h index 93c3ecf..b267ddf 100644 --- a/src/usci-i2c.h +++ b/src/usci-i2c.h @@ -131,35 +131,57 @@ namespace mardev::msp430::usci::i2c */ inline void __stop() { __send_signal(registers::masks::UCTXSTP); } + /** Issue a start condition. + */ inline void __start() { __send_signal(registers::masks::UCTXSTT); } + /** Change to transmitter mode. + */ + inline void __tx_mode() { *usci::registers::UCB0CTL1 |= registers::masks::UCTR; } + + /** Change to receiver mode. + */ + inline void __rx_mode() { *usci::registers::UCB0CTL1 ^= registers::masks::UCTR; } + /** Returns true if the I2C clock signal is held low. */ - inline bool clock_is_low() { return *usci::registers::UCB0STAT & registers::masks::UCSCLLOW; } + inline bool __clock_is_low() { return *usci::registers::UCB0STAT & registers::masks::UCSCLLOW; } /** Returns true if the general call address is received. */ - inline bool general_addr_called() { return *usci::registers::UCB0STAT & registers::masks::UCGC; } + inline bool __general_addr_called() { return *usci::registers::UCB0STAT & registers::masks::UCGC; } /** Returns true if the I2C bus is busy. */ - inline bool is_busy() { return *usci::registers::UCB0STAT & registers::masks::UCBBUSY; } + inline bool __is_busy() { return *usci::registers::UCB0STAT & registers::masks::UCBBUSY; } /** Returns true if a NACK was received. */ - inline bool nack_received() { return *usci::registers::UCB0STAT & registers::masks::UCNACKIFG; } + inline bool __nack_received() { return *usci::registers::UCB0STAT & registers::masks::UCNACKIFG; } /** Returns true if a stop condition was received. */ - inline bool stop_received() { return *usci::registers::UCB0STAT & registers::masks::UCSTPIFG; } + inline bool __stop_received() { return *usci::registers::UCB0STAT & registers::masks::UCSTPIFG; } /** Returns true if a start condition was received. */ - inline bool start_received() { return *usci::registers::UCB0STAT & registers::masks::UCSTTIFG; } + inline bool __start_received() { return *usci::registers::UCB0STAT & registers::masks::UCSTTIFG; } /** Returns true if arbitration process was lost. */ - inline bool arbitration_lost() { return *usci::registers::UCB0STAT & registers::masks::UCALIFG; } + inline bool __arbitration_lost() { return *usci::registers::UCB0STAT & registers::masks::UCALIFG; } + + /** Returns true if the start condition is being generated. + */ + inline bool __generating_start() { return *usci::registers::UCB0CTL1 & registers::masks::UCTXSTT; } + + /** Returns true if the transmission buffer is empty. + */ + inline bool __tx_buffer_empty() { return *interrupt::registers::IFG2 & usci::registers::masks::UCB0TXIFG; } + + /** Returns true if the reception buffer is holding a byte. + */ + inline bool __rx_buffer_full() { return *interrupt::registers::IFG2 & usci::registers::masks::UCB0RXIFG; } /** Start a read from a peripheral. *