Add word register read/write commands to I2C driver

parent e0c0b48b
// © 2020 - 2022 Raptor Engineering, LLC
// © 2020 - 2023 Raptor Engineering, LLC
//
// Released under the terms of the LGPL v3+
// See the LICENSE file for full details
......@@ -257,6 +257,32 @@ uint8_t i2c_read_register_byte(uint8_t *base_address, uint8_t slave_address, uin
return retval;
}
uint16_t i2c_read_register_word(uint8_t *base_address, uint8_t slave_address, uint8_t slave_register, int *error)
{
uint16_t retval = 0xffff;
uint8_t byte[2];
if (error)
{
*error = -1;
}
if (!write_i2c_data(base_address, slave_address, &slave_register, 1, 0))
{
if (!read_i2c_data(base_address, slave_address, &byte, NULL, 2, 1))
{
retval = byte[0] << 8;
retval |= byte[1];
if (error)
{
*error = 0;
}
}
}
return retval;
}
int i2c_write_register_byte(uint8_t *base_address, uint8_t slave_address, uint8_t slave_register, uint8_t data)
{
uint8_t tx_data[2];
......@@ -271,4 +297,21 @@ int i2c_write_register_byte(uint8_t *base_address, uint8_t slave_address, uint8_
}
return 1;
}
\ No newline at end of file
}
int i2c_write_register_word(uint8_t *base_address, uint8_t slave_address, uint8_t slave_register, uint16_t data)
{
uint8_t tx_data[3];
// Assemble TX data structure
tx_data[0] = slave_register;
tx_data[1] = (data >> 16) & 0xff;
tx_data[2] = data & 0xff;
if (!write_i2c_data(base_address, slave_address, tx_data, 3, 1))
{
return 0;
}
return 1;
}
// © 2020 - 2022 Raptor Engineering, LLC
// © 2020 - 2023 Raptor Engineering, LLC
//
// Released under the terms of the LGPL v3+
// See the LICENSE file for full details
......@@ -70,6 +70,8 @@ int initialize_i2c_master(uint8_t *base_address, int i2c_bus_frequency);
int write_i2c_data(uint8_t *base_address, uint8_t slave_address, uint8_t *data, int data_length, uint8_t send_stop_signal);
int read_i2c_data(uint8_t *base_address, uint8_t slave_address, uint8_t *data, int *data_length, int max_data_length, uint8_t send_stop_signal);
uint8_t i2c_read_register_byte(uint8_t *base_address, uint8_t slave_address, uint8_t slave_register, int *error);
uint16_t i2c_read_register_word(uint8_t *base_address, uint8_t slave_address, uint8_t slave_register, int *error);
int i2c_write_register_byte(uint8_t *base_address, uint8_t slave_address, uint8_t slave_register, uint8_t data);
int i2c_write_register_word(uint8_t *base_address, uint8_t slave_address, uint8_t slave_register, uint16_t data);
#endif // _OPENCORES_I2C_H
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment