From ce7f095ddf225a057c3dcf842df44d1bf6e916b6 Mon Sep 17 00:00:00 2001 From: "C.S.M" Date: Thu, 16 May 2024 14:52:34 +0800 Subject: [PATCH] docs(i2c_master): Add docs for transmit multi buffer in one transaction --- docs/en/api-reference/peripherals/i2c.rst | 36 +++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/docs/en/api-reference/peripherals/i2c.rst b/docs/en/api-reference/peripherals/i2c.rst index 6de33a4ddc..aa194c7c2d 100644 --- a/docs/en/api-reference/peripherals/i2c.rst +++ b/docs/en/api-reference/peripherals/i2c.rst @@ -267,6 +267,42 @@ Simple example for writing data to slave: ESP_ERROR_CHECK(i2c_master_transmit(dev_handle, data_wr, DATA_LENGTH, -1)); + +I2C master write also supports transmit multi buffer in one transaction. Take following transaction as a simple example: + +.. code:: c + + uint8_t control_phase_byte = 0; + size_t control_phase_size = 0; + if (/*condition*/) { + control_phase_byte = 1; + control_phase_size = 1; + } + + uint8_t *cmd_buffer = NULL; + size_t cmd_buffer_size = 0; + if (/*condition*/) { + uint8_t cmds[4] = {BYTESHIFT(lcd_cmd, 3), BYTESHIFT(lcd_cmd, 2), BYTESHIFT(lcd_cmd, 1), BYTESHIFT(lcd_cmd, 0)}; + cmd_buffer = cmds; + cmd_buffer_size = 4; + } + + uint8_t *lcd_buffer = NULL; + size_t lcd_buffer_size = 0; + if (buffer) { + lcd_buffer = (uint8_t*)buffer; + lcd_buffer_size = buffer_size; + } + + i2c_master_transmit_multi_buffer_info_t lcd_i2c_buffer[3] = { + {.write_buffer = &control_phase_byte, .buffer_size = control_phase_size}, + {.write_buffer = cmd_buffer, .buffer_size = cmd_buffer_size}, + {.write_buffer = lcd_buffer, .buffer_size = lcd_buffer_size}, + }; + + i2c_master_multi_buffer_transmit(handle, lcd_i2c_buffer, sizeof(lcd_i2c_buffer) / sizeof(i2c_master_transmit_multi_buffer_info_t), -1); + + I2C Master Read ~~~~~~~~~~~~~~~