Merge branch 'feature/i2c_support_on_esp8684_esp32h2' into 'master'
i2c: support i2c on esp32c2 and esp32h2 Closes IDF-3918 See merge request espressif/esp-idf!16444
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||
*
|
||||
@@ -318,6 +318,7 @@ struct I2CMasterFix {
|
||||
i2c_port_t port;
|
||||
};
|
||||
|
||||
#if CONFIG_SOC_I2C_SUPPORT_SLAVE
|
||||
struct I2CSlaveFix {
|
||||
I2CSlaveFix(CreateAnd flags, i2c_port_t port_arg = 0, size_t buffer_size = 64) : i2c_conf(), port(port_arg)
|
||||
{
|
||||
@@ -344,6 +345,7 @@ struct I2CSlaveFix {
|
||||
i2c_config_t i2c_conf;
|
||||
i2c_port_t port;
|
||||
};
|
||||
#endif // CONFIG_SOC_I2C_SUPPORT_SLAVE
|
||||
|
||||
struct I2CCmdLinkFix
|
||||
{
|
||||
|
||||
@@ -376,6 +376,7 @@ TEST_CASE("I2CMaster syncronous transfer (read and write)")
|
||||
}
|
||||
}
|
||||
|
||||
#if SOC_I2C_SUPPORT_SLAVE
|
||||
TEST_CASE("I2CSlave parameter configuration fails")
|
||||
{
|
||||
CMockFixture fix;
|
||||
@@ -458,3 +459,4 @@ TEST_CASE("I2CSlave read calls driver functions correctly")
|
||||
CHECK(read_buffer[i] == WRITE_BUFFER[i]);
|
||||
}
|
||||
}
|
||||
#endif // SOC_I2C_SUPPORT_SLAVE
|
||||
|
||||
@@ -155,6 +155,7 @@ vector<uint8_t> I2CMaster::sync_transfer(I2CAddress i2c_addr,
|
||||
return composed_transfer.do_transfer(i2c_num, i2c_addr)[0];
|
||||
}
|
||||
|
||||
#if CONFIG_SOC_I2C_SUPPORT_SLAVE
|
||||
I2CSlave::I2CSlave(I2CNumber i2c_number,
|
||||
SCL_GPIO scl_gpio,
|
||||
SDA_GPIO sda_gpio,
|
||||
@@ -191,6 +192,7 @@ int I2CSlave::read_raw(uint8_t *buffer, size_t buffer_len, chrono::milliseconds
|
||||
{
|
||||
return i2c_slave_read_buffer(i2c_num.get_value(), buffer, buffer_len, (TickType_t) timeout.count() / portTICK_PERIOD_MS);
|
||||
}
|
||||
#endif // CONFIG_SOC_I2C_SUPPORT_SLAVE
|
||||
|
||||
I2CWrite::I2CWrite(const vector<uint8_t> &bytes, chrono::milliseconds driver_timeout)
|
||||
: I2CTransfer<void>(driver_timeout), bytes(bytes)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
@@ -400,6 +400,7 @@ public:
|
||||
size_t read_n_bytes);
|
||||
};
|
||||
|
||||
#if CONFIG_SOC_I2C_SUPPORT_SLAVE
|
||||
/**
|
||||
* @brief Responsible for initialization and de-initialization of an I2C slave peripheral.
|
||||
*/
|
||||
@@ -451,6 +452,7 @@ public:
|
||||
*/
|
||||
virtual int read_raw(uint8_t* buffer, size_t buffer_len, std::chrono::milliseconds timeout);
|
||||
};
|
||||
#endif // CONFIG_SOC_I2C_SUPPORT_SLAVE
|
||||
|
||||
/**
|
||||
* Implementation for simple I2C writes, which can be executed by \c I2CMaster::transfer().
|
||||
|
||||
@@ -54,8 +54,9 @@ struct MasterFixture {
|
||||
vector<uint8_t> data;
|
||||
};
|
||||
|
||||
#if SOC_I2C_SUPPORT_SALVE
|
||||
// TODO The I2C driver tests are disabled, so disable them here, too. Probably due to no runners.
|
||||
#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S2, ESP32S3)
|
||||
#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S2, ESP32S3, ESP8684)
|
||||
|
||||
static void i2c_slave_read_raw_byte(void)
|
||||
{
|
||||
@@ -258,4 +259,5 @@ TEST_CASE_MULTIPLE_DEVICES("I2CMaster Composed transfer", "[cxx i2c][test_env=UT
|
||||
i2c_master_composed_trans, i2c_slave_composed_trans);
|
||||
|
||||
#endif //TEMPORARY_DISABLED_FOR_TARGETS(ESP32S2, ESP32S3)
|
||||
#endif // SOC_I2C_SUPPORT_SALVE
|
||||
#endif // __cpp_exceptions
|
||||
|
||||
@@ -65,14 +65,14 @@ To run this example, you should have one ESP development board (e.g. ESP32-WROVE
|
||||
|
||||
**Note:** It is recommended to add external pull-up resistors for SDA/SCL pins to make the communication more stable, though the driver will enable internal pull-up resistors.
|
||||
|
||||
#### Pin Assignment(esp32c3):
|
||||
#### Pin Assignment(esp32c3, esp32c2, esp32h2):
|
||||
|
||||
**Note:** The following pin assignments are used by default, you can change these in the `menuconfig` .
|
||||
|
||||
| | SDA | SCL |
|
||||
| ------------------------- | ------ | ------ |
|
||||
| ESP32-C3 I2C Master(Slave)| GPIO5 | GPIO6 |
|
||||
| BH1750 Sensor | SDA | SCL |
|
||||
| | SDA | SCL |
|
||||
| ------------------------------------------- | ------ | ------ |
|
||||
| ESP32-C3/ESP32-C2/ESP32-H2 I2C Master(Slave)| GPIO5 | GPIO6 |
|
||||
| BH1750 Sensor | SDA | SCL |
|
||||
|
||||
- master:
|
||||
- GPIO5 is assigned to the data signal of the I2C master port
|
||||
@@ -121,70 +121,70 @@ sensor val: 386.67 [Lux]
|
||||
TASK[0] MASTER READ FROM SLAVE
|
||||
*******************
|
||||
====TASK[0] Slave buffer data ====
|
||||
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
|
||||
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
|
||||
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
|
||||
30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
|
||||
40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
|
||||
50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
|
||||
60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
|
||||
70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f
|
||||
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
|
||||
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
|
||||
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
|
||||
30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
|
||||
40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
|
||||
50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
|
||||
60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
|
||||
70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f
|
||||
|
||||
====TASK[0] Master read ====
|
||||
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
|
||||
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
|
||||
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
|
||||
30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
|
||||
40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
|
||||
50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
|
||||
60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
|
||||
70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f
|
||||
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
|
||||
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
|
||||
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
|
||||
30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
|
||||
40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
|
||||
50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
|
||||
60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
|
||||
70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f
|
||||
|
||||
*******************
|
||||
TASK[1] MASTER READ FROM SLAVE
|
||||
*******************
|
||||
====TASK[1] Slave buffer data ====
|
||||
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
|
||||
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
|
||||
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
|
||||
30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
|
||||
40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
|
||||
50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
|
||||
60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
|
||||
70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f
|
||||
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
|
||||
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
|
||||
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
|
||||
30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
|
||||
40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
|
||||
50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
|
||||
60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
|
||||
70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f
|
||||
|
||||
====TASK[1] Master read ====
|
||||
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
|
||||
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
|
||||
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
|
||||
30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
|
||||
40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
|
||||
50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
|
||||
60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
|
||||
70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f
|
||||
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
|
||||
10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
|
||||
20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
|
||||
30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
|
||||
40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
|
||||
50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
|
||||
60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
|
||||
70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f
|
||||
|
||||
*******************
|
||||
TASK[0] MASTER WRITE TO SLAVE
|
||||
*******************
|
||||
----TASK[0] Master write ----
|
||||
0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19
|
||||
1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29
|
||||
2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39
|
||||
3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49
|
||||
4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59
|
||||
5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69
|
||||
6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79
|
||||
7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89
|
||||
0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19
|
||||
1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29
|
||||
2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39
|
||||
3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49
|
||||
4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59
|
||||
5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69
|
||||
6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79
|
||||
7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89
|
||||
|
||||
----TASK[0] Slave read: [128] bytes ----
|
||||
0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19
|
||||
1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29
|
||||
2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39
|
||||
3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49
|
||||
4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59
|
||||
5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69
|
||||
6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79
|
||||
7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89
|
||||
0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19
|
||||
1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29
|
||||
2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39
|
||||
3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49
|
||||
4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59
|
||||
5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69
|
||||
6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79
|
||||
7a 7b 7c 7d 7e 7f 80 81 82 83 84 85 86 87 88 89
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
@@ -3,7 +3,7 @@ menu "Example Configuration"
|
||||
menu "I2C Master"
|
||||
config I2C_MASTER_SCL
|
||||
int "SCL GPIO Num"
|
||||
default 6 if IDF_TARGET_ESP32C3
|
||||
default 6 if IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
|
||||
default 2 if IDF_TARGET_ESP32S3
|
||||
default 19 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2
|
||||
help
|
||||
@@ -11,7 +11,7 @@ menu "Example Configuration"
|
||||
|
||||
config I2C_MASTER_SDA
|
||||
int "SDA GPIO Num"
|
||||
default 5 if IDF_TARGET_ESP32C3
|
||||
default 5 if IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
|
||||
default 1 if IDF_TARGET_ESP32S3
|
||||
default 18 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2
|
||||
help
|
||||
@@ -20,7 +20,7 @@ menu "Example Configuration"
|
||||
config I2C_MASTER_PORT_NUM
|
||||
int "Port Number"
|
||||
default 1 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3
|
||||
default 0 if IDF_TARGET_ESP32C3
|
||||
default 0 if IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
|
||||
help
|
||||
Port number for I2C Master device.
|
||||
|
||||
@@ -32,6 +32,7 @@ menu "Example Configuration"
|
||||
endmenu
|
||||
|
||||
menu "I2C Slave"
|
||||
depends on SOC_I2C_NUM > 1
|
||||
config I2C_SLAVE_SCL
|
||||
int "SCL GPIO Num"
|
||||
default 5
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||
*/
|
||||
/* i2c - Example
|
||||
|
||||
For other examples please check:
|
||||
@@ -25,11 +30,14 @@ static const char *TAG = "i2c-example";
|
||||
#define RW_TEST_LENGTH 128 /*!< Data length for r/w test, [0,DATA_LENGTH] */
|
||||
#define DELAY_TIME_BETWEEN_ITEMS_MS 1000 /*!< delay time between different test items */
|
||||
|
||||
#define I2C_SLAVE_SCL_IO CONFIG_I2C_SLAVE_SCL /*!< gpio number for i2c slave clock */
|
||||
#define I2C_SLAVE_SDA_IO CONFIG_I2C_SLAVE_SDA /*!< gpio number for i2c slave data */
|
||||
#define I2C_SLAVE_NUM I2C_NUMBER(CONFIG_I2C_SLAVE_PORT_NUM) /*!< I2C port number for slave dev */
|
||||
#define I2C_SLAVE_TX_BUF_LEN (2 * DATA_LENGTH) /*!< I2C slave tx buffer size */
|
||||
#define I2C_SLAVE_RX_BUF_LEN (2 * DATA_LENGTH) /*!< I2C slave rx buffer size */
|
||||
#if SOC_I2C_NUM > 1
|
||||
#define I2C_SLAVE_SCL_IO CONFIG_I2C_SLAVE_SCL /*!< gpio number for i2c slave clock */
|
||||
#define I2C_SLAVE_SDA_IO CONFIG_I2C_SLAVE_SDA /*!< gpio number for i2c slave data */
|
||||
#define I2C_SLAVE_NUM I2C_NUMBER(CONFIG_I2C_SLAVE_PORT_NUM) /*!< I2C port number for slave dev */
|
||||
#define I2C_SLAVE_TX_BUF_LEN (2 * DATA_LENGTH) /*!< I2C slave tx buffer size */
|
||||
#define I2C_SLAVE_RX_BUF_LEN (2 * DATA_LENGTH) /*!< I2C slave rx buffer size */
|
||||
#define ESP_SLAVE_ADDR CONFIG_I2C_SLAVE_ADDRESS /*!< ESP32 slave address, you can set any 7bit value */
|
||||
#endif
|
||||
|
||||
#define I2C_MASTER_SCL_IO CONFIG_I2C_MASTER_SCL /*!< gpio number for I2C master clock */
|
||||
#define I2C_MASTER_SDA_IO CONFIG_I2C_MASTER_SDA /*!< gpio number for I2C master data */
|
||||
@@ -40,7 +48,6 @@ static const char *TAG = "i2c-example";
|
||||
|
||||
#define BH1750_SENSOR_ADDR CONFIG_BH1750_ADDR /*!< slave address for BH1750 sensor */
|
||||
#define BH1750_CMD_START CONFIG_BH1750_OPMODE /*!< Operation mode */
|
||||
#define ESP_SLAVE_ADDR CONFIG_I2C_SLAVE_ADDRESS /*!< ESP32 slave address, you can set any 7bit value */
|
||||
#define WRITE_BIT I2C_MASTER_WRITE /*!< I2C master write */
|
||||
#define READ_BIT I2C_MASTER_READ /*!< I2C master read */
|
||||
#define ACK_CHECK_EN 0x1 /*!< I2C master will check ack from slave*/
|
||||
@@ -50,6 +57,7 @@ static const char *TAG = "i2c-example";
|
||||
|
||||
SemaphoreHandle_t print_mux = NULL;
|
||||
|
||||
#if SOC_I2C_NUM > 1
|
||||
/**
|
||||
* @brief test code to read esp-i2c-slave
|
||||
* We need to fill the buffer of esp slave device, then master can read them out.
|
||||
@@ -101,6 +109,7 @@ static esp_err_t __attribute__((unused)) i2c_master_write_slave(i2c_port_t i2c_n
|
||||
i2c_cmd_link_delete(cmd);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief test code to operate on BH1750 sensor
|
||||
@@ -162,7 +171,7 @@ static esp_err_t i2c_master_init(void)
|
||||
return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
|
||||
}
|
||||
|
||||
#if !CONFIG_IDF_TARGET_ESP32C3
|
||||
#if SOC_I2C_NUM > 1
|
||||
/**
|
||||
* @brief i2c slave initialization
|
||||
*/
|
||||
@@ -205,7 +214,7 @@ static void i2c_test_task(void *arg)
|
||||
{
|
||||
int ret;
|
||||
uint32_t task_idx = (uint32_t)arg;
|
||||
#if !CONFIG_IDF_TARGET_ESP32C3
|
||||
#if SOC_I2C_NUM > 1
|
||||
int i = 0;
|
||||
uint8_t *data = (uint8_t *)malloc(DATA_LENGTH);
|
||||
uint8_t *data_wr = (uint8_t *)malloc(DATA_LENGTH);
|
||||
@@ -232,7 +241,7 @@ static void i2c_test_task(void *arg)
|
||||
xSemaphoreGive(print_mux);
|
||||
vTaskDelay((DELAY_TIME_BETWEEN_ITEMS_MS * (task_idx + 1)) / portTICK_PERIOD_MS);
|
||||
//---------------------------------------------------
|
||||
#if !CONFIG_IDF_TARGET_ESP32C3
|
||||
#if SOC_I2C_NUM > 1
|
||||
for (i = 0; i < DATA_LENGTH; i++) {
|
||||
data[i] = i;
|
||||
}
|
||||
@@ -297,7 +306,7 @@ static void i2c_test_task(void *arg)
|
||||
void app_main(void)
|
||||
{
|
||||
print_mux = xSemaphoreCreateMutex();
|
||||
#if !CONFIG_IDF_TARGET_ESP32C3
|
||||
#if SOC_I2C_NUM > 1
|
||||
ESP_ERROR_CHECK(i2c_slave_init());
|
||||
#endif
|
||||
ESP_ERROR_CHECK(i2c_master_init());
|
||||
|
||||
@@ -2,14 +2,14 @@ menu "Example Configuration"
|
||||
|
||||
config I2C_MASTER_SCL
|
||||
int "SCL GPIO Num"
|
||||
default 6 if IDF_TARGET_ESP32C3
|
||||
default 6 if IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
|
||||
default 19 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3
|
||||
help
|
||||
GPIO number for I2C Master clock line.
|
||||
|
||||
config I2C_MASTER_SDA
|
||||
int "SDA GPIO Num"
|
||||
default 5 if IDF_TARGET_ESP32C3
|
||||
default 5 if IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
|
||||
default 18 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3
|
||||
help
|
||||
GPIO number for I2C Master data line.
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
[I2C Tools](https://i2c.wiki.kernel.org/index.php/I2C_Tools) is a simple but very useful tool for developing I2C related applications, which is also famous in Linux platform. This example just implements some of basic features of [I2C Tools](https://i2c.wiki.kernel.org/index.php/I2C_Tools) based on [esp32 console component](https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/console.html). As follows, this example supports five command-line tools:
|
||||
|
||||
1. `i2cconfig`: It will configure the I2C bus with specific GPIO number, port number and frequency.
|
||||
2. `i2cdetect`: It will scan an I2C bus for devices and output a table with the list of detected devices on the bus.
|
||||
2. `i2cdetect`: It will scan an I2C bus for devices and output a table with the list of detected devices on the bus.
|
||||
3. `i2cget`: It will read registers visible through the I2C bus.
|
||||
4. `i2cset`: It will set registers visible through the I2C bus.
|
||||
5. `i2cdump`: It will examine registers visible through the I2C bus.
|
||||
@@ -30,6 +30,8 @@ To run this example, you should have any ESP32, ESP32-S and ESP32-C based develo
|
||||
| ESP32-S2 I2C Master | GPIO18 | GPIO19 | GND | GND | 3.3V |
|
||||
| ESP32-S3 I2C Master | GPIO1 | GPIO2 | GND | GND | 3.3V |
|
||||
| ESP32-C3 I2C Master | GPIO5 | GPIO6 | GND | GND | 3.3V |
|
||||
| ESP32-C2 I2C Master | GPIO5 | GPIO6 | GND | GND | 3.3V |
|
||||
| ESP32-H2 I2C Master | GPIO5 | GPIO6 | GND | GND | 3.3V |
|
||||
| Sensor | SDA | SCL | GND | WAK | VCC |
|
||||
|
||||
**Note: ** There’s no need to add an external pull-up resistors for SDA/SCL pin, because the driver will enable the internal pull-up resistors itself.
|
||||
@@ -66,7 +68,7 @@ See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/l
|
||||
==============================================================
|
||||
|
||||
i2c-tools> help
|
||||
help
|
||||
help
|
||||
Print the list of registered commands
|
||||
|
||||
i2cconfig [--port=<0|1>] [--freq=<Hz>] --sda=<gpio> --scl=<gpio>
|
||||
@@ -76,7 +78,7 @@ i2cconfig [--port=<0|1>] [--freq=<Hz>] --sda=<gpio> --scl=<gpio>
|
||||
--sda=<gpio> Set the gpio for I2C SDA
|
||||
--scl=<gpio> Set the gpio for I2C SCL
|
||||
|
||||
i2cdetect
|
||||
i2cdetect
|
||||
Scan I2C bus for devices
|
||||
|
||||
i2cget -c <chip_addr> [-r <register_addr>] [-l <length>]
|
||||
@@ -96,17 +98,17 @@ i2cdump -c <chip_addr> [-s <size>]
|
||||
-c, --chip=<chip_addr> Specify the address of the chip on that bus
|
||||
-s, --size=<size> Specify the size of each read
|
||||
|
||||
free
|
||||
free
|
||||
Get the current size of free heap memory
|
||||
|
||||
heap
|
||||
heap
|
||||
Get minimum size of free heap memory that was available during program execu
|
||||
tion
|
||||
|
||||
version
|
||||
version
|
||||
Get version of chip and SDK
|
||||
|
||||
restart
|
||||
restart
|
||||
Software reset of the chip
|
||||
|
||||
deep_sleep [-t <t>] [--io=<n>] [--io_level=<0|1>]
|
||||
@@ -124,7 +126,7 @@ light_sleep [-t <t>] [--io=<n>]... [--io_level=<0|1>]...
|
||||
--io=<n> If specified, wakeup using GPIO with given number
|
||||
--io_level=<0|1> GPIO level to trigger wakeup
|
||||
|
||||
tasks
|
||||
tasks
|
||||
Get information about running tasks
|
||||
```
|
||||
|
||||
@@ -143,14 +145,14 @@ esp32> i2cconfig --port=0 --sda=18 --scl=19 --freq=100000
|
||||
```bash
|
||||
esp32> i2cdetect
|
||||
0 1 2 3 4 5 6 7 8 9 a b c d e f
|
||||
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
50: -- -- -- -- -- -- -- -- -- -- -- 5b -- -- -- --
|
||||
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
50: -- -- -- -- -- -- -- -- -- -- -- 5b -- -- -- --
|
||||
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
||||
```
|
||||
|
||||
* Here we found the address of CCS811 is 0x5b.
|
||||
@@ -159,7 +161,7 @@ esp32> i2cdetect
|
||||
|
||||
```bash
|
||||
esp32> i2cget -c 0x5b -r 0x00 -l 1
|
||||
0x10
|
||||
0x10
|
||||
```
|
||||
|
||||
* `-c` option to specify the address of I2C device (acquired from `i2cdetect` command).
|
||||
@@ -175,7 +177,7 @@ I (734717) cmd_i2ctools: Write OK
|
||||
esp32> i2cset -c 0x5b -r 0x01 0x10
|
||||
I (1072047) cmd_i2ctools: Write OK
|
||||
esp32> i2cget -c 0x5b -r 0x00 -l 1
|
||||
0x98
|
||||
0x98
|
||||
```
|
||||
|
||||
* Here we change the mode from boot to application and set a proper measure mode (by writing 0x10 to register 0x01)
|
||||
@@ -185,7 +187,7 @@ esp32> i2cget -c 0x5b -r 0x00 -l 1
|
||||
|
||||
```bash
|
||||
esp32> i2cget -c 0x5b -r 0x02 -l 8
|
||||
0x01 0xb0 0x00 0x04 0x98 0x00 0x19 0x8f
|
||||
0x01 0xb0 0x00 0x04 0x98 0x00 0x19 0x8f
|
||||
```
|
||||
|
||||
* The register 0x02 will output 8 bytes result, mainly including value of eCO~2~、TVOC and there raw value. So the value of eCO~2~ is 0x01b0 ppm and value of TVOC is 0x04 ppb.
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||
*/
|
||||
/* cmd_i2ctools.c
|
||||
|
||||
This example code is in the Public Domain (or CC0 licensed, at your option.)
|
||||
@@ -26,7 +31,7 @@ static const char *TAG = "cmd_i2ctools";
|
||||
#if CONFIG_IDF_TARGET_ESP32S3
|
||||
static gpio_num_t i2c_gpio_sda = 1;
|
||||
static gpio_num_t i2c_gpio_scl = 2;
|
||||
#elif CONFIG_IDF_TARGET_ESP32C3
|
||||
#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP8684
|
||||
static gpio_num_t i2c_gpio_sda = 5;
|
||||
static gpio_num_t i2c_gpio_scl = 6;
|
||||
#else
|
||||
|
||||
@@ -3,4 +3,4 @@
|
||||
nvs, data, nvs, 0x9000, 0x6000,
|
||||
phy_init, data, phy, 0xf000, 0x1000,
|
||||
factory, app, factory, 0x10000, 1M,
|
||||
storage, data, fat, , 1M,
|
||||
storage, data, fat, , 0x80000,
|
||||
|
||||
|
@@ -14,4 +14,4 @@ CONFIG_PARTITION_TABLE_FILENAME="partitions_example.csv"
|
||||
CONFIG_FREERTOS_USE_TRACE_FACILITY=y
|
||||
CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y
|
||||
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y
|
||||
|
||||
Reference in New Issue
Block a user