diff options
| author | Drashna Jaelre <drashna@live.com> | 2025-11-11 04:02:35 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-11 23:02:35 +1100 |
| commit | 28eeb92f8eec5b8268d2a74ad0561670d14e189a (patch) | |
| tree | 55e9a33aa1bd678116118da48a103f7ef4365061 /platforms | |
| parent | efc5d63383b64291f25c8377bcfae8178dd63302 (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.c | 26 | ||||
| -rw-r--r-- | platforms/chibios/drivers/i2c_master.c | 6 |
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 | ||
| 210 | 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) { | ||
| 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 | |||
| 210 | i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) { | 236 | i2c_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 | ||
| 163 | 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) { | ||
| 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 | |||
| 163 | i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) { | 169 | i2c_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 | ||
