@tanami

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ESP-IDFでのSPIFFS使用方法について

解決したいこと

Windows11でVSCode+ PlatformIO(v3.3.3)+ESP-IDF(v5.1.2)開発環境を使っています。
ESP32-S3マイコンのSPIFFSを使ってファイルアクセスしたいと考えています。

発生している問題・コードサンプル&実行結果

esp_vfs_spiffs_conf_t conf = {
.base_path = "/spiffs",
.partition_label = NULL,
.max_files = 5,
.format_if_mount_failed = true,
};

esp_err_t ret = esp_vfs_spiffs_register( &conf );
この関数の実行結果が261(spiffs partition could not be found )となってしまいます。

パーティション定義について

partitions.csvは以下のように定義しています。

Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x4000
otadata, data, ota, 0xd000, 0x2000
phy_init, data, phy, 0xf000, 0x1000
factory, app, factory, 0x10000, 1M
ota_0, app, ota_0, , 2M
ota_1, app, ota_1, , 2M
spiffs, data, spiffs, , 0x2000

処置方法について

何が悪いのか、どうしたらspiffsを使えるようになるのか教えていただけないでしょうか?

0 likes

2Answer

何メガフラッシュのESP32-S3を使用していますか。

ESP-IDF環境を使いこなしているわけではないので、自信がありませんが、パーティション定義しただけでは使えず、ファイルシステムイメージの書き込みか何かが必要だったような・・・

的確な回答でなくてすみません。明日の日中にもう少し調べてみます。

1Like

Comments

  1. ↓こちらの記事によると、パーティション定義とコンフィグレーション追加(パーティションcsvの指定)だけで、SPIFFSが使えるようです。
    ログ出力レベルをdebugにすると、詳細ログが出力されるので、もう少し状況が分かると思います。

    追伸;
    パーティション定義のoffsetを省略されていますが、念の為、指定しておくとよいと思います。

  2. @tanami

    Questioner

    nac435様 いろいろと調べていただきありがとうございます。
    vscode+PlatformIO+ESP-IDFで開発を行っているのですが、どうもうまく動かず何か他にmenuconfigでの設定? iniファイルへの設定?もしくは手動での事前準備などが必要?と思いこちらに質問させていただいた次第です。
    何か他に必要なことを私も調べてみます。

Flashにパーティションテーブルは書き込まれていますか?
書き込みを idf.py で行っているなら勝手に書き込んでくれていると思いますが。
あとパーティションテーブルのオフセットも確認してみてください。通常 0x8000 です。

1Like

Comments

  1. @tanami

    Questioner

    @itagagaki様 情報ありがとうございます。
    vscode+PlatformIO+ESP-IDFのメニューにあるデバッグ操作で書き込み&実行しているだけなので・・(idf.pyは内部で実行されている??)
    idf.pyを手動で操作することが必要なのかもしれないですね。

    実は昨年別の開発案件では同じような環境で意識せずspiffsのファイルアクセスは動いていたのに、今回は動かない(当時から開発環境はかなりバージョンアップしている)ため、何が違うのかなと頭をかかえています。

  2. 一度、直接 esptool.py -p COMx write_flash 0 bootloader.bin 0x10000 your-app.bin 0x8000 partition-table.bin のようにして書き込んでみるといいと思います。COMx は環境に合わせてください。各binファイルはどこに作られているかわかりませんが、idf.py build でビルドした場合ですと、your-app.bin (ご自身のアプリのバイナリー名)は build フォルダの中、bootloader.binbuild/bootloader フォルダの中、partition-table.binbuild/partition_table フォルダの中に生成されています。パーティションテーブルのオフセット 0x8000 は、もしmenuconfigで別の値に設定されているのならそれも合わせてください。プロジェクトの sdkconfig ファイル内の CONFIG_PARTITION_TABLE_OFFSET の値です。

  3. @tanami

    Questioner

    @itagagaki様 詳細な情報ありがとうございます。
    確かにこれを実行し正常終了したのですが、その後実行~デバッグの開始とすると、PlatformIOにてこのあたりの情報書き換えられてしまうのか、esp_vfs_spiffs_registerの戻り値が261のままで・・
    iniファイルあたりに何かの記述が必要な気がしているのですが何だろう??
    なかなか難しいですね!

  4. ということは、プログラムにもパーティションにもブートローダーにも誤りは無くて、問題はPlatformIOのどこかにありそうな感じですね。私はESP-IDFをコマンドラインで直接操作することがほとんどで、たまにVSCode + ESP-IDF拡張機能で使うくらいで、PlatformIOでESP32を操作したことは無いので、そうなるとちょっとわかりません。

  5. @tanami

    Questioner

    @itagagaki様 返信ありがとうございます。
    menuconfig設定とパーティション設定だけだと、なんだか抜け穴があってそこにはまってしまった気がしてます。
    2年ほど前はこんなこと気にならずに動かした経験あるんですが、開発環境もどんどん進化していき、何かできたのかもしれないですね(まいった)。

  6. ちょっとググってみただけですが、platformio.ini にパーティションテーブルを指定するところがあるようで、もしかしてPlatformIOでロードするとこっちの設定が使われて、それとmenuconfigとで設定が違ってしまっている(menuconfigの設定がplatformio.iniには反映されない)ということなのではないでしょうか?

    PlatformIO IDE for VSCode におけるESP32 Partition Tableの指定方法

  7. @tanami

    Questioner

    @itagagaki
    そうなんです。menuconfigとパーティションテーブルそれぞれに記述があり、どちらの値を採用するにしても、同じ値を設定しておかないといけないのかなとは思っているのですが・・ platformIOが実行する実際のパーティションテーブルの構築動作まで追いかけていくことが難しく、とりあえず目先の機能実装を急いで本件は先延ばしになりそうです💦

  8. @tanami

    Questioner

    @itagagaki様 やっと解決しました。
    vscode+ PlatformIO + ESP-IDF Ver5.1.2において、platformIO.iniに以下の定義を追加して手を加えたpartitions.csvを読み込んでくれるようにする必要がありました。

    board_build.partitions = C:\xxxxxx\xxxxxxx\partitionsX.csv
    (どこのフォルダに置いてよいのかよくわからなかったのでフルパスで記述)

    board_build.app_partition_name = factory
    この定義も書くようにみたいな記載もありましたが、なくても動きました。

    結局 menuconfigでファイル名を決めても、デフォルトフォルダ名となりうまく定義ファイルを読み込んでなかったというオチでした。
    お騒がせしました。

  9. 解決して良かったです。私も知見が増えました。

Your answer might help someone💌