ESP32的毁灭男孩 第二次迭代

不用等待董事会,DoomWatch就通过联邦快递交付了新订单。这次我在KiCad中拆分了板。奇怪的是,Kicad甚至更喜欢Eagle AutoDesk







。主要目标是尝试拆解esp32d0wdq6芯片。不是成品模块本身,而是带有单独的Flash和PSRAM的单独的微电路。如何完成和工作以及视频演示,请阅读并进一步了解



在这里,您可以了解董事会第一次迭代



开机



启动日志
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





KiCad PCB



在KiCad中,在我看来,一切都变得更加容易。就我的口味而言。与Eagle Autodesk略有不同。主要优点是,如果您不想支付许可证费用,则费用没有限制。让我提醒您,Eagle的尺寸为100x80mm,可以自由开发。如果费用更高,则必须支付年度许可证。我认为层数也有限制







我在Eagle中看不到3D视图。必须安装Eagle Fusion360。在Kicad中,这是一个单独的菜单项。虽然我可能没有看过那里。通常,我们可以说完全切换到KiCad



,将所有内容都划分为模块,在主页上保留与ESP32直接相关的内容。芯片本身和内存





失误



我暂时停下来画板。结果,我忘记了输出GPIO0。我以MCCLK的形式将其带到外部DAC,但忘记了将其带到下载模式按钮。我不得不从焊接轨道上撕下清漆以得到按钮输出。另外,石英电路中的电阻设置为XTAL_N,在手册中有必要将其设置为XTAL_P。我挂了一个几欧姆的电阻,但我可能扔了跳线



,MCP23017地址和复位电阻没有离婚。可以通过三个引脚将芯片设置为I2C地址。当所有三个引脚都接地时为0x20h。都是因为我没有指定FootPrint,



所以我没有注意该错误

错误:无法添加R10(未分配足迹)。

错误:无法添加R9(未分配足迹)




ES8374的i2C感到困惑。有时候这种情况会发生。原则上,可以通过切换引脚21-> 22和22-> 21来使用。还是像我们通常使用TX RX Uart(悲伤的笑容)那样,切掉轨道并刮掉清漆。







令人惊讶的是,在焊接ESP32和FLASH之后,电路板可以毫无问题地启动。但是,安装了SPRAM之后,我无休止地重启。事实证明这是一种普遍缺乏的食物。我会看看ESP32是否未焊接!







多路复用器MCP23017



提供了通过MCP23017多路复用器和使用DAC进行按钮交替轮询的可能性。在电阻分压器上。如果无法放置多路复用器,则可以使用内部ADC。通过GPIO34输入上的电压电平,您可以检测到按钮按下。不利之处是不可能同时轮询多个按钮。另外,分别不需要额外的微电路。仅几个电阻该



多路复用器具有2个8引脚端口。在我们的情况下,一个端口可以配置为输出,并且LED可以挂在它们上。如果寿命不足20%或墨盒用完了,我想提供眨眼信息。然后,您可以在没有面板的情况下进行游戏。事实证明是可以实现的。剩下一个绿色LED。如果房间或视线范围内没有敌人,则可以照亮







健康和弹药指示器的线程
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);
    }
}






ES8374音频芯片



对于声音,我使用ES8374作为DAC和ADC。该微电路包含一个内置的低频放大器〜1.25瓦。Espressif Audio Development Framework提供了开箱即用的支持在小型QFN-28封装中,我们获得了Mono DAC,用于麦克风的ADC和具有SDK支持的ULF。这种设备需要什么,





pipeline_bt_sink示例启动了BT Speaker



,在设置中使用了lyrat_v4_3板。AUDIO_CODEC_ES8374_DEFAULT_HANDLE

配置的GPIO端口上的固定编解码器

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;
}


然后扔掉了audio_board_key_init和audio_board_led_init的初始化。通过正确的选择,您需要确定您的定制板



陀螺仪L3GD20



我决定添加陀螺仪L3GD20。一个有趣的功能是它可以作为SPI或I2C设备连接。通过I2C连接时的R27,R28设置地址

// L3GD20H地址

#define L3GD20H_I2C_ADDRESS_1 0x6a // SDO引脚为低

#define L3GD20H_I2C_ADDRESS_2 0x6b // SDO引脚为高
GitHub上有一个库l3gd20h-esp-idf





因此,我们在I2C上有3个设备。ADC-DAC ES8374控件,MCP23017和L3GD20本身上的按钮。推出了所有三个



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: — -- — -- — -- — -- — -- — -- — -- — --





但是由于某些原因,L3GD20没有给出坐标。WHO_AM_I正确回答0xd4。角度不变。我没有电容器C1-10nF,我试着放到最接近的100nF。我以为即使他在撒谎,但似乎内部转换器无法启动。这很重要



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…





显示18针ILI9341







如下计算背光电流。需要90mA。由于开路晶体管的压降约为0.7V,因此背光LED的电源为3.3V-0.7V = 2.6V。并根据欧姆定律2.6V / 0.090A = 28.8欧姆。交付47欧姆。原来有点黑。必须降低电阻





,而且Touch XPT2046TS已分离。SPI引脚与显示器并联悬挂。XPT_CS显示在单独的引脚上。怀疑它是否会起作用。如果显示器还没有启动,我将做一些实验。对于控制台,不是特别需要。举个例子







演示版



推出LVGL演示。在示例设置中,我尝试为SPI总线设置40MHz。该示例的工作速度比视频要快一些







但是毁灭战士开始了,并且仅在32MHz下稳定工作。尽管ILI9341的26MHz已被视为超频

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
    };








结论



ESP32的I / O端口并不总是足够塞满最大的。在这方面,STM32看起来更具吸引力。但是它没有内置的Wi-Fi支持,



总的来说,我注意到该设备可以运行Nintendo模拟器ESP32-NESEMU和Nintendo娱乐系统模拟器用于ESP32

看看里面有什么会很有趣。也可能是ESP32







我期待评论中的讨论和建议。



All Articles