Si5351C: Extract I2C code into single transfer function.
This commit is contained in:
@ -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();
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user