{"id":1477,"date":"2018-02-17T14:19:38","date_gmt":"2018-02-17T13:19:38","guid":{"rendered":"http:\/\/www.xpablo.cz\/?p=1477"},"modified":"2020-07-05T22:11:56","modified_gmt":"2020-07-05T20:11:56","slug":"esp32-jak-opravit-chybu-v-navrhu-rozhrani-na-sd-kartu-a-troska-narku-na-esp32","status":"publish","type":"post","link":"https:\/\/www.xpablo.cz\/?p=1477","title":{"rendered":"ESP32 &#8211; jak opravit chybu v n\u00e1vrhu rozhran\u00ed na SD kartu (a tro\u0161ka n\u00e1\u0159k\u016f na ESP32)"},"content":{"rendered":"<p><a href=\"https:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/02\/etcpesp32.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1478 alignleft\" src=\"https:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/02\/etcpesp32-300x216.jpg\" alt=\"\" width=\"300\" height=\"216\" srcset=\"https:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/02\/etcpesp32-300x216.jpg 300w, https:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/02\/etcpesp32-768x552.jpg 768w, https:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/02\/etcpesp32-1024x737.jpg 1024w, https:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/02\/etcpesp32.jpg 1806w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Jak mi postupn\u011b roste velikost k\u00f3du pro EasyTherm do ESP8266, tak jsem usoudil, \u017ee je na \u010dase se poohl\u00e9dnout po lep\u0161\u00ed variant\u011b. Proto\u017ee jsem cht\u011bl udr\u017eet k\u00f3dovou z\u00e1kladnu EasyThermu pokud mo\u017eno stejnou pro v\u0161echny platformy z d\u016fvodu snadn\u011bj\u0161\u00edho v\u00fdvoje, padla volba na ESP32, se kter\u00fdm jsem u\u017e jednu konstrukci navrhoval&#8230;<!--more--><\/p>\n<p>Stanoven\u00e9 po\u017eadavky na za\u0159\u00edzen\u00ed byly jasn\u00e9:<\/p>\n<ul>\n<li>Funkce jako \u0159\u00edd\u00edc\u00ed elektronika pro syst\u00e9m EasyTherm s lep\u0161\u00edm v\u00fdkonem, ne\u017e st\u00e1vaj\u00edc\u00ed jednotka s ESP8266<\/li>\n<li>Dopln\u011bn\u00ed o mal\u00fd OLED displej, nebo TFT, p\u0159ipojen\u00fd p\u0159es SPI rozhran\u00ed<\/li>\n<li>Mo\u017enost ukl\u00e1dat data na extern\u00ed \u00falo\u017ei\u0161t\u011b<\/li>\n<\/ul>\n<p>a p\u00e1r dal\u0161\u00edch, m\u00e9n\u011b podstatn\u00fdch zm\u011bn a vylep\u0161en\u00ed. Z m\u00e9 star\u0161\u00ed konstrukce jsem m\u011bl ov\u011b\u0159en\u00e9 zapojen\u00ed rozhran\u00ed na SD kartu pomoc\u00ed SPI, ale nel\u00edbil se mi dosa\u017een\u00fd v\u00fdkon a proto jsem se rozhodl navrhnout zapojen\u00ed p\u0159es rozhran\u00ed SD MMC. Po krat\u0161\u00edm studiu dostupn\u00e9 dokumentace jsem nakreslil sch\u00e9ma zapojen\u00ed, navrhl PCB a nechal ho vyrobit (jako obvykle) v Seeed Studiu. Man\u017eelka mi vzorek PCB osadila a tak jsem se mohl pustit do o\u017eivov\u00e1n\u00ed. V\u0161e fungovalo &#8222;na prvn\u00ed dobrou&#8220;, bohu\u017eel a\u017e na rozhran\u00ed na SD kartu, kter\u00e9 se mi nepoda\u0159ilo rozh\u00fdbat ani ve 4 bitov\u00e9m, ani v 1 bitov\u00e9m re\u017eimu. Nezbylo tedy nic jin\u00e9ho, ne\u017e se pono\u0159it do hlubin internetu a zjistit, kde jsem ud\u011blal chybu. Nakonec se uk\u00e1zalo, \u017ee probl\u00e9mem je to, \u017ee jsem \u0161patn\u011b navrhl (respektive zcela vypustil) pull-up odpory na n\u011bkter\u00e9 sign\u00e1ly. Budi\u017e mi omluvou, \u017ee dokumentace je celkem rozt\u0159\u00ed\u0161t\u011bn\u00e1 a obsahuje spoustu matouc\u00edch informac\u00ed. V\u00fdrobci modul\u016f s ESP32 tomu tak\u00e9 nahr\u00e1vaj\u00ed &#8211; jako p\u0159\u00edklad uvedu situaci u pinu GPIO12:<\/p>\n<p>Tento v\u00fdvod je tzv. bootstraping pin, tak\u017ee jeho hodnota je testovan\u00e1 p\u0159i spou\u0161t\u011bn\u00ed modulu a ur\u010duje, jak\u00e9 nap\u011bt\u00ed se pou\u017eije pro programov\u00e1n\u00ed Flash pam\u011bti. Default hodnota pro programovac\u00ed nap\u011bt\u00ed 3V3 je L, ale pokud p\u0159ipoj\u00edm na stejn\u00fd pin rozhran\u00ed na SD kartu, tak je sem p\u0159ipojen\u00fd sign\u00e1l D2, kter\u00fd vy\u017eaduje pull-up rezistor a klidovou hodnotu H. \u0158e\u0161en\u00edm by mohlo b\u00fdt vyp\u00e1len\u00ed vnit\u0159n\u00edch pojistek ESP32, kter\u00e9 umo\u017en\u00ed trval\u00e9 nastaven\u00ed programovac\u00edho nap\u011bt\u00ed pro pam\u011b\u0165 Flash na 3.3V a tak\u00e9 odpoj\u00ed GPIO12 z jeho bootstraping funkce. Otev\u0159en\u011b \u0159e\u010deno nech\u00e1pu, pro\u010d modul Wroom-32 nen\u00ed distribuovan\u00fd s touto konfigurac\u00ed, proto\u017ee pam\u011b\u0165 Flash je osazen\u00e1 pod kovov\u00fdm krytem a v dokumentaci k Wroom-32 se p\u00ed\u0161e, \u017ee GPIO12 mus\u00ed b\u00fdt p\u0159i startu v L. T\u011b\u017eko p\u0159edpokl\u00e1dat, \u017ee n\u011bkdo s\u00e1m odstran\u00ed st\u00edn\u00edc\u00ed kryt a vym\u011bn\u00ed SPI flash za n\u011bjakou, kter\u00e1 vy\u017eaduje programovac\u00ed nap\u011bt\u00ed 1.8V. Aby ale ani to nebylo jednoduch\u00e9, tak existuj\u00ed dva popisy, jak vnit\u0159n\u00ed pojistky nastavit &#8211; <a href=\"https:\/\/github.com\/espressif\/esp-idf\/tree\/master\/examples\/storage\/sd_card\">https:\/\/github.com\/espressif\/esp-idf\/tree\/master\/examples\/storage\/sd_card<\/a> a <a href=\"https:\/\/www.esp32.com\/viewtopic.php?f=2&amp;t=849&amp;sid=136e5660600bf4f167e174933bfc2f74&amp;start=10\">https:\/\/www.esp32.com\/viewtopic.php?f=2&amp;t=849&amp;sid=136e5660600bf4f167e174933bfc2f74&amp;start=10<\/a> . Vzhledem k tomu, \u017ee nastaven\u00ed pojistek je mo\u017en\u00e9 jen jednou a je nevratn\u00e9, jsem se do experimentu zat\u00edm nepustil a zkusil jsem to jinak. U v\u011bt\u0161iny GPIO je mo\u017en\u00e9 separ\u00e1tn\u011b aktivovat vnit\u0159n\u00ed pull-upy. U n\u011bkter\u00fdch je &#8211; vzhledem k chyb\u011b v HW &#8211; nutn\u00e9 pro spr\u00e1vnou funkci pou\u017e\u00edt oblast RTC, ale zd\u00e1 se, \u017ee v SDK ji\u017e do\u0161lo k aplikaci SW opravy. Napadlo m\u011b tedy, aktivovat p\u0159ed inicializac\u00ed SD MMC periferie odpov\u00eddaj\u00edc\u00ed pull-upy v k\u00f3du. P\u0159ed inicializac\u00ed standardn\u00edho ovlada\u010de z knihovny SD_MMC jsem napsal sekvenci, kter\u00e1 p\u0159es funkce SDK aktivuje vnit\u0159n\u00ed pull-upy u odpov\u00eddaj\u00edc\u00edch pin\u016f:<\/p>\n<pre class=\"lang:c++ decode:true\" title=\"SDMMC Init\">    gpio_set_pull_mode(GPIO_NUM_15, GPIO_PULLUP_ONLY);\r\n    gpio_set_pull_mode(GPIO_NUM_13, GPIO_PULLUP_ONLY);\r\n    gpio_set_pull_mode(GPIO_NUM_14, GPIO_PULLUP_ONLY);\r\n\/\/    gpio_set_pull_mode(GPIO_NUM_2, GPIO_PULLUP_ONLY);\r\n    gpio_set_pull_mode(GPIO_NUM_4, GPIO_PULLUP_ONLY);\r\n    gpio_set_pull_mode(GPIO_NUM_12, GPIO_PULLUP_ONLY);\r\n    delay(1000);\r\n    if (!SD_MMC.begin())\r\n\/\/ ...<\/pre>\n<p>&#8230; po aplikaci t\u00e9to &#8222;z\u00e1platy&#8220; se 4 bitov\u00e9 rozhran\u00ed na SD kartu rozb\u011bhlo. Nepova\u017euji to za kone\u010dn\u00e9 a zcela spr\u00e1vn\u00e9 \u0159e\u0161en\u00ed &#8211; to bude a\u017e opraven\u00e9 sch\u00e9ma pro revizi B a spr\u00e1vn\u011b nastaven\u00e9 efuses v ESP32, nicm\u00e9n\u011b pro \u00fa\u010dely testov\u00e1n\u00ed a lad\u011bn\u00ed je naprosto dosta\u010duj\u00edc\u00ed.<\/p>\n<p>No a nyn\u00ed k t\u011bm n\u00e1\u0159k\u016fm na ESP32 &#8211; p\u0159i v\u00fdvoji EasyThermu jsem p\u0159ed n\u011bkolika m\u011bs\u00edci p\u0159e\u0161el na platformu <a href=\"https:\/\/platformio.org\/\">Platformio\/ATOM<\/a>. Bylo to pragmatick\u00e9 rozhodnut\u00ed ze dvou d\u016fvod\u016f:<\/p>\n<ul>\n<li>p\u0159\u00edstup projektu v Platformio mi umo\u017e\u0148uje m\u00edt pohromad\u011b cel\u00fd projekt v\u010detn\u011b knihoven, kter\u00e9 nemus\u00edm nijak upravovat (jako jsem musel pro Arduino IDE, pokud jsem cht\u011bl m\u00edt v\u0161e pohromad\u011b).<\/li>\n<li>Platformio mi umo\u017e\u0148uje m\u00edt v projektu m\u016fj modifikovan\u00fd linker script, kter\u00fd pou\u017e\u00edv\u00e1m kv\u016fli rozd\u011blen\u00ed pam\u011bti Flash na 2M pro k\u00f3d a 2M pro SPIFFS. Jde sice vyrobit i pro Arduino IDE, ale znamen\u00e1 to ru\u010dn\u00ed modifikaci souboru baords.txt a p\u0159ikop\u00edrov\u00e1n\u00ed linker scriptu do odpov\u00eddaj\u00edc\u00edho adres\u00e1\u0159e<\/li>\n<\/ul>\n<p>jak se ale nakonec uk\u00e1zalo, tak toto jsou jedin\u00e9 dv\u011b v\u00fdhody oproti Arduino IDE. Jinak je prakticky v\u0161e sp\u00ed\u0161e ve prosp\u011bch origin\u00e1ln\u00edho Arduina. Platformio IDE je tvo\u0159en\u00e9 editorem Atom, kter\u00fd rozhodn\u011b nen\u00ed z nejsvi\u017en\u011bj\u0161\u00edch, IDE postr\u00e1d\u00e1 funkce, kter\u00e9 jsem pou\u017e\u00edval zcela (archivace projektu, rozd\u011blen\u00ed oblasti pam\u011bti, upload SPIFFS pro ESP32), nebo je nahrazuje ru\u010dn\u00ed editac\u00ed soubor\u016f (v\u00fdb\u011br za\u0159\u00edzen\u00ed pro OTA). Pro ESP8266 se s t\u00edm d\u00e1 \u017e\u00edt celkem klidn\u011b, ale pro ESP32 je to podstatn\u011b hor\u0161\u00ed. Uvedu p\u0159\u00edklad:<\/p>\n<p>Jedna \u010d\u00e1st roz\u0161\u00ed\u0159en\u00ed EasyThermu v ESP32 je \u0159\u00edzen\u00ed Bluetooth termostatick\u00fdch hlavic z <a href=\"https:\/\/www.lidl-shop.cz\/SILVERCREST-Programovatelny-regulator-teploty-s-Bluetooth\/p100230502\">L\u00eddlu<\/a>.<\/p>\n<p><a href=\"https:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/02\/blethermo.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-1491\" src=\"https:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/02\/blethermo-300x285.jpg\" alt=\"\" width=\"300\" height=\"285\" srcset=\"https:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/02\/blethermo-300x285.jpg 300w, https:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/02\/blethermo-768x729.jpg 768w, https:\/\/www.xpablo.cz\/wp-content\/uploads\/2018\/02\/blethermo-1024x973.jpg 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Spojen\u00ed s hlavicemi m\u00e1m ov\u011b\u0159en\u00e9 na jednom z v\u00fdvojov\u00fdch modul\u016f s ESP32, ale ve chv\u00edli, kdy jsem p\u0159idal BLE knihovny do projektu EasyTherm za\u010daly probl\u00e9my &#8211; rozd\u011blen\u00ed pam\u011bti flash v ESP32 je toti\u017e navr\u017eeno tak, \u017ee pro OTA je k dispozici 2x1MB a zbytek je vyhrazen\u00fd pro SPIFFS. Pot\u00ed\u017e je v tom, \u017ee BLE knihovny zab\u00edraj\u00ed cca 800kB k\u00f3du, tak\u017ee po slinkov\u00e1n\u00ed projektu jsem se dostal na velikost kolem 1.5MB, co\u017e se u\u017e do standardn\u00edho rozd\u011blen\u00ed nevejde. Existuj\u00ed sice postupy, jak rozd\u011blen\u00ed zm\u011bnit (https:\/\/github.com\/espressif\/arduino-esp32\/issues\/339 , https:\/\/github.com\/espressif\/arduino-esp32\/issues\/703 , https:\/\/github.com\/espressif\/arduino-esp32\/issues\/703 , https:\/\/github.com\/beegee-tokyo\/arduino-esp32\/wiki\/Change-partition-size ), ale drtiv\u00e1 v\u011bt\u0161ina z nich popisuje zm\u011bnu pro Arduino IDE a v p\u0159\u00edpad\u011b popisu pro Platformio se op\u011bt jedn\u00e1 o editaci, ale tentokr\u00e1t soubor\u016f, kter\u00e9 jsou ru\u010dn\u011b modifikovan\u00e9 v adres\u00e1\u0159\u00edch Platformia (vzpom\u00edn\u00e1te na druh\u00fd d\u016fvod, kter\u00fd jsem uvedl pro p\u0159echod k Platformio?&#8230;).<\/p>\n<p>Mus\u00edm tedy \u0159\u00edct, \u017ee stav v\u00fdvojov\u00fdch n\u00e1stroj\u016f, knihoven (SDK) a dokumentace k ESP32 d\u00e1 zabrat i pom\u011brn\u011b ost\u0159\u00edlen\u00fdm u\u017eivatel\u016fm.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jak mi postupn\u011b roste velikost k\u00f3du pro EasyTherm do ESP8266, tak jsem usoudil, \u017ee je na \u010dase se poohl\u00e9dnout po lep\u0161\u00ed variant\u011b. Proto\u017ee jsem cht\u011bl udr\u017eet k\u00f3dovou z\u00e1kladnu EasyThermu pokud mo\u017eno stejnou pro v\u0161echny platformy z d\u016fvodu snadn\u011bj\u0161\u00edho v\u00fdvoje, padla volba na ESP32, se kter\u00fdm jsem u\u017e jednu konstrukci navrhoval&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[3,83],"tags":[36,84,85],"class_list":["post-1477","post","type-post","status-publish","format-standard","hentry","category-arduino","category-esp32","tag-arduino","tag-esp32","tag-sd"],"_links":{"self":[{"href":"https:\/\/www.xpablo.cz\/index.php?rest_route=\/wp\/v2\/posts\/1477","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xpablo.cz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xpablo.cz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xpablo.cz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xpablo.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1477"}],"version-history":[{"count":15,"href":"https:\/\/www.xpablo.cz\/index.php?rest_route=\/wp\/v2\/posts\/1477\/revisions"}],"predecessor-version":[{"id":1634,"href":"https:\/\/www.xpablo.cz\/index.php?rest_route=\/wp\/v2\/posts\/1477\/revisions\/1634"}],"wp:attachment":[{"href":"https:\/\/www.xpablo.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xpablo.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xpablo.cz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}