。主な目標は、esp32d0wdq6チップのはんだを外そうとすることでした。完成したモジュール自体ではなく、別個のフラッシュと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
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では、それは私には簡単に思えました。もちろん、私の好みでは。EagleAutodeskとは少し異なります。主な利点は、ライセンスの支払いを希望しない場合、料金の金額に制限がないことです。Eagleには、無料で開発できる100x80mmのサイズ制限があることを思い出してください。料金がそれ以上の場合は、年間ライセンスを支払う必要があります。私の意見では、レイヤーの数にも制限があります
Eagleで3Dビューを見ることができませんでした。Eagle Fusion 360をインストールする必要があります。Kicadでは、これは別のメニュー項目です。私はそこを見ていなかったかもしれませんが。一般的に、完全にKiCadに切り替えられたと言えます。
すべてをモジュールに分割し、メインページにESP32に直接関連するものを残します。チップ自体とメモリ
エラー
ボードを一時停止して描きました。その結果、GPIO0を出力するのを忘れてしまいました。MCCLKとして外部DACに持ってきましたが、ダウンロードモードボタンに持っていくのを忘れてしまいました。ボタン出力のために、はんだ付けトラックからワニスを剥がさなければなりませんでした。また、クォーツ回路の抵抗はXTAL_Nに設定されており、マニュアルではXTAL_Pにする必要があります。数オームの抵抗を切ったが、ジャンパーを投げることができ
た。MCP23017のアドレス抵抗とリセット抵抗は離婚しなかった。チップは3本のピンでI2Cアドレスに設定できます。3つのピンすべてが地面にある場合は0x20h。FootPrint
を指定しなかったため、エラーに注意を払いませんでした
エラー:R10を追加できません(フットプリントが割り当てられていません)。
エラー:R9を追加できません(フットプリントが割り当てられていません)
ES8374のi2Cが混乱しています。時にはそれが起こります。原則として、スイッチングピン21-> 22および22-> 21を使用できます。または、通常TX RX Uartで行ったように、トラックを切り取ってワニスをこすり落とします(悲しい笑顔)。
驚いたことに、ESP32とFLASHをはんだ付けした後、ボードは問題なく起動しました。しかし、SPRAMを配置すると、無限に再起動しました。それは食べ物の平凡な不足であることが判明しました。ESP32がはんだ付けされていないか探しています!
マルチプレクサーMCP23017
MCP23017マルチプレクサーとDACの両方を介したボタンの代替ポーリングの可能性を提供しました。抵抗分割器について。マルチプレクサを配置できない場合は、内部ADCを使用できます。 GPIO34入力の電圧レベルにより、ボタンの押下を検出できます。欠点は、複数のボタンを同時にポーリングすることができないことです。さらに、それぞれ、追加のマイクロ回路は必要ありません。わずかな抵抗
マルチプレクサには、8ピンの2つのポートがあります。この場合、1つのポートを出力として構成し、LEDをそれらに掛けることができます。寿命が20%未満の場合、またはカートリッジがなくなった場合に点滅を提供したかったのです。その後、パネルなしでプレイできます。それが実現したことが判明しました。 1つの緑色の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オーディオチップ
サウンドには、DACとADCとしてES8374を使用しました。マイクロ回路には、約1.25ワットの低周波増幅器が組み込まれています。Espressif Audio DevelopmentFrameworkによってすぐにサポートされます。小さなQFN-28パッケージには、Mono DAC、マイク用ADC、SDKをサポートするULFが含まれています。そのようなデバイスに必要なものpipeline_bt_sinkの
例からBTスピーカーを 起動しました。設定で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デバイスとして接続できることです。R27、R28I2C経由で接続する場合はアドレスを設定してください
// L3GD20HアドレスGitHubにはライブラリl3gd20h-esp-idfがあります。
#defineL3GD20H_I2C_ADDRESS_1 0x6a // SDOピンがローです
#defineL3GD20H_I2C_ADDRESS_2 0x6b // SDOピンがハイです
したがって、I2Cには3つのデバイスがあります。ADC-DAC ES8374コントロール、MCP23017およびL3GD20自体のボタン。3つすべてを起動
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: — -- — -- — -- — -- — -- — -- — -- — --
しかし、何らかの理由で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…
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オームを配信しました。少し暗くなった。抵抗を減らす必要があります
また、タッチXPT2046TSが分離されました。SPIピンはディスプレイと並列にぶら下がっています。XPT_CSは別のピンに表示されます。それがうまくいくかどうかは疑わしい。ディスプレイが起動していなかったら、私は実験をしていたでしょう。コンソールの場合、特に必要ありません。例から取った
デモ
LVGLデモを開始しました。設定例では、SPIバスに40MHzを設定してみました。この例は、ビデオよりも少し速く動作しました
しかし、Doomは起動し、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、およびESP32用のNintendo EntertainmentSystemエミュレーターを実行できることに注意します。Ali
付きのゲームコンソールを注文しました。中身を見るのは面白いでしょう。おそらくESP32も
コメントでの議論とアドバイスを楽しみにしています。