Skip to content

Commit

Permalink
rewrite i2c_dev_write_read_nonstop
Browse files Browse the repository at this point in the history
  • Loading branch information
dizcza committed Mar 10, 2024
1 parent 344c50a commit e6d757b
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 2 deletions.
12 changes: 10 additions & 2 deletions components/i2cdev/i2cdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -340,12 +340,20 @@ esp_err_t i2c_dev_write_reg(const i2c_dev_t *dev, uint8_t reg, const void *out_d

esp_err_t i2c_dev_write_read_nonstop(const i2c_dev_t *dev,
const void* wbuff, size_t wsize, void* rbuff, size_t rsize) {
if (!dev || !wbuff || !rbuff) return ESP_ERR_INVALID_ARG;
if (!dev || !wbuff || !wsize || !rbuff || !rsize) return ESP_ERR_INVALID_ARG;

SEMAPHORE_TAKE(dev->port);
esp_err_t res;

res = i2c_master_write_read_device(dev->port, dev->addr, wbuff, wsize, rbuff, rsize, pdMS_TO_TICKS(CONFIG_I2CDEV_TIMEOUT));
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, dev->addr << 1 | I2C_MASTER_WRITE, true);
i2c_master_write(cmd, (void *)wbuff, wsize, true);
i2c_master_start(cmd);
i2c_master_write_byte(cmd, dev->addr << 1 | I2C_MASTER_READ, true);
i2c_master_read(cmd, rbuff, rsize, I2C_MASTER_LAST_NACK);
i2c_master_stop(cmd);
res = i2c_master_cmd_begin(dev->port, cmd, pdMS_TO_TICKS(CONFIG_I2CDEV_TIMEOUT));

SEMAPHORE_GIVE(dev->port);
return res;
Expand Down
13 changes: 13 additions & 0 deletions components/i2cdev/i2cdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,19 @@ esp_err_t i2c_dev_read_reg(const i2c_dev_t *dev, uint8_t reg,
esp_err_t i2c_dev_write_reg(const i2c_dev_t *dev, uint8_t reg,
const void *out_data, size_t out_size);


/**
* @brief Perform a write followed by a read to a device on the I2C bus
*
* Wrapper of i2c_master_write_read_device().
*
* @param dev Device descriptor
* @param wbuff Write buffer (const)
* @param wsize Write buffer size
* @param rbuff Read buffer (modifiable)
* @param rsize Read buffer size
* @return ESP_OK on success
*/
esp_err_t i2c_dev_write_read_nonstop(const i2c_dev_t *dev,
const void* wbuff, size_t wsize, void* rbuff, size_t rsize);

Expand Down

0 comments on commit e6d757b

Please sign in to comment.