Bahasa: ID

ESP32 tidak mau menyala dengan kartu SD di GPIO12

Catatan · Terbit

ESP32 di breadboard, terhubung dengan kabel jumper ke layar dan modul kartu microSD

Kamu memasang modul kartu SD ke ESP32 dan meng-upload sketch. Lalu papannya tidak mau menyala. Papan terus reset, atau tidak menampilkan apa pun. Cabut modul SD, dan semuanya normal lagi.

Kalau kabel MISO modul itu terpasang di GPIO12, hampir pasti itu penyebabnya. Bukan kartunya, bukan juga kodenya. Penyebabnya adalah cara ESP32 memilih tegangan flash saat dinyalakan.

Gejalanya

  • Papan terus reset, atau seperti mati, tapi hanya saat modul SD terpasang.

  • Di serial monitor (115200 baud), pesan boot berhenti di awal. Sering baris terakhirnya seperti ini.

    flash read err, 1000
    ets_main.c 371
    
  • Mencabut kabel MISO saja sudah membuatnya menyala lagi.

Kenapa ini terjadi

GPIO12 adalah pin strapping. Saat dinyalakan dan setiap kali reset, ESP32 membaca beberapa pin satu kali, sebelum kodemu berjalan, untuk menentukan cara mulai. GPIO12 menentukan tegangan memori flash, tempat programmu disimpan.

GPIO12 saat reset Tegangan flash
Low (bawaan) 3,3 V
High 1,8 V

ESP32 punya pull-down lemah di GPIO12, jadi pin terbaca low dan ESP32 memilih 3,3 V. Itu nilai yang benar untuk modul ESP32-WROOM-32 yang umum.

Banyak modul kartu SD punya resistor pull-up di jalur datanya, termasuk MISO, karena kartu SD membutuhkannya. Di GPIO12, resistor itu mengalahkan pull-down yang lemah. ESP32 membaca high, memberi flash tegangan 1,8 V, dan tidak bisa membaca programnya sendiri.

Jebakan ini mudah terjadi, karena GPIO12 adalah pin MISO bawaan bus SPI kedua ESP32 (HSPI). Pin HSPI bawaan adalah 14 (SCK), 13 (MOSI), 12 (MISO) dan 15 (CS), jadi banyak tutorial dan diagram pin memasang kartu SD tepat di sana.

Cara saya menghindarinya

Untuk penampil foto ESP32 saya, kartu SD saya taruh di HSPI, di bus sendiri. Saya tetap memakai 14, 13 dan 15, dan hanya memindahkan MISO ke GPIO27.

#define PIN_SD_SCLK    14
#define PIN_SD_MOSI    13
#define PIN_SD_MISO    27   // not GPIO12, the board won't boot
#define PIN_SD_CS      15

ESP32 bisa mengarahkan SPI ke hampir semua pin, jadi SPIClass di Arduino tinggal menerima pin yang kita berikan.

static SPIClass sdSpi(HSPI);

sdSpi.begin(PIN_SD_SCLK, PIN_SD_MISO, PIN_SD_MOSI, PIN_SD_CS);
SD.begin(PIN_SD_CS, sdSpi, 20000000);

Pin yang bukan bawaan lewat GPIO matrix ESP32. Ada sedikit tambahan jeda, tapi kartu SD di 20 MHz tidak terpengaruh.

Tiga cara memperbaikinya

  1. Pindahkan kabel ke pin lain. Ini cara terbaik. GPIO27, 26, 25, 33 atau 32 semuanya bisa untuk MISO. Cukup ganti satu kabel dan satu angka di kode.

  2. Kunci tegangan flash di dalam chip. Sebuah eFuse bisa “dibakar” supaya ESP32 selalu memakai 3,3 V dan mengabaikan GPIO12. Setelah itu GPIO12 jadi pin biasa. Ini permanen, dan hanya aman di modul dengan flash 3,3 V, seperti ESP32-WROOM-32. Beberapa modul ESP32-WROVER memakai flash 1,8 V, dan cara ini akan merusaknya. Cara ini untuk papan yang sudah jadi dan tidak bisa diubah kabelnya. esptool dari Espressif punya perintah untuk ini. Cek dokumentasi esptool untuk versimu, karena nama perintahnya pernah berubah.

    $ espefuse.py --port /dev/ttyUSB0 set_flash_voltage 3.3V
    
  3. Lepas pull-up MISO dari modulnya. Ini berhasil, tapi kamu butuh pull-up di tempat lain, dan mudah lupa di modul berikutnya.

Pin strapping lainnya

GPIO12 bukan satu-satunya. ESP32 juga membaca GPIO0, 2, 5 dan 15 saat reset.

  • GPIO0 dan GPIO2 memilih antara menjalankan program atau menunggu upload. Jangan pasang sesuatu yang menarik pin ini ke arah yang salah.
  • GPIO15 menyalakan atau mematikan pesan boot di port serial, dan GPIO5 mengatur timing mode slave SDIO. Keduanya aman dalam praktik, jadi saya memakai GPIO15 untuk CS kartu SD dan GPIO5 untuk CS layar.

Kalau papan tidak mau menyala, periksa dulu apa yang terpasang di kelima pin ini.

Tautan

← Kembali ke semua tulisan