ESP-IDFを使ってみる

SPI FLASH

ESP32のSoCにはFlashが内蔵されているSoCと、Flashが内蔵されていないSoCが有ります。
Flashが内蔵されていないSoCは外部SPI Flashを使っています。
以下のコードでFlashの種類と、外部SPI Flashのサイズを知ることができます。
#include <stdio.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_log.h"

static const char *TAG = "MAIN";

void app_main()
{
        esp_chip_info_t chip_info;
        esp_chip_info(&chip_info);
        // Print out embedded or external
        uint32_t embedded = chip_info.features & CHIP_FEATURE_EMB_FLASH;
        ESP_LOGD(TAG, "embedded=%"PRIx32, embedded);
        if (embedded) {
                uint32_t flash_size;
                ESP_ERROR_CHECK(esp_flash_get_size(NULL, &flash_size));
                size_t flash_size_k =  flash_size / 1024;
                size_t flash_size_m =  flash_size_k / 1024;
                ESP_LOGI(TAG, "embedded %d MBytes flash", flash_size_m);
        } else {
                uint32_t id;
                ESP_ERROR_CHECK(esp_flash_read_id(NULL, &id));
                ESP_LOGI(TAG, "chip ID=0x%"PRIx32, id);
                int flash_capacity = id & 0xff;
                ESP_LOGI(TAG, "flash_capacity=0x%d", flash_capacity);
                int real_flash_size = 0;
                if (flash_capacity == 0x15) {
                        real_flash_size = 2;
                } else if (flash_capacity == 0x16) {
                        real_flash_size = 4;
                } else if (flash_capacity == 0x17) {
                        real_flash_size = 8;
                } else if (flash_capacity == 0x18) {
                        real_flash_size = 16;
                }
                ESP_LOGI(TAG, "external %d Mbytes flash", real_flash_size);

                uint32_t flash_size;
                ESP_ERROR_CHECK(esp_flash_get_size(NULL, &flash_size));
                ESP_LOGI(TAG, "esp_flash_get_size=%"PRIi32, flash_size);
        }
}

esp_flash_get_sizeは、Menuconfigで指定したFlashサイズを返すので、外部SPI Flashを使っているSoCでは、
esp_flash_read_idを使って、実装されているSPI FlashのJEDEC IDを取り出す必要が有ります。

以下はFlashをSoCに内蔵しているESP32C2の結果です。
I (383) app_start: Starting scheduler on CPU0
I (390) main_task: Started on CPU0
I (390) main_task: Calling app_main()
I (400) MAIN: embedded 2 MBytes flash
I (400) main_task: Returned from app_main()

以下は外部SPI Flashを使っているESP32C3の結果です。
JEDEC IDの末尾2バイトが0x16なので、2^0x16=2^22=0x400000=4MのFlashが実装されていることが分かります。
I (283) main_task: Started on CPU0
I (283) main_task: Calling app_main()
I (283) MAIN: chip ID=0xcd6016
I (293) MAIN: flash_capacity=0x16
I (293) MAIN: external 4 Mbytes flash
I (303) MAIN: esp_flash_get_size=2097152
I (303) main_task: Returned from app_main()

以下は8MのSPI Flashを使っているESP32-S3-WROOM-1-N8R2の結果です。
I (317) main_task: Calling app_main()
I (317) MAIN: chip ID=0x5e4017
I (327) MAIN: flash_capacity=0x17
I (327) MAIN: external 8 Mbytes flash
I (337) MAIN: esp_flash_get_size=2097152
I (337) main_task: Returned from app_main()

以下は16MのSPI Flashを使っているESP32-S3-WROOM-1-N16R8の結果です。
I (317) main_task: Calling app_main()
I (317) MAIN: chip ID=0xef4018
I (327) MAIN: flash_capacity=0x18
I (327) MAIN: external 16 Mbytes flash
I (337) MAIN: esp_flash_get_size=2097152
I (337) main_task: Returned from app_main()

続く....