void i2c_lpc_transfer(i2c_bus_t* const bus, const uint_fast8_t slave_address, const uint8_t* const data_tx, const size_t count_tx, uint8_t* const data_rx, const size_t count_rx ) { const uint32_t port = (uint32_t)bus->obj; size_t i; bool ack = false; if (data_tx && (count_tx > 0)) { i2c_tx_start(port); i2c_tx_byte(port, (slave_address << 1) | I2C_WRITE); for(i=0; i<count_tx; i++) { i2c_tx_byte(port, data_tx[i]); } } if (data_rx && (count_rx > 0)) { i2c_tx_start(port); i2c_tx_byte(port, (slave_address << 1) | I2C_READ); for(i=0; i<count_rx; i++) { /* ACK each byte except the last */ ack = (i!=count_rx-1); data_rx[i] = i2c_rx_byte(port, ack); } } i2c_stop(port); }
void i2c_lpc_transfer(const uint32_t port, const uint_fast8_t slave_address, const uint8_t* const data_tx, const size_t count_tx, uint8_t* const data_rx, const size_t count_rx ) { i2c_tx_start(port); i2c_tx_byte(port, (slave_address << 1) | I2C_WRITE); for(size_t i=0; i<count_tx; i++) { i2c_tx_byte(port, data_tx[i]); } if( data_rx ) { i2c_tx_start(port); i2c_tx_byte(port, (slave_address << 1) | I2C_READ); for(size_t i=0; i<count_rx; i++) { data_rx[i] = i2c_rx_byte(port); } } i2c_stop(port); }