I can't get the PSRAM of an ESP32-S3-N16R8 to work

Hello community,
I’m (once again) at my wit’s end. I ordered an ESP32-S3N16R8 development board from AliExpress to experiment with the Micro-Wake-Word.

Unfortunately, I can’t get PSRAM to work.

I’ve already tried a big amount of combination of examples I found online, and when the lines `

psram:
  mode: octal
  speed: 80MHz

are added, after booting, only the green LED blinks fast, and the ESP32 seems to crash every half second.
Has anyone actually gotten PSRAM working on this exact board and could tell me the parameters/settings (Board: https://de.aliexpress.com/item/1005009488143006.html)?


How can I proceed? How can I find out if PSRAM is even present, or if the supplier lied to me?

Example of one of the last tested settings:

esphome:
  name: teststation
  friendly_name: TestStation
  platformio_options:
    build_flags: "-DBOARD_HAS_PSRAM"  
 #   board_build.arduino.memory_type: qio_opi

 #   board_build.flash_mode: dio
 #   board_build.flash_mode: qio
 #   board_build.flash_mode: qout
 #   board_build.flash_mode: dout

esp32:
  board: esp32-s3-devkitc-1 #esp32s3box # N16R8 esp32-s3-devkitc-1
  flash_size: 16MB
  variant: esp32s3
  framework:
    type: esp-idf
#    sdkconfig_options:
#      CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"
#      CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
#      CONFIG_ESP32S3_DATA_CACHE_LINE_64B: "y"
#      CONFIG_AUDIO_BOARD_CUSTOM: "y"
#      CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB: "y"
#      CONFIG_ESP32_S3_BOX_BOARD: "y"
      # Moves instructions and read only data from flash into PSRAM on boot.
      # Both enabled allows instructions to execute while a flash operation is in progress without needing to be placed in IRAM.
      # Considerably speeds up mWW at the cost of using more PSRAM.
#      CONFIG_SPIRAM_RODATA: "y"
#      CONFIG_SPIRAM_FETCH_INSTRUCTIONS: "y"
#      CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST: "y"
#      CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY: "y"
#      CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC: "y"
#      CONFIG_MBEDTLS_SSL_PROTO_TLS1_3: "y"  # TLS1.3 support isn't enabled by default in IDF 5.1.5

psram:
  mode: octal
  speed: 80MHz
...

Log of the last version, which doesn’t crash constantly (but uses mode: quad and speed: 40MHz)
…and I can’t find any trace of PSRAM:

[03:37:58.092][I][app:185]: ESPHome version 2025.10.4 compiled on Nov  8 2025, 03:32:34
[03:37:58.102][C][wifi:679]: WiFi:
[03:37:58.120][C][wifi:458]:   Local MAC: XX:XX:XX:XX:XX:XX
[03:37:58.127][C][wifi:465]:   IP Address: 192.168.XXX.XXX
[03:37:58.154][C][wifi:469]:   SSID: 'ABCDEFGHIJKLMNOP'[redacted]
[03:37:58.154][C][wifi:469]:   BSSID: YY:YY:YY:YY:YY:YY[redacted]
[03:37:58.154][C][wifi:469]:   Hostname: 'teststation'
[03:37:58.154][C][wifi:469]:   Signal strength: -49 dB ▂▄▆█
[03:37:58.154][C][wifi:469]:   Channel: 6
[03:37:58.154][C][wifi:469]:   Subnet: 255.255.255.0
[03:37:58.154][C][wifi:469]:   Gateway: 192.168.XXX.XXX
[03:37:58.154][C][wifi:469]:   DNS1: 192.168.XXX.XXX
[03:37:58.154][C][wifi:469]:   DNS2: 0.0.0.0
[03:37:58.155][C][logger:261]: Logger:
[03:37:58.155][C][logger:261]:   Max Level: DEBUG
[03:37:58.155][C][logger:261]:   Initial Level: DEBUG
[03:37:58.169][C][logger:267]:   Log Baud Rate: 115200
[03:37:58.169][C][logger:267]:   Hardware UART: USB_SERIAL_JTAG
[03:37:58.179][C][logger:274]:   Task Log Buffer Size: 768
[03:37:58.201][C][esp32_rmt_led_strip:263]: ESP32 RMT LED Strip:
[03:37:58.201][C][esp32_rmt_led_strip:263]:   Pin: 21
[03:37:58.214][C][esp32_rmt_led_strip:267]:   RMT Symbols: 192
[03:37:58.227][C][esp32_rmt_led_strip:292]:   RGB Order: GRB
[03:37:58.227][C][esp32_rmt_led_strip:292]:   Max refresh rate: 15000
[03:37:58.227][C][esp32_rmt_led_strip:292]:   Number of LEDs: 12
[03:37:58.235][C][template.select:064]: Template Select 'Wake word engine location'
[03:37:58.246][C][template.select:362]:   Update Interval: 60.0s
[03:37:58.259][C][template.select:068]:   Optimistic: YES
[03:37:58.259][C][template.select:068]:   Initial Option: On device
[03:37:58.259][C][template.select:068]:   Restore Value: YES
[03:37:58.302][C][light:088]: Light 'RGB'
[03:37:58.315][C][light:091]:   Default Transition Length: 0.0s
[03:37:58.315][C][light:091]:   Gamma Correct: 2.80
[03:37:58.330][C][template.switch:087]: Template Switch 'Use listen light'
[03:37:58.330][C][template.switch:087]:   Restore Mode: restore defaults to ON
[03:37:58.341][C][template.switch:057]:   Optimistic: YES
[03:37:58.354][C][template.switch:087]: Template Switch 'Use wake word'
[03:37:58.354][C][template.switch:087]:   Restore Mode: restore defaults to ON
[03:37:58.368][C][template.switch:057]:   Optimistic: YES
[03:37:58.378][C][template.switch:087]: Template Switch 'Mute'
[03:37:58.378][C][template.switch:087]:   Restore Mode: restore defaults to OFF
[03:37:58.390][C][template.switch:057]:   Optimistic: YES
[03:37:58.401][C][psram:016]: PSRAM:
[03:37:58.411][C][psram:019]:   Available: NO
[03:37:58.436][C][i2s_audio.microphone:079]: Microphone:
[03:37:58.436][C][i2s_audio.microphone:079]:   Pin: 15
[03:37:58.436][C][i2s_audio.microphone:079]:   PDM: NO
[03:37:58.436][C][i2s_audio.microphone:079]:   DC offset correction: NO
[03:37:58.482][D][sensor:131]: 'Heap Free': Sending state 231048.00000 B with 0 decimals of accuracy
[03:37:58.495][D][sensor:131]: 'Loop Time': Sending state 89.00000 ms with 0 decimals of accuracy
[03:37:58.510][D][sensor:131]: 'CPU Frequency': Sending state 160000000.00000 Hz with 0 decimals of accuracy
[03:37:58.521][D][sensor:131]: 'Heap Max Block': Sending state 163840.00000 B with 0 decimals of accuracy
[03:37:58.531][D][sensor:131]: 'Free PSRAM': Sending state 0.00000 B with 0 decimals of accuracy
[03:37:58.541][W][component:453]: debug took a long time for an operation (59 ms)
[03:37:58.552][W][component:456]: Components should block for at most 30 ms
[03:37:58.571][W][component:453]: debug took a long time for an operation (80 ms)
[03:37:58.583][W][component:456]: Components should block for at most 30 ms
[03:37:58.609][C][i2s_audio.speaker:074]: Speaker:
[03:37:58.609][C][i2s_audio.speaker:074]:   Pin: 10
[03:37:58.609][C][i2s_audio.speaker:074]:   Buffer duration: 100
[03:37:58.621][C][i2s_audio.speaker:088]:   Communication format: std
[03:37:58.638][C][esphome.ota:093]: Over-The-Air updates:
[03:37:58.638][C][esphome.ota:093]:   Address: teststation.local:3232
[03:37:58.638][C][esphome.ota:093]:   Version: 2
[03:37:58.648][C][esphome.ota:100]:   Password configured
[03:37:58.657][C][safe_mode:018]: Safe Mode:
[03:37:58.657][C][safe_mode:018]:   Successful after: 60s
[03:37:58.657][C][safe_mode:018]:   Invoke after: 10 attempts
[03:37:58.657][C][safe_mode:018]:   Duration: 300s
[03:37:58.674][C][api:222]: Server:
[03:37:58.674][C][api:222]:   Address: teststation.local:6053
[03:37:58.674][C][api:222]:   Listen backlog: 4
[03:37:58.674][C][api:222]:   Max connections: 8
[03:37:58.686][C][api:229]:   Noise encryption: YES
[03:37:58.700][C][mdns:179]: mDNS:
[03:37:58.700][C][mdns:179]:   Hostname: teststation
[03:37:58.711][C][micro_wake_word:064]: microWakeWord:
[03:37:58.720][C][micro_wake_word:065]:   models:
[03:37:58.723][C][micro_wake_word:014]:     - Wake Word: Hey Jarvis
[03:37:58.723][C][micro_wake_word:014]:       Probability cutoff: 0.97
[03:37:58.723][C][micro_wake_word:014]:       Sliding window size: 5
[03:37:58.763][C][debug:018]: Debug component:
[03:37:58.765][C][debug:015]:   Free space on heap 'Heap Free'
[03:37:58.765][C][debug:015]:     State Class: ''
[03:37:58.765][C][debug:015]:     Unit of Measurement: 'B'
[03:37:58.765][C][debug:015]:     Accuracy Decimals: 0
[03:37:58.784][C][debug:029]:     Icon: 'mdi:counter'
[03:37:58.799][C][debug:015]:   Largest free heap block 'Heap Max Block'
[03:37:58.799][C][debug:015]:     State Class: ''
[03:37:58.799][C][debug:015]:     Unit of Measurement: 'B'
[03:37:58.799][C][debug:015]:     Accuracy Decimals: 0
[03:37:58.808][C][debug:029]:     Icon: 'mdi:counter'
[03:37:58.821][C][debug:015]:   CPU frequency 'CPU Frequency'
[03:37:58.821][C][debug:015]:     State Class: ''
[03:37:58.821][C][debug:015]:     Unit of Measurement: 'Hz'
[03:37:58.821][C][debug:015]:     Accuracy Decimals: 0
[03:37:58.832][C][debug:029]:     Icon: 'mdi:speedometer'
[03:37:58.837][D][debug:033]: ESPHome version 2025.10.4
[03:37:58.851][D][debug:037]: Free Heap Size: 225496 bytes
[03:37:58.862][D][debug:182]: Chip: Model=ESP32-S3, Features=2.4GHz WiFi, BLE,  Cores=2, Revision=2
[03:37:58.872][D][debug:191]: CPU Frequency: 160 MHz
[03:37:58.884][D][debug:199]: Framework: ESP-IDF
[03:37:58.899][D][debug:206]: ESP-IDF Version: 5.4.2
[03:37:58.918][D][debug:211]: EFuse MAC: XX:XX:XX:XX:XX:XX
[03:37:58.924][D][debug:079]: Reset Reason: power-on event
[03:37:58.939][D][debug:107]: Wakeup Reason: undefined
[03:37:58.939][C][debug:112]: Partition table:
[03:37:58.939][C][debug:112]:   Name         Type Subtype  Address    Size      
[03:37:58.950][C][debug:119]:   otadata      1    0        0x00009000 0x00002000
[03:37:58.959][C][debug:119]:   phy_init     1    1        0x0000B000 0x00001000
[03:37:58.972][C][debug:119]:   app0         0    16       0x00010000 0x007C0000
[03:37:58.982][C][debug:119]:   app1         0    17       0x007D0000 0x007C0000
[03:37:58.996][C][debug:119]:   nvs          1    2        0x00F90000 0x0006D000
[03:38:03.486][D][sensor:131]: 'Heap Free': Sending state 232612.00000 B with 0 decimals of accuracy
[03:38:03.517][D][sensor:131]: 'Loop Time': Sending state 247.00000 ms with 0 decimals of accuracy
[03:38:03.562][D][sensor:131]: 'CPU Frequency': Sending state 160000000.00000 Hz with 0 decimals of accuracy
[03:38:03.562][D][sensor:131]: 'Heap Max Block': Sending state 159744.00000 B with 0 decimals of accuracy
[03:38:03.580][D][sensor:131]: 'Free PSRAM': Sending state 0.00000 B with 0 decimals of accuracy

Try the test

esphome:
  name: psram-test
  friendly_name: PSRAM Test
  on_boot:
    priority: -10
    then:
      - lambda: |-
          ESP_LOGI("psram_test", "=== PSRAM TEST START ===");
          ESP_LOGI("psram_test", "Total heap: %u bytes", heap_caps_get_total_size(MALLOC_CAP_DEFAULT));
          ESP_LOGI("psram_test", "Free heap:  %u bytes", heap_caps_get_free_size(MALLOC_CAP_DEFAULT));
          ESP_LOGI("psram_test", "Total PSRAM: %u bytes", heap_caps_get_total_size(MALLOC_CAP_SPIRAM));
          ESP_LOGI("psram_test", "Free PSRAM:  %u bytes", heap_caps_get_free_size(MALLOC_CAP_SPIRAM));
          ESP_LOGI("psram_test", "=== PSRAM TEST END ===");

esp32:
  board: esp32-s3-devkitc-1
  variant: esp32s3
  flash_size: 16MB
  framework:
    type: esp-idf

psram:
  mode: octal
  speed: 80MHz

logger:
  level: DEBUG

# Enable Home Assistant API
api:

ota:
  - platform: esphome

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
======================== [SUCCESS] Took 122.99 seconds ========================
INFO Package configuration completed successfully
INFO Package configuration completed successfully
INFO Successfully compiled program.
esptool v5.1.0
Serial port /dev/ttyACM0:
Connecting...
Connected to ESP32-S3 on /dev/ttyACM0:
Chip type:          ESP32-S3 (QFN56) (revision v0.2)
Features:           Wi-Fi, BT 5 (LE), Dual Core + LP Core, 240MHz, Embedded PSRAM 8MB (AP_3v3)
Crystal frequency:  40MHz


INFO ESPHome 2025.10.4
INFO Reading configuration /config/esphome/test-ram.yaml...
INFO Starting log output from xxxxxxx using esphome API
INFO Successfully resolved psram-test @ xx2.1xx.1.xx in 0.000s
INFO Successfully connected to psram-test @ xx2.1xx.1.xx in 0.214s
INFO Successful handshake with psram-test @ xx2.1xx.1.xx in 0.024s
[14:36:50.497][I][app:185]: ESPHome version 2025.10.4 compiled on Nov  8 2025, 14:32:27
[14:36:50.504][C][wifi:679]: WiFi:
[14:36:50.504][C][wifi:458]:   Local MAC: 9C:xx2.1xx.1.xx
[14:36:50.504][C][wifi:465]:   IP Address: xx2.1xx.1.xx
[14:36:50.508][C][wifi:469]:   SSID: [redacted]
[14:36:50.508][C][wifi:469]:   BSSID: [redacted]
[14:36:50.508][C][wifi:469]:   Hostname: 'psram-test'
[14:36:50.508][C][wifi:469]:   Signal strength: -27 dB ▂▄▆█
[14:36:50.508][C][wifi:469]:   Channel: 9
[14:36:50.508][C][wifi:469]:   Subnet: 255.255.255.0
[14:36:50.508][C][wifi:469]:   Gateway: xx2.1xx.1.xx
[14:36:50.508][C][wifi:469]:   DNS1: xx2.1xx.1.xx
[14:36:50.508][C][wifi:469]:   DNS2: 0.0.0.0
[14:36:50.511][C][logger:261]: Logger:
[14:36:50.511][C][logger:261]:   Max Level: DEBUG
[14:36:50.511][C][logger:261]:   Initial Level: DEBUG
[14:36:50.514][C][logger:267]:   Log Baud Rate: 115200
[14:36:50.514][C][logger:267]:   Hardware UART: USB_SERIAL_JTAG
[14:36:50.516][C][logger:274]:   Task Log Buffer Size: 768
[14:36:50.535][C][psram:016]: PSRAM:
[14:36:50.536][C][psram:019]:   Available: YES
[14:36:50.538][C][psram:021]:   Size: 8192 KB
[14:36:50.548][C][esphome.ota:093]: Over-The-Air updates:
[14:36:50.548][C][esphome.ota:093]:   Address: psram-test.local:3232
[14:36:50.548][C][esphome.ota:093]:   Version: 2
[14:36:50.560][C][safe_mode:018]: Safe Mode:
[14:36:50.560][C][safe_mode:018]:   Successful after: 60s
[14:36:50.560][C][safe_mode:018]:   Invoke after: 10 attempts
[14:36:50.560][C][safe_mode:018]:   Duration: 300s
[14:36:50.566][C][api:222]: Server:
[14:36:50.566][C][api:222]:   Address: psram-test.local:6053
[14:36:50.566][C][api:222]:   Listen backlog: 4
[14:36:50.566][C][api:222]:   Max connections: 8
[14:36:50.568][C][api:234]:   Noise encryption: NO
[14:36:50.580][C][mdns:179]: mDNS:
[14:36:50.580][C][mdns:179]:   Hostname: psram-test
[14:37:32.936][I][safe_mode:042]: Boot seems successful; resetting boot loop counter
[14:37:32.943][D][esp32.preferences:149]: Writing 1 items: 0 cached, 1 written, 0 failed

I have tested it. The problem is, if I put

psram:
  mode: octal
  speed: 80MHz

into the code then after flashing the green LED is blinking in 0,5 sec intervals and I get no WiFi or logger connection to the ESP board.

The web-flasher shows the following in the logging:

[18:27:59]ESP-ROM:esp32s3-20210327
[18:27:59]Build:Mar 27 2021
[18:27:59]rst:0xc (RTC_SW_CPU_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)
[18:27:59]Saved PC:0x40376a95
[18:27:59]SPIWP:0xee
[18:27:59]mode:DIO, clock div:1
[18:27:59]load:0x3fce2820,len:0x1564
[18:27:59]load:0x403c8700,len:0x4
[18:27:59]load:0x403c8704,len:0xc80
[18:27:59]load:0x403cb700,len:0x2ee0
[18:27:59]entry 0x403c890c
[18:27:59]ESP-ROM:esp32s3-20210327
[18:27:59]Build:Mar 27 2021
[18:27:59]rst:0xc (RTC_SW_CPU_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)
[18:27:59]Saved PC:0x40376a95
[18:27:59]SPIWP:0xee
[18:27:59]mode:DIO, clock div:1
[18:27:59]load:0x3fce2820,len:0x1564
[18:27:59]load:0x403c8700,len:0x4
[18:27:59]load:0x403c8704,len:0xc80
[18:27:59]load:0x403cb700,len:0x2ee0
[18:27:59]entry 0x403c890c
.
.
.

if I put

psram:
  mode: quad
  speed: 40MHz

into the code, the logger shows the following:

[18:44:24.932][D][debug:033]: ESPHome version 2025.10.4
[18:44:24.943][D][debug:037]: Free Heap Size: 239524 bytes
[18:44:24.949][D][debug:182]: Chip: Model=ESP32-S3, Features=2.4GHz WiFi, BLE,  Cores=2, Revision=2
[18:44:24.958][D][debug:191]: CPU Frequency: 160 MHz
[18:44:24.966][D][debug:199]: Framework: ESP-IDF
[18:44:25.039][D][debug:206]: ESP-IDF Version: 5.4.2
[18:44:25.039][D][debug:211]: EFuse MAC: 80:B5:4E:C6:E0:6C
[18:44:25.039][D][debug:079]: Reset Reason: power-on event
[18:44:25.040][D][debug:107]: Wakeup Reason: undefined
[18:44:25.040][C][debug:112]: Partition table:
[18:44:25.040][C][debug:112]:   Name         Type Subtype  Address    Size      
[18:44:25.040][C][debug:119]:   otadata      1    0        0x00009000 0x00002000
[18:44:25.040][C][debug:119]:   phy_init     1    1        0x0000B000 0x00001000
[18:44:25.077][C][debug:119]:   app0         0    16       0x00010000 0x007C0000
[18:44:25.077][C][debug:119]:   app1         0    17       0x007D0000 0x007C0000
[18:44:25.078][C][debug:119]:   nvs          1    2        0x00F90000 0x0006D000
[18:44:33.981][D][sensor:131]: 'Heap Free': Sending state 246088.00000 B with 0 decimals of accuracy
[18:44:33.981][D][sensor:131]: 'Loop Time': Sending state 219.00000 ms with 0 decimals of accuracy
[18:44:34.055][D][sensor:131]: 'CPU Frequency': Sending state 160000000.00000 Hz with 0 decimals of accuracy
[18:44:34.057][D][sensor:131]: 'Heap Max Block': Sending state 176128.00000 B with 0 decimals of accuracy
[18:44:34.057][D][sensor:131]: 'Free PSRAM': Sending state 0.00000 B with 0 decimals of accuracy

I’m afraid your board doesn’t contain any PSRAM and is just a clone without the chip installed.

I’m afraid that’s not enough to prove to the supplier that there’s no PSRAM. He firmly believes it is and is sending various materials to prove it.

Perhaps only the ESPHome implementation of psram has a problem with this board?
Somehow I need to use Espressif Tools to find out what’s installed…

hi there - thanks for all the above information that i found very valuable.

I suspect i am in a similar situation. I got delivered some boards from Ebay, probably bought from AliExpress in stock sizes for much less… They are/were meant to be ESP32S3 N16R8.

If i do NOT put any PSRAM line in the config it appears to be working just fine (it does have 16Mb of flash apparently, i reassign assign that vs. the original board definition). If i put Octal mode, it all goes pear shaped; If i put QUAD mode, it appears there is no RAM…

Has anybody found out whether these boards all all cheaply manifactured or is there some other setting that needs to be setup for the framework to see the RAM?

My final conclusion: I spoke with people in several forums and tested with ESPHome, PlatformIO, and Espressif Tools. Whenever I tried to access the PSRAM, the ESP crashed. I decided today to return both units.