Add I2C Transmit and Receive function (#25637)

* feat: adds a transmit and receive i2c method

* fix: address the i2c transmit and receive length on u16

* Add AVR/LUFA implementation

Didn't add a progmem version, since that would only apply to receive.
Figured it wasn't worth it, but can add.

* Rearrange order of functions

* Add docs

* Fix doc gen error

* Fix lint issues

* fix more lint issues
This commit is contained in:
Drashna Jaelre
2025-11-11 04:02:35 -08:00
committed by GitHub
parent efc5d63383
commit 28eeb92f8e
4 changed files with 72 additions and 0 deletions
+26
View File
@@ -207,6 +207,32 @@ i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16
return (status < 0) ? status : I2C_STATUS_SUCCESS;
}
i2c_status_t i2c_transmit_and_receive(uint8_t address, const uint8_t* tx_data, uint16_t tx_length, uint8_t* rx_data, uint16_t rx_length, uint16_t timeout) {
i2c_status_t status = i2c_start(address | I2C_ACTION_WRITE, timeout);
for (uint16_t i = 0; i < tx_length && status >= 0; i++) {
status = i2c_write(tx_data[i], timeout);
}
for (uint16_t i = 0; i < (rx_length - 1) && status >= 0; i++) {
status = i2c_read_ack(timeout);
if (status >= 0) {
rx_data[i] = status;
}
}
if (status >= 0) {
status = i2c_read_nack(timeout);
if (status >= 0) {
rx_data[(rx_length - 1)] = status;
}
}
i2c_stop();
return status;
}
i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) {
i2c_status_t status = i2c_start(devaddr | 0x00, timeout);
if (status >= 0) {
+6
View File
@@ -160,6 +160,12 @@ i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16
return i2c_epilogue(status);
}
i2c_status_t i2c_transmit_and_receive(uint8_t address, const uint8_t* tx_data, uint16_t tx_length, uint8_t* rx_data, uint16_t rx_length, uint16_t timeout) {
i2cStart(&I2C_DRIVER, &i2cconfig);
msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (address >> 1), tx_data, tx_length, rx_data, rx_length, TIME_MS2I(timeout));
return i2c_epilogue(status);
}
i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) {
i2cStart(&I2C_DRIVER, &i2cconfig);