Eco and Workarounds For Bugs in Esp32 en
Eco and Workarounds For Bugs in Esp32 en
Eco and Workarounds For Bugs in Esp32 en
Version 2.3
Espressif Systems
Copyright © 2020
www.espressif.com
About This Guide
This document details hardware errata and workarounds in the ESP32.
Release Notes
3.2. When the CPU accesses external SRAM through cache, under certain conditions read and
write errors occur. ......................................................................................................................4
3.3. When the CPU accesses peripherals and writes a single address repeatedly, some writes
may be lost. ................................................................................................................................5
3.4. The Brown-out Reset (BOR) function does not work. The system fails to boot up after BOR. .6
3.5. The CPU crashes when the clock frequency switches directly from 240 MHz to 80/160 MHz. 6
3.6. GPIO pull-up and pull-down resistors for pads with both GPIO and RTC_GPIO functionality
can only be controlled via RTC_GPIO registers. ........................................................................6
3.8. Due to the flash start-up time, a spurious watchdog reset occurs when ESP32 is powered up
or wakes up from Deep-sleep. ...................................................................................................7
3.9. When the CPU accesses the external SRAM in a certain sequence, read & write errors can
occur. .........................................................................................................................................8
3.10. When each CPU reads certain different address spaces simultaneously, a read error can
occur. .........................................................................................................................................9
3.11. When certain RTC peripherals are powered on, the inputs of GPIO36 and GPIO39 will be
pulled down for approximately 80 ns. ........................................................................................9
3.12. When the LEDC is in decremental fade mode, a duty overflow error can occur. ......................9
3.13.1. Receive Error Counter (REC) is allowed to change whilst in reset mode or bus-off
recovery. .....................................................................................................................10
3.13.2. Error status bit is not frozen during bus-off recovery. ................................................10
3.13.4. Reading the interrupt register can lead to a transmit interrupt being lost. .................11
3.13.5. Receiving an erroneous data frame can cause the data bytes of the next received
data frame to be invalid. .............................................................................................11
3.13.6. After losing arbitration, a dominant bit on the 3rd bit of intermission is not interpreted
as an SOF. ...................................................................................................................12
3.13.7. When the 8th bit of the error delimiter is dominant, the error passive state is not
entered. .......................................................................................................................12
3.13.9. When a stuff error occurs during arbitration whilst being transmitter, any errors in the
subsequent error/overload frame will not increase the TEC. ......................................13
3.13.10.A negative phase error where |e| > SJW(N) will cause the remaining transmitted bits
to be left shifted. .........................................................................................................13
3.14. The ESP32 GPIO peripheral may not trigger interrupts correctly. ...........................................13
3.15. The ESP32 chip may have a live lock under certain conditions that will cause interrupt
watchdog issue. .......................................................................................................................14
3.16. There are limitations to the CPU access to 0x3FF0_0000 ~ 0x3FF1_EFFF and 0x3FF4_0000
~ 0x3FF7_FFFF address spaces. .............................................................................................15
1. Chip Revision
The chip revision is identified by the registers and eFuse identification bits. Details can be
found in the table below.
Register address
ECO, V1 0 0 1
ECO, V3 1 1 1
Espressif ! /!17
1
Submit Documentation Feedback 2020-09-25
2. Errata List
!
2. Errata List
Table 2-1. Errata Summary
The Brown-out Reset (BOR) function does not work. The system fails
Section 3.4 V0
to boot up after BOR.
The CPU crashes when the clock frequency switches directly from
Section 3.5 V0
240 MHz to 80/160 MHz.
GPIO pull-up and pull-down resistors for pads with both GPIO and
Section 3.6 RTC_GPIO functionality can only be controlled via RTC_GPIO V0/V1/V3
registers.
When certain RTC peripherals are powered on, the inputs of GPIO36
Section 3.11 V0/V1/V3
and GPIO39 will be pulled down for approximately 80 ns.
Section 3.13.2 Error status bit is not frozen during bus-off recovery. V0/V1/V3
Receiving an erroneous data frame can cause the data bytes of the
Section 3.13.5 V0/V1/V3
next received data frame to be invalid.
Espressif ! /!17
2
Submit Documentation Feedback 2020-09-25
2. Errata List
!
When the 8th bit of the error delimiter is dominant, the error passive
Section 3.13.7 V0/V1/V3
state is not entered.
Section 3.13.8 Suspend transmission is included even after losing arbitration. V0/V1/V3
A negative phase error where |e| > SJW(N) will cause the remaining
Section 3.13.10 V0/V1/V3
transmitted bits to be left shifted.
Section 3.14 The ESP32 GPIO peripheral may not trigger interrupts correctly. V0/V1/V3
The ESP32 chip may have a live lock under certain conditions that will
Section 3.15 V3
cause interrupt watchdog issue.
Section 3.18 CPU has limitations when accessing peripherals in chips. V0/V1/V3
Espressif ! /!17
3
Submit Documentation Feedback 2020-09-25
3. Errata Descriptions and Workarounds
!
3.2. When the CPU accesses external SRAM through cache, under
certain conditions read and write errors occur.
Details:
Access to external SRAM through cache will cause read and write errors if these operations
are pipelined together by the CPU.
Workarounds:
There is no automatic workaround available in software.
Workaround Details:
If accessing external SRAM from a revision 0 ESP32, users must ensure that access is
always one-way—only a write or a read can be in progress at a single time in the CPU
pipeline.
The MEMW instruction can be used: insert __asm__("MEMW") after any read from external
PSRAM that may be followed by a write to PSRAM before the CPU pipeline is flushed.
Espressif ! /!17
4 2020-09-25
Submit Documentation Feedback
3. Errata Descriptions and Workarounds
!
Fixes:
This issue is fixed in silicon revision 1.
Espressif ! /!17
5 2020-09-25
Submit Documentation Feedback
3. Errata Descriptions and Workarounds
!
Fixes:
This issue is fixed in silicon revision 1.
⚠ Notice:
3.4. The Brown-out Reset (BOR) function does not work. The
system fails to boot up after BOR.
Workarounds:
There is no workaround for this issue.
Fixes:
This issue is fixed in silicon revision 1.
3.5. The CPU crashes when the clock frequency switches directly
from 240 MHz to 80/160 MHz.
Workarounds:
This issue is automatically worked around in ESP-IDF V2.1 and newer.
Workaround Details:
When switching frequencies, use intermediate frequencies as follows:
(1) 2 MHz <-> 40 MHz <-> 80 MHz <-> 160 MHz
(2) 2 MHz <->40 MHz <->240 MHz
Fixes:
This issue is fixed in silicon revision 1.
3.6. GPIO pull-up and pull-down resistors for pads with both GPIO
and RTC_GPIO functionality can only be controlled via
RTC_GPIO registers.
Details:
For these pads, the GPIO pull-up and pull-down configuration register fields are non-
functional.
Espressif ! /!17
6 2020-09-25
Submit Documentation Feedback
3. Errata Descriptions and Workarounds
!
Workarounds:
This issue is automatically worked around when using GPIO drivers in ESP-IDF V2.1 or
newer.
Workaround Details:
Use RTC_GPIO registers for both GPIO and RTC_GPIO functions.
For chip revision 1 onwards this bug is fixed and the Audio PLL frequency is calculated in
hardware as follows:
sdm1 sdm0
fxtal(sdm2+ 8 + + 4)
2 216
fout =
! 2(odiv+2)
Workarounds:
The particular hardware frequency calculation is automatically accounted for when setting
Audio PLL frequency via the I2S driver in ESP-IDF V3.0 and newer. However, the range and
precision of available Audio PLL frequencies is still limited when using silicon revision 0.
Fixes:
This issue is fixed in silicon revision 1.
Espressif ! /!17
7 2020-09-25
Submit Documentation Feedback
3. Errata Descriptions and Workarounds
!
Workarounds:
1. Replace the flash chip with one with a fast start-up time (<800 μs from power-on to
ready to read). This works around the issue for both power-on and wake from Deep-
sleep.
2. When waking from Deep-sleep, this issue is automatically worked around in ESP-IDF
V2.0 and newer (the delay to wait can be configured if necessary). In this workaround,
the CPU executes from RTC fast memory immediately after waking and a delay is added
before continuing to read the program from flash.
Fixes:
This issue is fixed in silicon revision 3 (ECO V3).
Workarounds:
This bug is automatically worked around when external SRAM use is enabled in ESP-IDF
V3.0 and newer.
Workaround Details:
• When x>=y, insert four nop instructions between store.x and load.y.
• When x <y, insert a memw instruction between store.x and load.y.
Fixes:
This issue is fixed in silicon revision 3 (ECO V3).
Espressif ! /!17
8 2020-09-25
Submit Documentation Feedback
3. Errata Descriptions and Workarounds
!
Workaround Details:
Either of the following workarounds can be used:
• When either CPU reads address space A, prevent the other CPU bus from reading
address space B via locks and interrupts.
• Before reading address space A, disable interrupts and insert a read from address
space B on the same CPU (read a non-FIFO register, e.g., 0x3FF40078).
Fixes:
This issue is fixed in silicon revision 3 (ECO V3).
3.11. When certain RTC peripherals are powered on, the inputs of
GPIO36 and GPIO39 will be pulled down for approximately 80
ns.
Details:
Powering on the following RTC peripherals will trigger this issue:
• SARADC1
• SARADC2
• AMP
• HALL
Workarounds:
When enabling power for any of these peripherals, ignore input from GPIO36 and GPIO39.
Espressif ! /!17
9 2020-09-25
Submit Documentation Feedback
3. Errata Descriptions and Workarounds
!
Espressif ! /! 17
10 2020-09-25
Submit Documentation Feedback
3. Errata Descriptions and Workarounds
!
Workarounds:
When undergoing bus-off recovery, an error warning interrupt does not necessarily indicate
the completion of recovery. Users should check the STATUS_NODE_BUS_OFF bit to verify
whether bus-off recovery has completed.
3.13.4. Reading the interrupt register can lead to a transmit interrupt being lost.
Details:
The CAN controller's interrupt signals are cleared by reading the INTERRUPT_REG.
However, if a transmit interrupt occurs whilst the INTERRUPT_REG is being read (i.e., in the
same APB clock cycle), the transmit interrupt is lost.
Workarounds:
When a message is awaiting completion of transmission (i.e., transmission has been
requested), users should also check the STATUS_TRANSMIT_BUFFER bit each time the
INTERRUPT_REG is read. A set STATUS_TRANSMIT_BUFFER bit whilst the
CAN_TRANSMIT_INT_ST is not indicates a lost transmit interrupt.
3.13.5. Receiving an erroneous data frame can cause the data bytes of the next received
data frame to be invalid.
Details:
When the CAN controller is receiving a data frame and a bit or stuff error occurs in the data
or CRC fields, some data bytes of the next received data frame may be shifted or lost.
Therefore, the next received data frame (including those filtered out by the acceptance filter)
should be considered invalid.
Workarounds:
Users can detect the errata triggering condition (i.e., bit or stuff error in the data or CRC
field) by setting the INTERRUPT_BUS_ERR_INT_ENA and checking the
ERROR_CODE_CAPTURE_REG when a bus error interrupt occurs. If the errata condition is
met, the following workarounds are possible:
• The CAN controller can transmit a dummy frame with 0 data bytes to reset the
controller’s internal signals. It is advisable to select an ID for the dummy frame that
can be filtered out by all nodes on the CAN bus.
Espressif ! /! 17
11 2020-09-25
Submit Documentation Feedback
3. Errata Descriptions and Workarounds
!
• Hardware reset the CAN controller (will require saving and restoring the current
register values).
3.13.6. After losing arbitration, a dominant bit on the 3rd bit of intermission is not
interpreted as an SOF.
Details:
The CAN2.0B protocol stipulates that a dominant bit on the 3rd bit of intermission shall be
interpreted as a Start of Frame (SOF). Therefore, nodes shall begin receiving or transmitting
(i.e., competing for arbitration) the ID field on the next bit.
When the CAN controller loses arbitration and the following intermission’s 3rd bit is
dominant, the CAN controller will not interpret this as an SOF and will make no attempt to
compete for arbitration (i.e., does not retransmit its frame).
Workarounds:
There is no workaround for this issue.
3.13.7. When the 8th bit of the error delimiter is dominant, the error passive state is not
entered.
Details:
When the CAN controller is the transmitter and has a TEC value between 120 and 127,
transmitting an error frame will increment its TEC by 8 thus make the controller error
passive (due to TEC becoming >= 128). However, if the 8th bit of the error delimiter is
dominant, the TEC will still increment by 8 but the controller will not become error passive.
Instead, the controller will become error passive when another error frame is transmitted.
Note that the controller will still generate the required overload frame due to the dominant
8th bit.
Workarounds:
There is no workaround for this issue.
Espressif ! /! 17
12 2020-09-25
Submit Documentation Feedback
3. Errata Descriptions and Workarounds
!
Workarounds:
There is no workaround for this issue.
3.13.9. When a stuff error occurs during arbitration whilst being transmitter, any errors in
the subsequent error/overload frame will not increase the TEC.
When a stuff error occurs during arbitration whilst being transmitter, the CAN2.0B protocol
stipulates that an error frame be transmitted but the TEC should not increase (Exception 2
of Rule 3). The CAN controller is able to fulfill these requirements without issue.
However, errors within the subsequent error/overload frames themselves will fail to increase
the CAN controller’s TEC. Therefore, when a stuff error occurs during arbitration whilst
being transmitter, the TEC will fail to increase in the following cases:
• Bit error in an active error flag or overload flag (Rule 4).
• Detecting too many dominant bits after the transmission of active error, passive error
flag, and overload flags (Rule 6).
Workarounds:
There is no workaround for this issue.
3.13.10.A negative phase error where |e| > SJW(N) will cause the remaining transmitted bits
to be left shifted.
Details:
When the CAN controller encounters a recessive to dominant edge with a negative phase
error (i.e., the edge is early), it will correct for the phase error using resynchronization as
required by the CAN2.0B protocol. However, if the CAN controller is acting as transmitter
and encounters a negative phase error where e < 0 and |e| > SJW, the bits transmitted
following the phase error will be left shifted by one bit. Thus, the transmitted frame's
contents (i.e., DLC, data bytes, CRC sequence) will be corrupted.
Workarounds:
There is no workaround for this issue.
Espressif ! /! 17
13 2020-09-25
Submit Documentation Feedback
3. Errata Descriptions and Workarounds
!
3. After the CPU services the interrupt, change the GPIO interrupt type to low. A second
interrupt occurs at this time, and the CPU needs to ignore the interrupt service
routine.
Similarly, follow the steps below to trigger a GPIO interrupt on a falling edge:
1. Set the GPIO interrupt type to low.
2. Set the interrupt trigger type of the CPU to edge.
3. After the CPU services the interrupt, change the GPIO interrupt type to high. A
second interrupt occurs at this time, and the CPU needs to ignore the interrupt
service routine.
Workaround 2:
Assuming GPIO0 ~ GPIO31 is Group1 and GPIO32 ~ GPIO39 is Group2.
• If an edge-triggered interrupt is configured in either group then no other GPIO
interrupt of any type should be configured in the same group.
• Any number of level-triggered interrupts can be configured in a single group, if no
edge-triggered interrupts are configured in that group.
3.15. The ESP32 chip may have a live lock under certain conditions
that will cause interrupt watchdog issue.
Details:
On ESP32 ECO V3, when the following conditions are met at the same time, a live lock will
occur, causing the CPUs to get stuck in the state of memory access and stop executing
instructions.
1. Dual-core system.
2. Of the four Instruction/Data buses (IBUS/DBUS) that access external memory, three
simultaneously initiate access requests to the same cache set, and all three requests
result in cache misses.
Workarounds:
When a live lock occurs, software proactively or passively recognizes and unlocks the
cache line contention, and then the two cores complete their respective cache operations
one after another, following a first-come, first-served policy, to resolve the live lock. The
detailed process is as follows:
1. If the live lock occurs when the instructions executed by the two cores are not in the
critical section of the code, the various types of system interruptions will proactively
release the cache line competition and resolve the live lock.
2. If the live lock occurs when the instructions executed by the two cores are located in
the critical section of the code, the system will mask interrupts at level 3 and below.
Therefore, software needs to set up a high priority (level 4 or 5) interrupt for each core
in advance, connect the interrupts to the same timer, and configure an appropriate
timeout threshold. The timer timeout interrupt generated by the live lock will force
Espressif ! /! 17
14 2020-09-25
Submit Documentation Feedback
3. Errata Descriptions and Workarounds
!
both cores to enter the high-priority interrupt handler, thereby releasing the IBUS of
both cores to resolve the live lock. The live lock resolution process is completed in
three stages:
(a) In the first stage, both cores wait for the CPU write buffer to be cleared.
(b) In the second stage, one core (Core 0) waits and the other core (Core 1)
executes instructions.
(c) In the third stage, Core 1 waits and Core 0 executes instructions.
Workarounds:
When using DPORT to read FIFO, please calculate the number of bytes according to the
value of FIFO pointer.
Espressif ! /! 17
15 2020-09-25
Submit Documentation Feedback
3. Errata Descriptions and Workarounds
!
Write ✔ ✔
0x3FF0_0000 ~ Non-FIFO
0x3FF1_EFFF and Read ✖ (See 3.10) ✔
Write ✔
Non-FIFO
Read ✔
0x6000_0000 ~
0x6003_FFFF (AHB) Write ✔
FIFO
Read ✖ (No such feature, unpredictable results)
Legend
✖ - operation fails
Espressif ! /! 17
16 2020-09-25
Submit Documentation Feedback
Disclaimer and Copyright Notice
Information in this document, including URL references, is subject to change without
notice.
THIS DOCUMENT IS PROVIDED AS IS WITH NO WARRANTIES WHATSOEVER,
INCLUDING ANY WARRANTY OF MERCHANTABILITY, NON-INFRINGEMENT, FITNESS
FOR ANY PARTICULAR PURPOSE, OR ANY WARRANTY OTHERWISE ARISING OUT
OF ANY PROPOSAL, SPECIFICATION OR SAMPLE.
All liability, including liability for infringement of any proprietary rights, relating to use of
information in this document is disclaimed. No licenses express or implied, by estoppel or
otherwise, to any intellectual property rights are granted herein.
The Wi-Fi Alliance Member logo is a trademark of the Wi-Fi Alliance. The Bluetooth logo is
a registered trademark of Bluetooth SIG.
All trade names, trademarks and registered trademarks mentioned in this document are
Espressif IoT Team
property of their respective owners, and are hereby acknowledged.
www.espressif.com Copyright © 2020 Espressif Systems (Shanghai) Co., Ltd. All rights reserved.