Už téměř rok se těšíme na nástupce oblíbeného Wi-Fi čipu ESP8266: ESP32. Od září ho intenzivně hledáme v e-shopech po celém světě a někteří šťastlivci už jej dokonce mají doma. Připomeňme si ve zkratce jeho úžasné parametry (úmyslně v originále, přesně opsáno z propagačního tweetu, aby se nic neztratilo v překladu):
- WiFi 802.1BGN HT40 (150 Mbps)
- Bluetooth Classic
- Bluetooth Low Energy
- Proprietary Long Range Wi-Fi (1 km range)
- Dual core CPU
- 7-stage pipeline CPU
- 2× FPU (Single precision)
- 240 MHz CPU clock
- 240 MHz bus clock
- 32×32 multiplier
- 32-bit Integer divide
- 40-bit MAC
- 10× PWM
- 512 kByte SRAM
- 8 kB low power retention memory
- Dynamic biasing
- Instruction cache
- 8 MByte Flash
- 12× timer
- 32× GPIO
- 5µA low power
- Memory protection unit
- 4096-bit RSA hardware accelerator
- Elliptical curve cryptography accelerator
- AES-256 accelerator
- Hardware flash encryption
- Secure boot
- 1024-bit OTP memory
- 3× SPI
- 3× I2C
- SD-card Interface
- LCD Interface
- Camera Interface
- PWM driver
- 10× capacitive touch sensor
- Hall sensor
- Low noise amplifier
- Slow clock
- 12-channel dual ADC
- Dual 10-bit DAC
- Internal calibrated 8MHz clock
- 160kHz low power RTC
- Ethernet MAC
- 32kHz crystal oscillator
- 2.0V to 3.6V supply voltage
Takto vybavený (nebál bych se slova „nabušený“) čip o velikosti 6×6 mm a aktuální ceně kolem 5 dolarů slibuje stát se opravdovou revolucí nejen v internetu věcí. Bohužel není nebe bez mráčku a ani čerstvě vyvinutý čip není bez chyby. Espressif IOT Team právě uveřejnil dokument nazvaný ECO and Workarounds for Bugs in ESP32 [PDF], který popisuje hned sedm chyb přítomných v čipu ESP32 revize 0 (to je ta vydaná 1. září, jak jsme psali v článku).
První chyba se týká watchdogu, který nesprávně vyvolá reset jak po zapnutí napájení, tak i po probuzení z hlubokého spánku. Zatímco resetu po zapnutí se vyhnout nelze, reset po probuzení je možno obejít softwarově vymazáním jednoho příznaku v MMU.
Druhá chyba nastává při přístupu do externí SRAM paměti skrz keš, kdy při střídání operací čtení a zápisu dochází k náhodným chybám. Softwarově to opravit nejde, musí se pečlivě vyprazdňovat pipeline mezi čtením a zápisem do externí SRAM paměti (nebo mezi čtením a zápisem použít strojovou instrukci MEMW).
Třetí chyba se týká náhodných ztrát dat, které nastávají při opakovaném zápisu na stejnou adresu registrů periférií. Zde má pomoci přeskládat adresy registrů pro přístup k perifériím podle tabulky ve výše zmíněném dokumentu.
Čtvrtou chybou je, že nefunguje Brown-out Reset, tedy reset při poklesu napětí pod určitou mez. Na to nepomůže žádná softwarová klička.
Pátou chybou je pád procesoru („CPU crash“) při přepnutí jeho frekvence z 240 MHz na 80 nebo 160 MHz. Doporučovaná obezlička je docela vtipná: pokud už běžíte na 240 MHz, tak snižujte jedině na 40 MHz. Z 40 MHz můžete snížit na 2 MHz, a z 2 MHz pak můžete jít nahoru na požadovaných 80 nebo 160 MHz.
Šestá chyba zřejmě plyne z velké konfigurovatelnosti pinů procesoru ESP32. Některé piny jsou přístupné jak přes GPIO funkce, tak i přes RTC_GPIO registry. A zrovna tyto piny mají tu smůlu, že jejich pull-up a pull-down rezistory nejdou zapnout přes GPIO funkce, jak by člověk očekával, ale je nutno použít RTC_GPIO registry. Tato chyba je výjimečná i tím, že jako jediná nebude opravena ani v nové revizi čipu.
Poslední zatím známou chybou v ESP32 je omezený rozsah frekvencí „audio PLL“. V nové revizi čipu bude pro výpočet výstupní frekvence platit jiný vzorec než pro dnešní revizi 0.
No a kdy že bude nová revize ESP32, která opraví šest ze sedmi výše zmíněných chyb, dostupná? Výrobce plánuje, že ji pustí na trh v únoru 2017. Dokument tvrdí, že novou revizi poznáme podle nastavení bitu eFuse. Kardinální otázka ovšem je, jak to my kupující poznáme při vybírání hotových modulů s ESP32 v e-shopu. Pravděpodobně jediná možnost bude počkat nejméně do dubna/května, než se vyprodají zásoby starých čipů (za předpokladu, že tato chybná revize půjde na dračku a nezůstane ležet někde ve skladech). Mezitím nám alespoň poklesnou ceny, jak jsem prorokoval už v minulém článku.