Skip to content

Commit

Permalink
Use inline functions to make others readable
Browse files Browse the repository at this point in the history
  • Loading branch information
mdclyburn committed Aug 5, 2020
1 parent a79f0e5 commit 08d7686
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 24 deletions.
29 changes: 12 additions & 17 deletions src/usci-i2c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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;
}
Expand Down
36 changes: 29 additions & 7 deletions src/usci-i2c.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down

0 comments on commit 08d7686

Please sign in to comment.