Si5351C: Extract I2C code into single transfer function.

This commit is contained in:
Jared Boone
2014-11-12 10:45:26 -08:00
parent 35b549816a
commit 080a1ba9ac

View File

@ -28,6 +28,30 @@
/* FIXME return i2c0 status from each function */ /* FIXME return i2c0 status from each function */
static void i2c0_transfer(si5351c_driver_t* const drv,
const uint_fast8_t address,
const uint8_t* const data_tx, const size_t count_tx,
uint8_t* const data_rx, const size_t count_rx
) {
(void)drv;
i2c0_tx_start();
i2c0_tx_byte((address << 1) | I2C_WRITE);
for(size_t i=0; i<count_tx; i++) {
i2c0_tx_byte(data_tx[i]);
}
if( data_rx ) {
i2c0_tx_start();
i2c0_tx_byte((address << 1) | I2C_READ);
for(size_t i=0; i<count_rx; i++) {
data_rx[i] = i2c0_rx_byte();
}
}
i2c0_stop();
}
/* write to single register */ /* write to single register */
void si5351c_write_single(si5351c_driver_t* const drv, uint8_t reg, uint8_t val) void si5351c_write_single(si5351c_driver_t* const drv, uint8_t reg, uint8_t val)
{ {
@ -38,20 +62,10 @@ void si5351c_write_single(si5351c_driver_t* const drv, uint8_t reg, uint8_t val)
/* read single register */ /* read single register */
uint8_t si5351c_read_single(si5351c_driver_t* const drv, uint8_t reg) uint8_t si5351c_read_single(si5351c_driver_t* const drv, uint8_t reg)
{ {
uint8_t val; const uint8_t data_tx[] = { reg };
uint8_t data_rx[] = { 0x00 };
/* set register address with write */ i2c0_transfer(drv, drv->i2c_address, data_tx, 1, data_rx, 1);
i2c0_tx_start(); return data_rx[0];
i2c0_tx_byte((drv->i2c_address << 1) | I2C_WRITE);
i2c0_tx_byte(reg);
/* read the value */
i2c0_tx_start();
i2c0_tx_byte((drv->i2c_address << 1) | I2C_READ);
val = i2c0_rx_byte();
i2c0_stop();
return val;
} }
/* /*
@ -60,12 +74,5 @@ uint8_t si5351c_read_single(si5351c_driver_t* const drv, uint8_t reg)
*/ */
void si5351c_write(si5351c_driver_t* const drv, const uint8_t* const data, const size_t data_count) void si5351c_write(si5351c_driver_t* const drv, const uint8_t* const data, const size_t data_count)
{ {
uint_fast8_t i; i2c0_transfer(drv, drv->i2c_address, data, data_count, NULL, 0);
i2c0_tx_start();
i2c0_tx_byte((drv->i2c_address << 1) | I2C_WRITE);
for (i = 0; i < data_count; i++)
i2c0_tx_byte(data[i]);
i2c0_stop();
} }