Back to Riot

Doc Esp32c6.Doc

cpu/esp32/doc_esp32c6.doc.md

2026.07-devel9.5 KB
Original Source
<!-- SPDX-FileCopyrightText: 2025 Gunar Schorcht SPDX-License-Identifier: LGPL-2.1-only -->

@defgroup cpu_esp32_esp32c6 ESP32-C6 family @ingroup cpu_esp32 @brief Specific properties of ESP32-C6 variant (family) @author Gunar Schorcht [email protected]

\section esp32_riot_esp32c6 Specific properties of ESP32-C6 variant (family)

GPIO pins {#esp32_gpio_pins_esp32c6}

ESP32-C6 has 19 broken-out GPIO pins, where a subset can be used as ADC channel and as low-power digital inputs/outputs in deep-sleep mode, the so-called LP GPIOs. Some of them are used by special SoC components. The following table gives a short overview.

<center>
PinTypeADC / LPPU / PDSpecial functionRemarks
GPIO0In/OutADC / LPyesXTAL_32K_P-
GPIO1In/OutADC / LPyesXTAL_32K_N-
GPIO2In/OutADC / LPyesFSPIQ
GPIO3In/OutADC / LPyes-
GPIO4In/OutADC / LPyesMTMSFSPIWP
GPIO5In/OutADC / LPyesMTDIFSPIHD
GPIO6In/OutADC / LPyesMTCKFSPICLK
GPIO7In/OutLPyesMTDOFSPID
GPIO8In/OutyesBootstrapping
GPIO9In/OutyesBootstrapping, pulled up
GPIO10In/OutyesN/A on chips with in-package flash
GPIO11In/OutyesN/A on chips with in-package flash
GPIO12In/OutyesUSB D-USB Serial / JTAG interface
GPIO13In/OutyesUSB D+USB Serial / JTAG interface
GPIO14In/OutyesN/A on chips w/o in-package flash
GPIO15In/OutyesBootstrapping
GPIO16In/OutyesUART0 TXFSPICS0
GPIO17In/OutyesUART0 RXFSPICS1
GPIO18In/OutyesUART0 RXFSPICS2
GPIO19In/OutyesFSPICS3
GPIO20In/OutyesFSPICS4
GPIO21In/OutyesFSPICS5
GPIO22In/Outyes-
GPIO23In/Outyes-
GPIO24In/OutyesSPICS0N/A on chips with in-package flash
GPIO25In/OutyesSPIQN/A on chips with in-package flash
GPIO26In/OutyesSPIWPN/A on chips with in-package flash
GPIO27In/OutyesVDD_SPIN/A on chips with in-package flash
GPIO28In/OutyesSPIHDN/A on chips with in-package flash
GPIO29In/OutyesSPICLKN/A on chips with in-package flash
GPIO30In/OutyesSPIDN/A on chips with in-package flash
</center>

<b>ADC:</b> these pins can be used as ADC inputs

<b>LP:</b> these pins are LP GPIOs and can be used in deep-sleep mode

<b>PU/PD:</b> these pins have software configurable pull-up/pull-down functionality.

GPIO8 and GPIO9 are bootstrapping pins which are used to boot ESP32-C6 in different modes:

<center>
GPIO9GPIO8Mode
1XSPI Boot mode to boot the firmware from flash (default mode)
01SPI Download Boot mode

Other combinations are invalid.

</center>

ADC Channels {#esp32_adc_channels_esp32c6}

ESP32-C6 integrates one 12-bit ADC with 7 channels in total: GPIO0, GPIO1, GPIO2, GPIO3, GPIO4, GPIO5 and GPIO6

The maximum number of ADC channels #ADC_NUMOF_MAX is 7.

I2C Interfaces {#esp32_i2c_interfaces_esp32c6}

ESP32-C6 has two built-in I2C interfaces.

The following table shows the default configuration of I2C interfaces used for ESP32-C6 boards. It can be overridden by application-specific configurations.

<center>
DeviceSignalPinSymbolRemarks
I2C_DEV(0)I2C0_SPEEDdefault is I2C_SPEED_FAST
I2C_DEV(0)SCLGPIO5I2C0_SCL-
I2C_DEV(0)SDAGPIO4I2C0_SDA-
</center>

PWM Channels {#esp32_pwm_channels_esp32c6}

The ESP32-C6 LEDC module has 1 channel group with 6 channels. Each of these channels can be clocked by one of the 4 timers. This means that it is possible to define up to 4 PWM devices with different frequencies and resolutions and a total of 6 PWM channels.

SPI Interfaces {#esp32_spi_interfaces_esp32c6}

ESP32-C6 has three SPI controllers where SPI0 and SPI1 share the same bus. They are used as interface for external memory and can only operate in memory mode:

  • Controller SPI0 is reserved for caching external memory like Flash
  • Controller SPI1 is reserved for external memory like PSRAM
  • Controller SPI2 can be used as general purpose SPI (also called FSPI)

Thus, only SPI2 (FSPI) can be used as general purpose SPI in RIOT as SPI_DEV(0).

The following table shows the pin configuration used for most boards, even though it can vary from board to board.

<center>
DeviceSignalPinSymbolRemarks
SPI_DEV(0)SCKGPIO6SPI0_SCKSPI2_HOST (FSPI)
SPI_DEV(0)MOSIGPIO7SPI0_MOSISPI2_HOST (FSPI)
SPI_DEV(0)MISOGPIO2SPI0_MISOSPI2_HOST (FSPI)
SPI_DEV(0)CS0GPIO18SPI0_CS0SPI2_HOST (FSPI)
</center>

Timers {#esp32_timers_esp32c6}

ESP32-C6 has two timer groups with one timer each, resulting in a total of two timers. Thus one timer with one channel can be used in RIOT as timer device TIMER_DEV(0), because the other timer is used as system timer.

ESP32-C6 do not have CCOMPARE registers. The counter implementation can not be used.

UART Interfaces {#esp32_uart_interfaces_esp32c6}

ESP32-C6 integrates three UART interfaces, two in the high-power domain and one in the low-power domain. The low-power UART interface is not yet supported. The following default pin configuration of UART interfaces as used by a most boards can be overridden by the application, see section Application-Specific Configurations.

<center>
DeviceSignalPinSymbolRemarks
UART_DEV(0)TxDGPIO16UART0_TXDcannot be changed
UART_DEV(0)RxDGPIO17UART0_RXDcannot be changed
UART_DEV(1)TxDUART1_TXDoptional, can be configured
UART_DEV(1)RxDUART1_RXDoptional, can be configured
</center>

JTAG Interface {#esp32_jtag_interface_esp32c6}

There are two options on how to use the JTAG interface on ESP32-C6:

  1. Using the built-in USB-to-JTAG bridge connected to an USB cable as follows:

    <center> USB Signal | ESP32-C6 Pin :--------------|:----------- D- (white) | GPIO12 D+ (green) | GPIO13 V_Bus (red) | 5V Ground (black) | GND </center>
  2. Using an external JTAG adapter connected to the JTAG interface exposed to GPIOs as follows:

    <center> JTAG Signal | ESP32-C6 Pin :-----------|:----------- TRST_N | CHIP_PU TDO | GPIO7 (MTDO) TDI | GPIO5 (MTDI) TCK | GPIO6 (MTCK) TMS | GPIO4 (MTMS) GND | GND </center>

Using the built-in USB-to-JTAG bridge is the default option, i.e. the JTAG interface of the ESP32-C6 is connected to the built-in USB-to-JTAG bridge. To use an external JTAG adapter, the JTAG interface of the ESP32-C6 has to be connected to the GPIOs as shown above. For this purpose eFuses have to be burned with the following command:

espefuse.py burn_efuse JTAG_SEL_ENABLE --port /dev/ttyUSB0

@warning Burning eFuses is an irreversible operation.

Once the eFuses are burned with this command and option JTAG_SEL_ENABLE, GPIO15 is used as a bootstrapping pin to choose between the two options. If GPIO15 is HIGH when ESP32-C6 is reset, the JTAG interface is connected to the built-in USB to JTAG bridge and the USB cable can be used for on-chip debugging. Otherwise, the JTAG interface is exposed to GPIO4 ... GPIO7 and an external JTAG adapter has to be used.

Alternatively, the integrated USB-to-JTAG bridge can be permanently disabled with the following command:

espefuse.py burn_efuse DIS_USB_JTAG --port /dev/ttyUSB0

@warning Burning eFuses is an irreversible operation.

Once the eFuses are burned with this command and option DIS_USB_JTAG, the JTAG interface is always exposed to GPIO4 ... GPIO7 and an external JTAG adapter has to be used.

For more information about JTAG configuration for ESP32-C6, refer to the section [Configure Other JTAG Interface] (https://docs.espressif.com/projects/esp-idf/en/latest/esp32c6/api-guides/jtag-debugging/configure-other-jtag.html) in the ESP-IDF documentation.