Небольшая плата ESP32 с дисплеем. Идея была сделать аналог референсного esp32-lyrat но в меньших размерах. На плате разведен дисплей ES8388 ADC-DAC, вывод на стерео наушники и внешний усилитель моно, а также микрофон, кнопки и джойстик


Элементная база


8 MB Flash / 8 MB PSRAM
ST7789 Display
ES8388 ADC-DAC / PAM8302
SDCARD
CP2102


Антенна




Пришла в голову идея сделать плату с 2.4-GHz Inverted F антеной. По сравнению с PCB антенной которую используют для USB dongle reference design, F антенна обладает лучшими характеристиками, но имеет немного большие размеры, и широкую полоса пропускания

Импеданс сопротивления антенны 50 Ом требует согласования с ESP32



«The output impedance of the RF pins of ESP32 (QFN 6*6) and ESP32 (QFN 5*5) are (30+j10) ? and (35+j10) ?, respectively»

Воспользуемся калькулятором для расчета.

Дисплей ST7789


ST7789 это дешевый компактный 240x240 цветной дисплей. Подключается через SPI интерфейс как и в предыдуший статье



Ресет дисплея работает только по включению. Схема сброса дисплея это резистор 10 КОм к VDD. Если во время вывода изображения вызвать ресет ESP32 то картинка уже не будет отображаться. Надо делать отдельным выводом на ногу ESP32 или пробовать подводить к AEN сброса самого микроконтроллера. Так же забыл вывести CS. Пришлось вешать волосок на землю. Вопрос нужно ли отключать подсветку или можно CS управлять энергопотреблением дисплея

Звук ES8388


ЦАП выполнен на ES8388. В нем так же имеется АЦП. Ранее я уже запускал аналогичный АЦП от
Everest ES8374. ES8374 в отличии от ES8388 имеет моно выход с усилителем около 1 ватта.



При запуске ES8388 однако возникли проблемы. Неясная ситуация с выходом на наушники. В референсной esp32-lyrat-v4.2 выходы на наушники LOUT1 и ROUT1 но микросхема DAC8388 имеет дифференциальные выходы левого и правого канала. То что я слышал в наушниках это шум и слабый уровень сигнала. Надо разобраться как включать выходы в правильном режиме. В примерах для этих референсных плат нет особого кода переключения.

PAM8302



Внешний усилитель планировал поставить из линейки PAM. Они хорошо известны по усилителю
Class-D and Class-AB PAM8406. Но мне потребовался моно вариант. Его пока не распаивал

Микрофон



ICS-43432 микрофон подключается по шине I2S. Вывод LR отвечает за конфигурирование левого или правого канала. Левый на землю, правый на VDD

PSRAM W25Q64


Забыл вывести 7 вывод PSRAM. PSRAM вешается параллельно W25Q64 за исключением вывода тактирования и CS. CS надо подтянуть резистором к VDD

Кнопки и джойстик


Внешнее управление организовано на резистивном делителе. Уровни напряжения определяются внутренним АЦП. В зависимости от того какая кнопка нажата формируется определенное для делителя напряжение. Померяв на входе АЦП уровень можно определить нажатую кнопку

UART CP2102


UART интерфейс традиционно на CP2102. Тут лотерея если покупать у Китайцев. В одной партии могут быть разные ID. Например у меня определялась #lsusb как Verifon и устройства /dev/ttyUSB не обнаруживалось. Добавил примерно так где 10c4 804c это vid pid. Кстати слетает после перезагрузки.

sudo modprobe cp210x
sudo -s
echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id



WiFi


WiFi заработал не сразу. BT так и не получилось связаться. В режиме BT колонки устройство видно, но соединение установить не получается. Очень важно, как оказалось правильно подвести питание на чип ESP32. Дорожки должны быть как можно толще. На каждый внутренний блок, к которому подводится питание должен стоять шунтирующий конденсатор. Только когда я пропаял сверху дорожку и повесил дополнительно в одном месте конденсатор по питанию прямо на дорожку, чип завел Wi-Fi. До этого в логах начинался мусор и все висло когда доходило до старта WiFi

Boot WiFi scan Log
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:7068
load:0x40078000,len:14600
load:0x40080400,len:4160
0x40080400: _init at ??:?

entry 0x40080684
I (29) boot: ESP-IDF v4.2-dev-2243-gcf056a7d0-dirty 2nd stage bootloader
I (29) boot: compile time 17:00:41
I (30) boot: chip revision: 1
I (34) boot_comm: chip revision: 1, min. bootloader chip revision: 0
I (51) boot.esp32: SPI Speed: 40MHz
I (52) boot.esp32: SPI Mode: DIO
I (52) boot.esp32: SPI Flash Size: 4MB
I (54) boot: Enabling RNG early entropy source…
I (60) boot: Partition Table:
I (63) boot: ## Label Usage Type ST Offset Length
I (71) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (78) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (86) boot: 2 factory factory app 00 00 00010000 00100000
I (93) boot: End of partition table
I (97) boot_comm: chip revision: 1, min. application chip revision: 0
I (104) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x1b81c (112668) map
I (162) esp_image: segment 1: paddr=0x0002b844 vaddr=0x3ffb0000 size=0x03b04 ( 15108) load
I (169) esp_image: segment 2: paddr=0x0002f350 vaddr=0x40080000 size=0x00404 ( 1028) load
0x40080000: _WindowOverflow4 at /home/dm/esp/esp-idf/components/freertos/xtensa/xtensa_vectors.S:1730

I (170) esp_image: segment 3: paddr=0x0002f75c vaddr=0x40080404 size=0x008bc ( 2236) load
I (179) esp_image: segment 4: paddr=0x00030020 vaddr=0x400d0020 size=0x78d34 (494900) map
0x400d0020: _stext at ??:?

I (401) esp_image: segment 5: paddr=0x000a8d5c vaddr=0x40080cc0 size=0x194d0 (103632) load
I (466) boot: Loaded app from partition at offset 0x10000
I (466) boot: Disabling RNG early entropy source…
I (478) psram: This chip is ESP32-D0WD
E (479) psram: PSRAM ID read error: 0xffffffff
E (479) spiram: SPI RAM enabled but initialization failed. Bailing out.
I (486) cpu_start: Failed to init external RAM; continuing without it.
I (493) cpu_start: Pro cpu up.
I (497) cpu_start: Starting app cpu, entry point is 0x400816d8
0x400816d8: call_start_cpu1 at /home/dm/esp/esp-idf/components/esp_system/port/cpu_start.c:109

I (0) cpu_start: App cpu up.
I (518) cpu_start: Pro cpu start user code
I (518) cpu_start: Application information:
I (518) cpu_start: Project name: scan
I (523) cpu_start: App version: v4.2-dev-2243-gcf056a7d0-dirty
I (530) cpu_start: Compile time: Nov 6 2020 17:00:39
I (536) cpu_start: ELF file SHA256: 7ea95a8a24884f2f…
I (542) cpu_start: ESP-IDF: v4.2-dev-2243-gcf056a7d0-dirty
I (550) heap_init: Initializing. RAM available for dynamic allocation:
I (556) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (562) heap_init: At 3FFB9510 len 00026AF0 (154 KiB): DRAM
I (569) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (575) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (581) heap_init: At 4009A190 len 00005E70 (23 KiB): IRAM
I (589) spi_flash: detected chip: generic
I (592) spi_flash: flash io: dio
W (596) spi_flash: Detected size(8192k) larger than the size in the binary image header(4096k). Using the size in the binary image header.
I (611) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (735) wifi:wifi driver task: 3ffc1ed4, prio:23, stack:6656, core=0
I (735) system_api: Base MAC address is not set
I (735) system_api: read default base MAC address from EFUSE
I (765) wifi:wifi firmware version: bbe4b67
I (765) wifi:wifi certification version: v7.0
I (765) wifi:config NVS flash: enabled
I (765) wifi:config nano formating: disabled
I (765) wifi:Init data frame dynamic rx buffer num: 32
I (775) wifi:Init management frame dynamic rx buffer num: 32
I (775) wifi:Init management short buffer num: 32
I (785) wifi:Init static tx buffer num: 16
I (785) wifi:Init static rx buffer size: 1600
I (795) wifi:Init static rx buffer num: 10
I (795) wifi:Init dynamic rx buffer num: 32
I (895) phy: phy_version: 4182, f1ba940, Jun 4 2020, 19:40:07, 0, 0
I (905) wifi:mode: sta (98:f4:ab:6c:ed:c4)
I (3005) scan: Total APs scanned = 5
I (3005) scan: SSID ___1_____
I (3005) scan: RSSI -48
I (3005) scan: Authmode WIFI_AUTH_WPA_WPA2_PSK
I (3005) scan: Pairwise Cipher WIFI_CIPHER_TYPE_CCMP
I (3015) scan: Group Cipher WIFI_CIPHER_TYPE_CCMP
I (3015) scan: Channel 12

I (3025) scan: SSID _____2______
I (3025) scan: RSSI -64
I (3025) scan: Authmode WIFI_AUTH_WPA2_PSK
I (3035) scan: Pairwise Cipher WIFI_CIPHER_TYPE_CCMP
I (3035) scan: Group Cipher WIFI_CIPHER_TYPE_CCMP
I (3045) scan: Channel 7

I (3045) scan: SSID ______2_______
I (3055) scan: RSSI -83
I (3055) scan: Authmode WIFI_AUTH_WPA_WPA2_PSK
I (3065) scan: Pairwise Cipher WIFI_CIPHER_TYPE_TKIP_CCMP
I (3065) scan: Group Cipher WIFI_CIPHER_TYPE_TKIP
I (3075) scan: Channel 3

I (3075) scan: SSID ____3____
I (3075) scan: RSSI -92
I (3085) scan: Authmode WIFI_AUTH_WPA2_PSK
I (3085) scan: Pairwise Cipher WIFI_CIPHER_TYPE_CCMP
I (3095) scan: Group Cipher WIFI_CIPHER_TYPE_CCMP
I (3095) scan: Channel 3

I (3105) scan: SSID ___4______
I (3105) scan: RSSI -94
I (3105) scan: Authmode WIFI_AUTH_WPA2_PSK
I (3115) scan: Pairwise Cipher WIFI_CIPHER_TYPE_CCMP
I (3125) scan: Group Cipher WIFI_CIPHER_TYPE_CCMP
I (3125) scan: Channel 8

Запуск теста esp-idf-st7789


ST7789 test log
I (2992) FillTest: elapsed time[ms]:1650
I (7042) ColorBarTest: elapsed time[ms]:50
I (11322) ArrowTest: elapsed time[ms]:280
I (17422) LineTest: elapsed time[ms]:2100
I (23292) CircleTest: elapsed time[ms]:1870
I (29192) RoundRectTest: elapsed time[ms]:1900
I (39192) RectAngleTest: elapsed time[ms]:6000
I (50152) TriangleTest: elapsed time[ms]:6960
I (54632) DirectionTest: elapsed time[ms]:480
I (59682) HorizontalTest: elapsed time[ms]:1050
I (64722) VerticalTest: elapsed time[ms]:1040
I (68902) FillRectTest: elapsed time[ms]:180
I (73152) ColorTest: elapsed time[ms]:250
I (78182) BMPTest: elapsed time[ms]:1030
I (82322) JPEGTest: decode_image err=0 imageWidth=240 imageHeight=240
I (84732) JPEGTest: elapsed time[ms]:2550
I (95282) FillTest: elapsed time[ms]:1650
I (99332) ColorBarTest: elapsed time[ms]:50
I (103602) ArrowTest: elapsed time[ms]:270
I (109702) LineTest: elapsed time[ms]:2100
I (115572) CircleTest: elapsed time[ms]:1870
I (121472) RoundRectTest: elapsed time[ms]:1900
I (131472) RectAngleTest: elapsed time[ms]:6000
I (142432) TriangleTest: elapsed time[ms]:6960
I (146862) DirectionTest: elapsed time[ms]:430
I (151912) HorizontalTest: elapsed time[ms]:1050
I (156952) VerticalTest: elapsed time[ms]:1040
I (161162) FillRectTest: elapsed time[ms]:210
I (165412) ColorTest: elapsed time[ms]:250
I (170342) BMPTest: elapsed time[ms]:930

Схема с исправлениями