mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-03 20:54:32 +02:00
i2c: support esp32h2
This commit is contained in:
@@ -687,7 +687,7 @@ esp_err_t i2c_param_config(i2c_port_t i2c_num, const i2c_config_t *i2c_conf)
|
||||
}
|
||||
#if SOC_I2C_SUPPORT_SLAVE
|
||||
else {
|
||||
#if CONFIG_IDF_TARGET_ESP32S2
|
||||
#if SOC_I2C_SUPPORT_REF_TICK
|
||||
/* On ESP32-S2, APB clock shall always be used in slave mode as the
|
||||
* other one, I2C_SCLK_REF_TICK, is too slow, even for sampling a
|
||||
* 100KHz SCL. */
|
||||
|
@@ -91,9 +91,10 @@ typedef void *i2c_cmd_handle_t; /*!< I2C command handle */
|
||||
|
||||
/**
|
||||
* @brief Install an I2C driver
|
||||
* @note Not all Espressif chips can support slave mode (e.g. ESP32C2)
|
||||
*
|
||||
* @param i2c_num I2C port number
|
||||
* @param mode I2C mode (either master or slave). ESP8684 doesn't support i2c slave mode
|
||||
* @param mode I2C mode (either master or slave).
|
||||
* @param slv_rx_buf_len Receiving buffer size. Only slave mode will use this value, it is ignored in master mode.
|
||||
* @param slv_tx_buf_len Sending buffer size. Only slave mode will use this value, it is ignored in master mode.
|
||||
* @param intr_alloc_flags Flags used to allocate the interrupt. One or multiple (ORred) ESP_INTR_FLAG_* values.
|
||||
|
@@ -25,6 +25,7 @@
|
||||
#include "hal/gpio_hal.h"
|
||||
#include "hal/uart_ll.h"
|
||||
|
||||
#if SOC_I2C_SUPPORT_SLAVE // i2c test can't work without slave
|
||||
|
||||
#define DATA_LENGTH 512 /*!<Data buffer length for test buffer*/
|
||||
#define RW_TEST_LENGTH 129 /*!<Data length for r/w test, any value from 0-DATA_LENGTH*/
|
||||
@@ -723,3 +724,5 @@ TEST_CASE("I2C SCL freq test (local test)", "[i2c][ignore]")
|
||||
}
|
||||
|
||||
#endif // TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3, ESP32C3)
|
||||
|
||||
#endif // SOC_I2C_SUPPORT_SLAVE
|
||||
|
@@ -266,7 +266,7 @@ TEST_CASE("test slave send unaligned","[spi]")
|
||||
/********************************************************************************
|
||||
* Test By Master & Slave (2 boards)
|
||||
*
|
||||
* Master (C3, 8684, H2) && Slave (C3, 8684, H2):
|
||||
* Master (C3, C2, H2) && Slave (C3, C2, H2):
|
||||
* PIN | Master | Slave |
|
||||
* ----| --------- | --------- |
|
||||
* CS | 10 | 10 |
|
||||
|
@@ -605,7 +605,7 @@ TEST_CASE("test spi slave hd segment mode, master too long", "[spi][spi_slv_hd]"
|
||||
/********************************************************************************
|
||||
* Test By Master & Slave (2 boards)
|
||||
*
|
||||
* Master (C3, 8684, H2) && Slave (C3, 8684, H2):
|
||||
* Master (C3, C2, H2) && Slave (C3, C2, H2):
|
||||
* PIN | Master | Slave |
|
||||
* ----| --------- | --------- |
|
||||
* CS | 10 | 10 |
|
||||
|
@@ -26,7 +26,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//NOTE: These macros are changed on 8684 for build. MODIFY these when bringup flash.
|
||||
//NOTE: These macros are changed on ESP32-C2 for build. MODIFY these when bringup flash.
|
||||
#define gpspi_flash_ll_get_hw(host_id) ( ((host_id)==SPI2_HOST) ? &GPSPI2 : ({abort();(spi_dev_t*)0;}) )
|
||||
#define gpspi_flash_ll_hw_get_id(dev) ( ((dev) == (void*)&GPSPI2) ? SPI2_HOST : -1 )
|
||||
|
||||
|
@@ -726,7 +726,7 @@ static inline void i2c_ll_set_source_clk(i2c_dev_t *hw, i2c_sclk_t src_clk)
|
||||
// rtc_clk needs to switch on.
|
||||
if (src_clk == I2C_SCLK_RTC) {
|
||||
SET_PERI_REG_MASK(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_DIG_CLK8M_EN_M);
|
||||
esp_rom_delay_us(DELAY_RTC_CLK_SWITCH);
|
||||
esp_rom_delay_us(DELAY_RTC_CLK_SWITCH); // TODO: IDF-4535
|
||||
}
|
||||
// src_clk : (1) for RTC_CLK, (0) for XTAL
|
||||
hw->clk_conf.sclk_sel = (src_clk == I2C_SCLK_RTC) ? 1 : 0;
|
||||
|
@@ -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
|
||||
*/
|
||||
@@ -87,7 +87,7 @@ typedef struct {
|
||||
// I2C slave RX interrupt bitmap
|
||||
#define I2C_LL_SLAVE_RX_INT (I2C_RXFIFO_WM_INT_ENA_M | I2C_TRANS_COMPLETE_INT_ENA_M)
|
||||
// I2C source clock
|
||||
#define I2C_LL_CLK_SRC_FREQ(src_clk) (((src_clk) == I2C_SCLK_RTC) ? 20*1000*1000 : 40*1000*1000); // Another clock is XTAL clock
|
||||
#define I2C_LL_CLK_SRC_FREQ(src_clk) (((src_clk) == I2C_SCLK_RTC) ? 8*1000*1000 : 32*1000*1000); // Another clock is XTAL clock
|
||||
// delay time after rtc_clk swiching on
|
||||
#define DELAY_RTC_CLK_SWITCH (5)
|
||||
// I2C max timeout value
|
||||
|
@@ -1,16 +1,8 @@
|
||||
// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
// The HAL layer for RTC CNTL (common part)
|
||||
|
||||
@@ -18,6 +10,7 @@
|
||||
#include "soc/lldesc.h"
|
||||
#include "hal/rtc_hal.h"
|
||||
#include "hal/assert.h"
|
||||
#include "esp_attr.h"
|
||||
|
||||
#define RTC_CNTL_HAL_LINK_BUF_SIZE_MIN (SOC_RTC_CNTL_CPU_PD_DMA_BLOCK_SIZE) /* The minimum size of dma link buffer */
|
||||
|
||||
@@ -44,6 +37,7 @@ void * rtc_cntl_hal_dma_link_init(void *elem, void *buff, int size, void *next)
|
||||
return (void *)plink;
|
||||
}
|
||||
|
||||
#if SOC_PM_SUPPORT_CPU_PD
|
||||
void rtc_cntl_hal_enable_cpu_retention(void *addr)
|
||||
{
|
||||
if (addr) {
|
||||
@@ -59,3 +53,16 @@ void rtc_cntl_hal_enable_cpu_retention(void *addr)
|
||||
rtc_cntl_ll_enable_cpu_retention((uint32_t)addr);
|
||||
}
|
||||
}
|
||||
|
||||
void IRAM_ATTR rtc_cntl_hal_disable_cpu_retention(void *addr)
|
||||
{
|
||||
rtc_cntl_sleep_retent_t *retent = (rtc_cntl_sleep_retent_t *)addr;
|
||||
|
||||
if (addr) {
|
||||
if (retent->cpu_pd_mem) {
|
||||
rtc_cntl_ll_disable_cpu_retention();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // SOC_PM_SUPPORT_CPU_PD
|
||||
|
@@ -19,7 +19,7 @@ void spi_flash_hal_setup_auto_resume_mode(spi_flash_host_inst_t *host);
|
||||
|
||||
// HAL for
|
||||
// - MEMSPI
|
||||
// - SPI1~3 on ESP32/S2/S3/C3/H2/8684
|
||||
// - SPI1~3 on ESP32/S2/S3/C3/H2/C2
|
||||
// The common part is in spi_flash_hal_common.inc
|
||||
|
||||
void spi_flash_hal_erase_chip(spi_flash_host_inst_t *host)
|
||||
|
@@ -887,7 +887,6 @@ typedef struct {
|
||||
} i2c_dev_t;
|
||||
|
||||
extern i2c_dev_t I2C0;
|
||||
extern i2c_dev_t I2C1;
|
||||
|
||||
#ifndef __cplusplus
|
||||
_Static_assert(sizeof(i2c_dev_t) == 0x184, "Invalid size of i2c_dev_t structure");
|
||||
|
@@ -47,34 +47,6 @@ config SOC_GPIO_SUPPORT_SLP_SWITCH
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_I2C_NUM
|
||||
int
|
||||
default 2
|
||||
|
||||
config SOC_I2C_FIFO_LEN
|
||||
int
|
||||
default 32
|
||||
|
||||
config SOC_I2C_SUPPORT_SLAVE
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_I2C_SUPPORT_HW_FSM_RST
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_I2C_SUPPORT_HW_CLR_BUS
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_I2C_SUPPORT_XTAL
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_I2C_SUPPORT_RTC
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_LEDC_SUPPORT_XTAL_CLOCK
|
||||
bool
|
||||
default y
|
||||
@@ -383,6 +355,10 @@ config SOC_I2C_FIFO_LEN
|
||||
int
|
||||
default 32
|
||||
|
||||
config SOC_I2C_SUPPORT_SLAVE
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_I2C_SUPPORT_HW_FSM_RST
|
||||
bool
|
||||
default y
|
||||
|
@@ -128,6 +128,7 @@
|
||||
#define SOC_I2C_NUM (2)
|
||||
|
||||
#define SOC_I2C_FIFO_LEN (32) /*!< I2C hardware FIFO depth */
|
||||
#define SOC_I2C_SUPPORT_SLAVE (1)
|
||||
|
||||
//ESP32-S3 support hardware FSM reset
|
||||
#define SOC_I2C_SUPPORT_HW_FSM_RST (1)
|
||||
|
@@ -3,7 +3,7 @@ Inter-Integrated Circuit (I2C)
|
||||
|
||||
:link_to_translation:`zh_CN:[中文]`
|
||||
|
||||
{IDF_TARGET_I2C_NUM:default="2", esp32c3="1", esp32h2="1", esp328684="1"}
|
||||
{IDF_TARGET_I2C_NUM:default="2", esp32c3="1", esp32h2="1", esp32c2="1"}
|
||||
|
||||
Overview
|
||||
--------
|
||||
@@ -20,21 +20,30 @@ Driver Features
|
||||
I2C driver governs communications of devices over the I2C bus. The driver supports the following features:
|
||||
|
||||
- Reading and writing bytes in Master mode
|
||||
- Slave mode
|
||||
|
||||
.. only:: SOC_I2C_SUPPORT_SLAVE
|
||||
|
||||
- Slave mode
|
||||
|
||||
- Reading and writing to registers which are in turn read/written by the master
|
||||
|
||||
|
||||
Driver Usage
|
||||
------------
|
||||
|
||||
{IDF_TARGET_I2C_ROLE:default="master or slave", esp32c2="master"}
|
||||
|
||||
The following sections describe typical steps of configuring and operating the I2C driver:
|
||||
|
||||
1. :ref:`i2c-api-configure-driver` - set the initialization parameters (master or slave mode, GPIO pins for SDA and SCL, clock speed, etc.)
|
||||
2. :ref:`i2c-api-install-driver`- activate the driver on one of the two I2C controllers as a master or slave
|
||||
3. Depending on whether you configure the driver for a master or slave, choose the appropriate item
|
||||
1. :ref:`i2c-api-configure-driver` - set the initialization parameters ({IDF_TARGET_I2C_ROLE} mode, GPIO pins for SDA and SCL, clock speed, etc.)
|
||||
2. :ref:`i2c-api-install-driver`- activate the driver on one of the two I2C controllers as a {IDF_TARGET_I2C_ROLE}
|
||||
3. Depending on whether you configure the driver for a {IDF_TARGET_I2C_ROLE}, choose the appropriate item
|
||||
|
||||
a) :ref:`i2c-api-master-mode` - handle communications (master)
|
||||
b) :ref:`i2c-api-slave-mode` - respond to messages from the master (slave)
|
||||
a) :ref:`i2c-api-master-mode` - handle communications (master)
|
||||
|
||||
.. only:: SOC_I2C_SUPPORT_SLAVE
|
||||
|
||||
b) :ref:`i2c-api-slave-mode` - respond to messages from the master (slave)
|
||||
|
||||
4. :ref:`i2c-api-interrupt-handling` - configure and service I2C interrupts
|
||||
5. :ref:`i2c-api-customized-configuration` - adjust default I2C communication parameters (timings, bit order, etc.)
|
||||
@@ -49,17 +58,20 @@ Configuration
|
||||
|
||||
To establish I2C communication, start by configuring the driver. This is done by setting the parameters of the structure :cpp:type:`i2c_config_t`:
|
||||
|
||||
- Set I2C **mode of operation** - slave or master from :cpp:type:`i2c_mode_t`
|
||||
- Set I2C **mode of operation** - {IDF_TARGET_I2C_ROLE} from :cpp:type:`i2c_mode_t`
|
||||
- Configure **communication pins**
|
||||
|
||||
- Assign GPIO pins for SDA and SCL signals
|
||||
- Set whether to enable {IDF_TARGET_NAME}'s internal pull-ups
|
||||
|
||||
- (Master only) Set I2C **clock speed**
|
||||
- (Slave only) Configure the following
|
||||
|
||||
* Whether to enable **10 bit address mode**
|
||||
* Define **slave address**
|
||||
.. only:: SOC_I2C_SUPPORT_SLAVE
|
||||
|
||||
- (Slave only) Configure the following
|
||||
|
||||
* Whether to enable **10 bit address mode**
|
||||
* Define **slave address**
|
||||
|
||||
After that, initialize the configuration for a given I2C port. For this, call the function :cpp:func:`i2c_param_config` and pass to it the port number and the structure :cpp:type:`i2c_config_t`.
|
||||
|
||||
@@ -78,20 +90,22 @@ Configuration example (master):
|
||||
// .clk_flags = 0, /*!< Optional, you can use I2C_SCLK_SRC_FLAG_* flags to choose i2c source clock here. */
|
||||
};
|
||||
|
||||
Configuration example (slave):
|
||||
.. only:: SOC_I2C_SUPPORT_SLAVE
|
||||
|
||||
.. code-block:: c
|
||||
Configuration example (slave):
|
||||
|
||||
int i2c_slave_port = I2C_SLAVE_NUM;
|
||||
i2c_config_t conf_slave = {
|
||||
.sda_io_num = I2C_SLAVE_SDA_IO, // select GPIO specific to your project
|
||||
.sda_pullup_en = GPIO_PULLUP_ENABLE,
|
||||
.scl_io_num = I2C_SLAVE_SCL_IO, // select GPIO specific to your project
|
||||
.scl_pullup_en = GPIO_PULLUP_ENABLE,
|
||||
.mode = I2C_MODE_SLAVE,
|
||||
.slave.addr_10bit_en = 0,
|
||||
.slave.slave_addr = ESP_SLAVE_ADDR, // address of your project
|
||||
};
|
||||
.. code-block:: c
|
||||
|
||||
int i2c_slave_port = I2C_SLAVE_NUM;
|
||||
i2c_config_t conf_slave = {
|
||||
.sda_io_num = I2C_SLAVE_SDA_IO, // select GPIO specific to your project
|
||||
.sda_pullup_en = GPIO_PULLUP_ENABLE,
|
||||
.scl_io_num = I2C_SLAVE_SCL_IO, // select GPIO specific to your project
|
||||
.scl_pullup_en = GPIO_PULLUP_ENABLE,
|
||||
.mode = I2C_MODE_SLAVE,
|
||||
.slave.addr_10bit_en = 0,
|
||||
.slave.slave_addr = ESP_SLAVE_ADDR, // address of your project
|
||||
};
|
||||
|
||||
At this stage, :cpp:func:`i2c_param_config` also sets a few other I2C configuration parameters to default values that are defined by the I2C specification. For more details on the values and how to modify them, see :ref:`i2c-api-customized-configuration`.
|
||||
|
||||
@@ -200,8 +214,12 @@ Install Driver
|
||||
After the I2C driver is configured, install it by calling the function :cpp:func:`i2c_driver_install` with the following parameters:
|
||||
|
||||
- Port number, one of the two port numbers from :cpp:type:`i2c_port_t`
|
||||
- Master or slave, selected from :cpp:type:`i2c_mode_t`
|
||||
- (Slave only) Size of buffers to allocate for sending and receiving data. As I2C is a master-centric bus, data can only go from the slave to the master at the master's request. Therefore, the slave will usually have a send buffer where the slave application writes data. The data remains in the send buffer to be read by the master at the master's own discretion.
|
||||
- {IDF_TARGET_I2C_ROLE}, selected from :cpp:type:`i2c_mode_t`
|
||||
|
||||
.. only:: SOC_I2C_SUPPORT_SLAVE
|
||||
|
||||
- (Slave only) Size of buffers to allocate for sending and receiving data. As I2C is a master-centric bus, data can only go from the slave to the master at the master's request. Therefore, the slave will usually have a send buffer where the slave application writes data. The data remains in the send buffer to be read by the master at the master's own discretion.
|
||||
|
||||
- Flags for allocating the interrupt (see ESP_INTR_FLAG_* values in :component_file:`esp_hw_support/include/esp_intr_alloc.h`)
|
||||
|
||||
.. _i2c-api-master-mode:
|
||||
@@ -278,27 +296,32 @@ Likewise, the command link to read from the slave looks as follows:
|
||||
i2c_master_write_byte(cmd, (ESP_SLAVE_ADDR << 1) | I2C_MASTER_READ, ACK_EN);
|
||||
|
||||
|
||||
.. _i2c-api-slave-mode:
|
||||
.. only:: SOC_I2C_SUPPORT_SLAVE
|
||||
|
||||
Communication as Slave
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
.. _i2c-api-slave-mode:
|
||||
|
||||
After installing the I2C driver, {IDF_TARGET_NAME} is ready to communicate with other I2C devices.
|
||||
Communication as Slave
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The API provides the following functions for slaves
|
||||
After installing the I2C driver, {IDF_TARGET_NAME} is ready to communicate with other I2C devices.
|
||||
|
||||
- :cpp:func:`i2c_slave_read_buffer`
|
||||
The API provides the following functions for slaves
|
||||
|
||||
Whenever the master writes data to the slave, the slave will automatically store it in the receive buffer. This allows the slave application to call the function :cpp:func:`i2c_slave_read_buffer` at its own discretion. This function also has a parameter to specify block time if no data is in the receive buffer. This will allow the slave application to wait with a specified timeout for data to arrive to the buffer.
|
||||
- :cpp:func:`i2c_slave_read_buffer`
|
||||
|
||||
- :cpp:func:`i2c_slave_write_buffer`
|
||||
Whenever the master writes data to the slave, the slave will automatically store it in the receive buffer. This allows the slave application to call the function :cpp:func:`i2c_slave_read_buffer` at its own discretion. This function also has a parameter to specify block time if no data is in the receive buffer. This will allow the slave application to wait with a specified timeout for data to arrive to the buffer.
|
||||
|
||||
The send buffer is used to store all the data that the slave wants to send to the master in FIFO order. The data stays there until the master requests for it. The function :cpp:func:`i2c_slave_write_buffer` has a parameter to specify block time if the send buffer is full. This will allow the slave application to wait with a specified timeout for the adequate amount of space to become available in the send buffer.
|
||||
- :cpp:func:`i2c_slave_write_buffer`
|
||||
|
||||
A code example showing how to use these functions can be found in :example:`peripherals/i2c`.
|
||||
The send buffer is used to store all the data that the slave wants to send to the master in FIFO order. The data stays there until the master requests for it. The function :cpp:func:`i2c_slave_write_buffer` has a parameter to specify block time if the send buffer is full. This will allow the slave application to wait with a specified timeout for the adequate amount of space to become available in the send buffer.
|
||||
|
||||
A code example showing how to use these functions can be found in :example:`peripherals/i2c`.
|
||||
|
||||
.. _i2c-api-interrupt-handling:
|
||||
.. _i2c-api-interrupt-handling:
|
||||
|
||||
.. only:: not SOC_I2C_SUPPORT_SLAVE
|
||||
|
||||
.. _i2c-api-interrupt-handling:
|
||||
|
||||
Interrupt Handling
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
@@ -369,7 +392,7 @@ Before calling :cpp:func:`i2c_driver_delete` to remove i2c driver, please make s
|
||||
Application Example
|
||||
-------------------
|
||||
|
||||
I2C master and slave example: :example:`peripherals/i2c`.
|
||||
I2C examples: :example:`peripherals/i2c`.
|
||||
|
||||
|
||||
API Reference
|
||||
|
@@ -3,7 +3,7 @@ I2C 驱动程序
|
||||
|
||||
:link_to_translation:`en:[English]`
|
||||
|
||||
{IDF_TARGET_I2C_NUM:default="2", esp32c3="1", esp32h2="1", esp328684="1"}
|
||||
{IDF_TARGET_I2C_NUM:default="2", esp32c3="1", esp32h2="1", esp32c2="1"}
|
||||
|
||||
概述
|
||||
---------
|
||||
|
@@ -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 || IDF_TARGET_ESP8684
|
||||
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 || IDF_TARGET_ESP8684
|
||||
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 || IDF_TARGET_ESP8684
|
||||
default 0 if IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32H2
|
||||
help
|
||||
Port number for I2C Master device.
|
||||
|
||||
@@ -32,7 +32,7 @@ menu "Example Configuration"
|
||||
endmenu
|
||||
|
||||
menu "I2C Slave"
|
||||
depends on SOC_I2C_SUPPORT_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,7 +30,7 @@ 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 */
|
||||
|
||||
#if !(CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP8684)
|
||||
#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 */
|
||||
@@ -52,7 +57,7 @@ static const char *TAG = "i2c-example";
|
||||
|
||||
SemaphoreHandle_t print_mux = NULL;
|
||||
|
||||
#if !(CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP8684)
|
||||
#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.
|
||||
@@ -166,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 || CONFIG_IDF_TARGET_ESP8684)
|
||||
#if SOC_I2C_NUM > 1
|
||||
/**
|
||||
* @brief i2c slave initialization
|
||||
*/
|
||||
@@ -209,7 +214,7 @@ static void i2c_test_task(void *arg)
|
||||
{
|
||||
int ret;
|
||||
uint32_t task_idx = (uint32_t)arg;
|
||||
#if !(CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP8684)
|
||||
#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);
|
||||
@@ -236,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 || CONFIG_IDF_TARGET_ESP8684)
|
||||
#if SOC_I2C_NUM > 1
|
||||
for (i = 0; i < DATA_LENGTH; i++) {
|
||||
data[i] = i;
|
||||
}
|
||||
@@ -301,7 +306,7 @@ static void i2c_test_task(void *arg)
|
||||
void app_main(void)
|
||||
{
|
||||
print_mux = xSemaphoreCreateMutex();
|
||||
#if !(CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP8684)
|
||||
#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 || IDF_TARGET_ESP8684
|
||||
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 || IDF_TARGET_ESP8684
|
||||
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
|
||||
|
@@ -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
|
||||
|
@@ -590,7 +590,6 @@ components/esp_rom/include/esp32/rom/tjpgd.h
|
||||
components/esp_rom/include/esp32/rom/uart.h
|
||||
components/esp_rom/include/esp32c2/rom/md5_hash.h
|
||||
components/esp_rom/include/esp32c3/rom/aes.h
|
||||
components/esp_rom/include/esp32c3/rom/apb_backup_dma.h
|
||||
components/esp_rom/include/esp32c3/rom/bigint.h
|
||||
components/esp_rom/include/esp32c3/rom/cache.h
|
||||
components/esp_rom/include/esp32c3/rom/crc.h
|
||||
@@ -912,7 +911,6 @@ components/hal/esp32h2/include/hal/twai_ll.h
|
||||
components/hal/esp32h2/include/hal/uhci_ll.h
|
||||
components/hal/esp32h2/include/hal/uhci_types.h
|
||||
components/hal/esp32h2/include/hal/usb_serial_jtag_ll.h
|
||||
components/hal/esp32h2/rtc_cntl_hal.c
|
||||
components/hal/esp32s2/brownout_hal.c
|
||||
components/hal/esp32s2/cp_dma_hal.c
|
||||
components/hal/esp32s2/include/hal/adc_hal_conf.h
|
||||
@@ -2333,10 +2331,8 @@ examples/peripherals/gpio/generic_gpio/main/gpio_example_main.c
|
||||
examples/peripherals/gpio/matrix_keyboard/components/matrix_keyboard/include/matrix_keyboard.h
|
||||
examples/peripherals/gpio/matrix_keyboard/components/matrix_keyboard/src/matrix_keyboard.c
|
||||
examples/peripherals/gpio/matrix_keyboard/main/matrix_keyboard_example_main.c
|
||||
examples/peripherals/i2c/i2c_self_test/main/i2c_example_main.c
|
||||
examples/peripherals/i2c/i2c_simple/main/i2c_simple_main.c
|
||||
examples/peripherals/i2c/i2c_tools/example_test.py
|
||||
examples/peripherals/i2c/i2c_tools/main/cmd_i2ctools.c
|
||||
examples/peripherals/i2c/i2c_tools/main/cmd_i2ctools.h
|
||||
examples/peripherals/i2c/i2c_tools/main/i2ctools_example_main.c
|
||||
examples/peripherals/i2s/i2s_adc_dac/main/app_main.c
|
||||
|
Reference in New Issue
Block a user