. Tujuan utamanya adalah untuk mencoba melepaskan chip esp32d0wdq6. Bukan modul selesai itu sendiri, tetapi sirkuit mikro terpisah dengan Flash dan PSRAM terpisah. Bagaimana itu dilakukan dan bekerja, dengan demo video, baca dan lihat lebih jauh
Di sini Anda dapat membaca tentang iterasi pertama papan
Boot
Log Booting
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:4
load:0x3fff0034,len:7076
load:0x40078000,len:14600
load:0x40080400,len:4160
0x40080400: _init at ??:?
entry 0x40080684
I (28) boot: ESP-IDF v4.2-dev-2243-gcf056a7d0-dirty 2nd stage bootloader
I (29) boot: compile time 18:51:57
I (30) boot: chip revision: 1
I (33) boot_comm: chip revision: 1, min. bootloader chip revision: 0
I (52) boot.esp32: SPI Speed: 40MHz
I (53) boot.esp32: SPI Mode: DIO
I (53) boot.esp32: SPI Flash Size: 8MB
I (56) boot: Enabling RNG early entropy sourceβ¦
I (62) boot: Partition Table:
I (65) boot: ## Label Usage Type ST Offset Length
I (73) boot: 0 factory factory app 00 00 00010000 000e8000
I (80) boot: 1 wifidata WiFi data 01 02 000fc000 00004000
I (88) boot: 2 wad unknown 42 06 00100000 004f4000
I (95) boot: End of partition table
I (99) boot_comm: chip revision: 1, min. application chip revision: 0
I (106) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x38f98 (233368) map
I (216) esp_image: segment 1: paddr=0x00048fc0 vaddr=0x3ffb0000 size=0x07058 ( 28760) load
I (230) esp_image: segment 2: paddr=0x00050020 vaddr=0x400d0020 size=0x86370 (549744) map
0x400d0020: _stext at ??:?
I (468) esp_image: segment 3: paddr=0x000d6398 vaddr=0x3ffb7058 size=0x04ec4 ( 20164) load
I (478) esp_image: segment 4: paddr=0x000db264 vaddr=0x40080000 size=0x00404 ( 1028) load
0x40080000: _WindowOverflow4 at /esp/v3.3.2/esp-idf/components/freertos/xtensa/xtensa_vectors.S:1730
I (479) esp_image: segment 5: paddr=0x000db670 vaddr=0x40080404 size=0x12b7c ( 76668) load
I (538) boot: Loaded app from partition at offset 0x10000
I (538) boot: Disabling RNG early entropy sourceβ¦
I (549) psram: This chip is ESP32-D0WD
I (551) spiram: Found 64MBit SPI RAM device
I (551) spiram: SPI RAM mode: flash 40m sram 40m
I (555) spiram: PSRAM initialized, cache is in low/high (2-core) mode.
I (562) cpu_start: Pro cpu up.
I (566) cpu_start: Starting app cpu, entry point is 0x4008191c
0x4008191c: start_cpu0_default at /esp/v3.3.2/esp-idf/components/esp32/cpu_start.c:466
I (0) cpu_start: App cpu up.
I (1454) spiram: SPI SRAM memory test OK
I (1462) cpu_start: Pro cpu start user code
I (1462) cpu_start: Application information:
I (1462) cpu_start: Project name: esp32_doom
I (1466) cpu_start: App version: 085f21b-dirty
I (1472) cpu_start: Compile time: Jul 26 2020 18:51:49
I (1478) cpu_start: ELF file SHA256: 9166eca39a0109f9β¦
I (1484) cpu_start: ESP-IDF: v4.2-dev-2243-gcf056a7d0-dirty
I (1491) heap_init: Initializing. RAM available for dynamic allocation:
I (1498) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (1504) heap_init: At 3FFCF628 len 000109D8 (66 KiB): DRAM
I (1511) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (1517) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (1524) heap_init: At 40092F80 len 0000D080 (52 KiB): IRAM
I (1530) spiram: Adding pool of 4096K of external SPI memory to heap allocator
I (1539) spi_flash: detected chip: generic
I (1543) spi_flash: flash io: dio
I (1548) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (1557) spiram: Reserving pool of 32K of internal memory for DMA/internal allocations
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:4
load:0x3fff0034,len:7076
load:0x40078000,len:14600
load:0x40080400,len:4160
0x40080400: _init at ??:?
entry 0x40080684
I (28) boot: ESP-IDF v4.2-dev-2243-gcf056a7d0-dirty 2nd stage bootloader
I (29) boot: compile time 18:51:57
I (30) boot: chip revision: 1
I (33) boot_comm: chip revision: 1, min. bootloader chip revision: 0
I (52) boot.esp32: SPI Speed: 40MHz
I (53) boot.esp32: SPI Mode: DIO
I (53) boot.esp32: SPI Flash Size: 8MB
I (56) boot: Enabling RNG early entropy sourceβ¦
I (62) boot: Partition Table:
I (65) boot: ## Label Usage Type ST Offset Length
I (73) boot: 0 factory factory app 00 00 00010000 000e8000
I (80) boot: 1 wifidata WiFi data 01 02 000fc000 00004000
I (88) boot: 2 wad unknown 42 06 00100000 004f4000
I (95) boot: End of partition table
I (99) boot_comm: chip revision: 1, min. application chip revision: 0
I (106) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x38f98 (233368) map
I (216) esp_image: segment 1: paddr=0x00048fc0 vaddr=0x3ffb0000 size=0x07058 ( 28760) load
I (230) esp_image: segment 2: paddr=0x00050020 vaddr=0x400d0020 size=0x86370 (549744) map
0x400d0020: _stext at ??:?
I (468) esp_image: segment 3: paddr=0x000d6398 vaddr=0x3ffb7058 size=0x04ec4 ( 20164) load
I (478) esp_image: segment 4: paddr=0x000db264 vaddr=0x40080000 size=0x00404 ( 1028) load
0x40080000: _WindowOverflow4 at /esp/v3.3.2/esp-idf/components/freertos/xtensa/xtensa_vectors.S:1730
I (479) esp_image: segment 5: paddr=0x000db670 vaddr=0x40080404 size=0x12b7c ( 76668) load
I (538) boot: Loaded app from partition at offset 0x10000
I (538) boot: Disabling RNG early entropy sourceβ¦
I (549) psram: This chip is ESP32-D0WD
I (551) spiram: Found 64MBit SPI RAM device
I (551) spiram: SPI RAM mode: flash 40m sram 40m
I (555) spiram: PSRAM initialized, cache is in low/high (2-core) mode.
I (562) cpu_start: Pro cpu up.
I (566) cpu_start: Starting app cpu, entry point is 0x4008191c
0x4008191c: start_cpu0_default at /esp/v3.3.2/esp-idf/components/esp32/cpu_start.c:466
I (0) cpu_start: App cpu up.
I (1454) spiram: SPI SRAM memory test OK
I (1462) cpu_start: Pro cpu start user code
I (1462) cpu_start: Application information:
I (1462) cpu_start: Project name: esp32_doom
I (1466) cpu_start: App version: 085f21b-dirty
I (1472) cpu_start: Compile time: Jul 26 2020 18:51:49
I (1478) cpu_start: ELF file SHA256: 9166eca39a0109f9β¦
I (1484) cpu_start: ESP-IDF: v4.2-dev-2243-gcf056a7d0-dirty
I (1491) heap_init: Initializing. RAM available for dynamic allocation:
I (1498) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (1504) heap_init: At 3FFCF628 len 000109D8 (66 KiB): DRAM
I (1511) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (1517) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (1524) heap_init: At 40092F80 len 0000D080 (52 KiB): IRAM
I (1530) spiram: Adding pool of 4096K of external SPI memory to heap allocator
I (1539) spi_flash: detected chip: generic
I (1543) spi_flash: flash io: dio
I (1548) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (1557) spiram: Reserving pool of 32K of internal memory for DMA/internal allocations
KiCad PCB
Di KiCad, menurut saya lebih mudah. Untuk seleraku, tentu saja. Sedikit berbeda dengan Eagle Autodesk. Nilai tambah utama adalah tidak ada batasan jumlah biaya jika Anda tidak ingin membayar lisensi. Izinkan saya mengingatkan Anda bahwa Eagle memiliki batas ukuran 100x80mm untuk pengembangan gratis. Jika biayanya lebih besar, Anda harus membayar lisensi tahunan. Menurut saya, ada juga batasan jumlah lapisan
Saya tidak bisa melihat Tampilan 3D di Eagle. Eagle Fusion 360 perlu diinstal. Di Kicad, ini adalah item menu yang terpisah. Meskipun saya mungkin tidak melihat ke sana. Secara umum, kami dapat mengatakan sepenuhnya beralih ke KiCad, membagi
semuanya menjadi modul, meninggalkan di halaman utama apa yang terkait langsung dengan ESP32. Chip itu sendiri dan memori
Kesalahan
Saya menggambar papan itu dalam jeda. Akibatnya, saya lupa mengeluarkan GPIO0. Saya membawanya ke DAC eksternal sebagai MCCLK, tetapi saya lupa membawanya ke tombol mode boot. Saya harus merobek pernis dari jalur penyolderan untuk keluaran tombol. Juga, resistor di sirkuit kuarsa diatur ke XTAL_N dan di manual perlu XTAL_P. Saya menggantung resistor beberapa ohm, tetapi mungkin untuk melempar jumper.
Alamat dan Reset resistor untuk MCP23017 tidak bercerai. Chip dapat diatur ke alamat I2C dengan tiga pin. 0x20h saat ketiga pin berada di tanah. Semua karena saya tidak menentukan FootPrint,
saya tidak memperhatikan kesalahannya
Kesalahan: Tidak dapat menambahkan R10 (tidak ada footprint yang ditetapkan).
Kesalahan: Tidak dapat menambahkan R9 (tidak ada footprint yang ditetapkan)
I2C bingung untuk ES8374. Terkadang itu terjadi. Pada prinsipnya, dapat digunakan dengan mengganti pin 21 -> 22 dan 22 -> 21. Atau potong jalurnya dan kikis pernisnya, seperti yang biasa kita lakukan dengan TX RX Uart (Senyum sedih)
Anehnya, setelah menyolder ESP32 dan FLASH, papan mulai menyala tanpa masalah. Tapi, setelah meletakkan SPRAM, saya mendapat reboot tanpa akhir. Ternyata itu adalah kekurangan makanan yang dangkal. Saya akan mencari jika ESP32 tidak disolder!
Multiplexer MCP23017
Memberikan kemungkinan polling alternatif tombol baik melalui multiplexer MCP23017 dan menggunakan DAC. Di pembagi resistif. Jika multiplekser tidak memungkinkan, Anda dapat menggunakan ADC internal. Dengan level voltase pada input GPIO34, Anda dapat mendeteksi penekanan tombol. Kekurangannya adalah tidak mungkin untuk mengumpulkan beberapa tombol pada waktu yang bersamaan. Plus, masing-masing, bahwa tidak diperlukan sirkuit mikro tambahan. Hanya beberapa resistor
Multiplexer memiliki 2 port 8 pin. Satu port, dalam kasus kami, dapat dikonfigurasi sebagai output dan LED dapat digantung padanya. Saya ingin menyediakan kedipan jika masa pakai kurang dari 20% atau kartrid habis. Kemudian Anda bisa bermain tanpa panel. Ternyata itu terwujud. Satu LED hijau tetap ada. Jika tidak ada musuh di ruangan atau di garis pandang, Anda bisa menerangi
Benang indikator kesehatan dan amunisi
void ledTask(void *arg){
while(1){
p = &players[cur_player];
if (p->mo != NULL && p->mo->health < 20) {
mcp23x17_set_level(&dev, 9, on);
} else {
mcp23x17_set_level(&dev, 9, true);
}
if(p->ammo[weaponinfo[p->readyweapon].ammo] < 5){
mcp23x17_set_level(&dev, 10, on);
} else {
mcp23x17_set_level(&dev, 10, true);
}
printf("p->ammo[am_clip] = %d\n", p->ammo[weaponinfo[p->readyweapon].ammo]);
if (p->mo != NULL) {
printf("p->mo->health = %d \n", p->mo->health);
}
printf("Ammo N = %d\n", weaponinfo[p->readyweapon].ammo);
on = !on;
vTaskDelay(1000/portTICK_PERIOD_MS);
}
}
Chip audio ES8374
Untuk suara, saya menggunakan ES8374 sebagai DAC dan ADC. Sirkuit mikro berisi penguat frekuensi rendah built-in ~ 1,25 Watt. Ini didukung langsung oleh Espressif Audio Development Framework . Dalam paket kecil QFN-28, kami mendapatkan Mono DAC, ADC untuk mikrofon, dan ULF dengan dukungan SDK. Apa yang dibutuhkan untuk perangkat seperti itu
Meluncurkan Speaker BT dari contoh pipeline_bt_sink
Saya mengambil papan lyrat_v4_3 dalam pengaturan. Memperbaiki codec pada AUDIO_CODEC_ES8374_DEFAULT_HANDLE
port GPIO yang dikonfigurasi
esp_err_t get_i2s_pins(i2s_port_t port, i2s_pin_config_t *i2s_config)
{
AUDIO_NULL_CHECK(TAG, i2s_config, return ESP_FAIL);
if (port == I2S_NUM_0 || port == I2S_NUM_1) {
i2s_config->bck_io_num = GPIO_NUM_18;
i2s_config->ws_io_num = GPIO_NUM_26;
i2s_config->data_out_num = GPIO_NUM_27;
i2s_config->data_in_num = GPIO_NUM_35;
} else {
memset(i2s_config, -1, sizeof(i2s_pin_config_t));
ESP_LOGE(TAG, "i2s port %d is not supported", port);
return ESP_FAIL;
}
return ESP_OK;
}
Dan membuang inisialisasi audio_board_key_init dan audio_board_led_init. Dengan yang benar, Anda perlu menentukan papan kustom Anda
Giroskop L3GD20
Saya memutuskan untuk menambahkan giroskop L3GD20. Fitur yang menarik adalah dapat dihubungkan sebagai perangkat SPI atau I2C. R27, R28 dalam hal koneksi melalui I2C mengatur alamatnya
// Alamat L3GD20HAda perpustakaan di GitHub l3gd20h-esp-idf
# tentukan L3GD20H_I2C_ADDRESS_1 0x6a // Pin SDO rendah
# tentukan L3GD20H_I2C_ADDRESS_2 0x6b // Pin SDO tinggi
Jadi, kami memiliki 3 perangkat di I2C. Kontrol ADC-DAC ES8374, tombol pada MCP23017 dan L3GD20 itu sendiri. Meluncurkan ketiganya
i2cdetect
i2c-tools> i2cdetect
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: β -- β -- β -- β -- β -- β -- β -- β --
10: 10 β -- β -- β -- β -- β -- β -- β -- β
20: β -- β -- 24 β -- β -- β -- β -- β -- β
30: β -- β -- β -- β -- β -- β -- β -- β --
40: β -- β -- β -- β -- β -- β -- β -- β --
50: β -- β -- β -- β -- β -- β -- β -- β --
60: β -- β -- β -- β -- β -- 6a β -- β -- β
70: β -- β -- β -- β -- β -- β -- β -- β --
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: β -- β -- β -- β -- β -- β -- β -- β --
10: 10 β -- β -- β -- β -- β -- β -- β -- β
20: β -- β -- 24 β -- β -- β -- β -- β -- β
30: β -- β -- β -- β -- β -- β -- β -- β --
40: β -- β -- β -- β -- β -- β -- β -- β --
50: β -- β -- β -- β -- β -- β -- β -- β --
60: β -- β -- β -- β -- β -- 6a β -- β -- β
70: β -- β -- β -- β -- β -- β -- β -- β --
Namun untuk beberapa alasan, L3GD20 tidak memberikan koordinat. WHO_AM_I menjawab 0xd4 dengan benar. sudut tidak berubah. Saya tidak memiliki kapasitor C1 - 10nF, saya mencoba meletakkannya, yang menemukan 100nF terdekat. Saya pikir meskipun dia berbohong, tetapi tampaknya konverter internal tidak mulai. Dan ini penting
i2cdump
i2c-tools> i2cdump -c 0x6a
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: b6 5e 81 fc 05 50 31 83 c4 f9 85 d0 48 c6 00 d4 ?^???P1?????H?.?
10: 1a 15 16 ea c0 b9 4f 72 07 d8 a1 21 a1 00 14 02 ??????Or???!?.??
20: 07 00 00 80 00 00 0c 00 1a 00 13 00 16 00 00 20 ?..?..?.?.?.?..
30: 00 00 00 00 00 00 00 00 00 05 00 00 00 00 00 00 .........?..
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00β¦
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00β¦
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00β¦
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00β¦
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: b6 5e 81 fc 05 50 31 83 c4 f9 85 d0 48 c6 00 d4 ?^???P1?????H?.?
10: 1a 15 16 ea c0 b9 4f 72 07 d8 a1 21 a1 00 14 02 ??????Or???!?.??
20: 07 00 00 80 00 00 0c 00 1a 00 13 00 16 00 00 20 ?..?..?.?.?.?..
30: 00 00 00 00 00 00 00 00 00 05 00 00 00 00 00 00 .........?..
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00β¦
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00β¦
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00β¦
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00β¦
Menampilkan 18 pin ILI9341
Menghitung arus lampu latar sebagai berikut. Membutuhkan 90mA. Karena penurunan transistor terbuka adalah ~ 0,7V, catu daya untuk lampu latar LED adalah 3,3V - 0,7V = 2,6V. Dan menurut Hukum Ohm 2.6V / 0.090A = 28.8 Ohm. Mengirimkan 47 Ohm. Ternyata agak gelap. Ini akan diperlukan untuk mengurangi resistensi
, dan Touch XPT2046TS dipisahkan. Pin SPI digantung sejajar dengan layar. XPT_CS ditampilkan pada pin terpisah. Ada keraguan bahwa itu akan berhasil. Jika tampilan tidak dimulai, saya akan melakukan eksperimen. Untuk konsol, itu tidak terlalu dibutuhkan. Mengambil dari contoh
Demo
Meluncurkan demo LVGL. Dalam contoh pengaturan, saya mencoba mengatur 40MHz untuk bus SPI. Contoh bekerja sedikit lebih cepat daripada video
Tapi Doom mulai dan bekerja secara stabil hanya pada 32MHz. Meskipun 26MHz untuk ILI9341 sudah dianggap overclocking
spi_device_interface_config_t devcfg={
.clock_speed_hz=26000000, //Clock out at 26 MHz. Yes, that's heavily overclocked.
.mode=0, //SPI mode 0
.spics_io_num=PIN_NUM_CS, //CS pin
.queue_size=NO_SIM_TRANS, //We want to be able to queue this many transfers
.pre_cb=ili_spi_pre_transfer_callback, //Specify pre-transfer callback to handle D/C line
};
Kesimpulan
Port ESP32 I / O tidak selalu cukup untuk memuat secara maksimal. Dalam hal ini, STM32 terlihat lebih menarik. Tetapi tidak memiliki dukungan Wi-Fi bawaan .
Kesimpulannya, saya perhatikan bahwa perangkat dapat menjalankan emulator Nintendo ESP32-NESEMU, dan emulator Nintendo Entertainment System untuk ESP32.
Saya memesan Konsol Game dengan Ali. Akan menarik untuk melihat apa yang ada di dalamnya. Mungkin ESP32 juga
Saya menantikan diskusi dan saran di komentar.