ESP8266 – jak sprawdzić rozmiar pamięci flash?

Jak sprawdzić ile Twój moduł ESP8266 ma pamięci Flash?

ESP8266 nie posiada zintegrowanej pamięci flash, pamięć jest podłączona na zewnętrznym układzie. Dlatego różne moduły mogą mieć różne ilości dostępnej pamięci. I teraz jedyną bezinwazyjną metodą jest jednak skorzystanie z programu esptool o którym mowa była w pierwszej części przewodnika IoT dla ESP8266.

Dotyczy to oczywiście modułów jak ESP8266-07 czy -12, które mają sam ESP i układ flash osłonięte ochronną blaszką. ESP8266-01 ma na wierzchu układy, więc można oznaczenie scalaka po prostu odczytać.

Zakładamy, że układ jest tak samo podłączony jak w tamtej części przewodnika i masz już esptool w systemie. Ma on opcję do odczytu ID producenta. Przechodzimy do katalogu z esptool i:

 ./esptool.py --port /dev/ttyACM0 --baud 115200 flash_id

Port, to jest port szeregowy utworzony przez podłączone UNO, taką formę ma na Linuksie, na Windows to będzie któryś COMx. Przed wydaniem komendy trzeba ustawić ESP w tryb wgrywania firmware. Czyli, jeżeli korzystasz z adaptera, GPIO0 trzeba zewrzeć do masy i zrestartować moduł. Wynik działania:

Connecting...
Manufacturer: e0
Device: 4014

Liczby te to są kody (zapisane szesnastkowo) oznaczające kod producenta oraz nadany przez niego ID układu. I tutaj kończy się prosta część. Bo ustalić co to dokładnie za układ nie jest łatwo… ID producenta jest nadawane przez konsorcjum JEDEC- wielka organizacja zrzeszająca producentów elektroniki – grupy zadaniowe, komitety, normy, blah… straszna biurokracja. No i jak to często w design by committee bywa :) ID producenta jest tylko 8-mio bitowe.  W tej chwili lista producentów jest pogrupowana w 9 banków, czyli jedno ID ma 9 różnych firm… Nice. W przyszłości będzie ich pewnie jeszcze więcej.

Pozostaje googlać, ale… powyższy wynik to rezultat z nowego ESP8266-07 w sprzedaży u nas. Google znajduje na forum ESP8266 informację, że to układ Winbonda, ale… nie jest to prawda. Winbond ma ID 0xEF a nie 0xE0. Id 0xE0 wg JEDEC przypisane jest do: LG Semi (Goldstar), Truevision, Domosys, Sandburst, Credence Systems Corp., Opulan Technologies, Memory Exchange Corp., Berg Microelectronics Inc, Eoplex Inc. Fajnie…

No to zamiast główkować co tam w środku może być, użyliśmy większego młotka :) a dokładniej – opalarki.

ESP8266-07 ze zdjętym ekranem
ESP8266-07 ze zdjętym ekranem

Na zdjęciu nie widać, bo napisy ledwo widoczne – Berg Microelectronics. BergMicro to firma z HongKongu. Nie udało się znaleźć nawet ich strony WWW, a co dopiero jakiegoś datasheeta… Jakaś strona twierdzi, że zna znaczenie kodu produktu BM, ale.. nasz chip ma oznaczenie 25Q80ASSIG. Nie ma takiego miasta Londyn, jest Lądek Zdrój… Na ile można temu wierzyć (dekodując część 25Q80A), to powinien być układ flash o pojemności 8×1024 k bitów, czyli 1MB. I tego się trzymamy :)

Druga z liczb podanych przez esptool to jest ID układu nadawane przez producenta. By je móc rozszyfrować to potrzebny jest datasheet układu. Ten ID może tylko służyć nam do poszukiwania info przez Google, ale jak pokazuje powyższy przykład z ID producenta, to należy taką informację traktować jako mało wiarygodną.

Czyli – 100% metody nie ma. Zawsze może się przydać praca wykonana przez autorów projektu flashrom gdzie jeden z plików flashchips.h zawiera całkiem spory zestaw kodów producentów i co równie ważne – ID chipów z ich nazwami. Może to Wam pomoże zorientować się jaki flash jest w środku, bo mając datasheet można zwykle więcej powiedzieć.

Arduino IDE i ESP8266

Arduino IDE w wersji dla ESP8266 posiada pewne funkcje, które wydawać się mogą przydatne w celu ustalenia rozmiaru pamięci flash. Jednak wiedzcie, że ESP.getFlashChipSize() zwraca wartość zapisaną w firmware a nie prawdziwą. Czyli jeśli wybierzecie target Generic ESP8266 Board i wybierzecie rozmiar pamięci flash 512K – taką wartość zwróci ESP.getFlashChipSize(). Jeśli 4M – zwróci 4M… Nie za bardzo się nam przyda…

To co istotne – w większości projektów, nawet 512k flashu to jest całkiem sporo :)

EDIT/UZUPEŁNIENIE

Jak ktoś słusznie zauważył – można wgrać na ESP nodeMCU i skorzystać z polecenia node.info(). Poda ono również ile jest dostępnej pamięci flash. Jak ono to robi? Próbuje odczytać zawartość pamięci flash z coraz ’odleglejszych’ regionów. Gdy to się nie udaje w którymś momencie, to nodeMCU uznaje że tyle pamięci jest dostępne. Można sprawdzić samemu w kodzie funkcji flash_detect_size_byte