summaryrefslogtreecommitdiff
path: root/platforms
diff options
context:
space:
mode:
authorDrashna Jaelre <drashna@live.com>2025-11-11 04:02:35 -0800
committerGitHub <noreply@github.com>2025-11-11 23:02:35 +1100
commit28eeb92f8eec5b8268d2a74ad0561670d14e189a (patch)
tree55e9a33aa1bd678116118da48a103f7ef4365061 /platforms
parentefc5d63383b64291f25c8377bcfae8178dd63302 (diff)
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
Diffstat (limited to 'platforms')
-rw-r--r--platforms/avr/drivers/i2c_master.c26
-rw-r--r--platforms/chibios/drivers/i2c_master.c6
2 files changed, 32 insertions, 0 deletions
diff --git a/platforms/avr/drivers/i2c_master.c b/platforms/avr/drivers/i2c_master.c
index 9136f4a7b9..e5caa995cf 100644
--- a/platforms/avr/drivers/i2c_master.c
+++ b/platforms/avr/drivers/i2c_master.c
@@ -207,6 +207,32 @@ i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16
207 return (status < 0) ? status : I2C_STATUS_SUCCESS; 207 return (status < 0) ? status : I2C_STATUS_SUCCESS;
208} 208}
209 209
210i2c_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) {
211 i2c_status_t status = i2c_start(address | I2C_ACTION_WRITE, timeout);
212
213 for (uint16_t i = 0; i < tx_length && status >= 0; i++) {
214 status = i2c_write(tx_data[i], timeout);
215 }
216
217 for (uint16_t i = 0; i < (rx_length - 1) && status >= 0; i++) {
218 status = i2c_read_ack(timeout);
219 if (status >= 0) {
220 rx_data[i] = status;
221 }
222 }
223
224 if (status >= 0) {
225 status = i2c_read_nack(timeout);
226 if (status >= 0) {
227 rx_data[(rx_length - 1)] = status;
228 }
229 }
230
231 i2c_stop();
232
233 return status;
234}
235
210i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) { 236i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) {
211 i2c_status_t status = i2c_start(devaddr | 0x00, timeout); 237 i2c_status_t status = i2c_start(devaddr | 0x00, timeout);
212 if (status >= 0) { 238 if (status >= 0) {
diff --git a/platforms/chibios/drivers/i2c_master.c b/platforms/chibios/drivers/i2c_master.c
index 20850859b5..a44051b82a 100644
--- a/platforms/chibios/drivers/i2c_master.c
+++ b/platforms/chibios/drivers/i2c_master.c
@@ -160,6 +160,12 @@ i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16
160 return i2c_epilogue(status); 160 return i2c_epilogue(status);
161} 161}
162 162
163i2c_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) {
164 i2cStart(&I2C_DRIVER, &i2cconfig);
165 msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (address >> 1), tx_data, tx_length, rx_data, rx_length, TIME_MS2I(timeout));
166 return i2c_epilogue(status);
167}
168
163i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) { 169i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) {
164 i2cStart(&I2C_DRIVER, &i2cconfig); 170 i2cStart(&I2C_DRIVER, &i2cconfig);
165 171