Description
Board
esp32-s2-solo
Device Description
Makerfabs-ESP32-S2-Parallel-TFT-with-Touch
Hardware Configuration
[env:develope]
platform = espressif32
board = featheresp32-s2
framework = arduino
Version
v2.0.1
IDE Name
PlatformIO
Operating System
macOS
Flash frequency
240MHz
PSRAM enabled
yes
Upload speed
115200
Description
I've tried several tutorials, in several different ways, Amazon S3, HttpUpload, SD Card, in all the same error: "Flash Read Failed"
I located the origin in
Update.h
(#define UPDATE_ERROR_READ(3)
Update.cpp
return("Flash Read Failed");)
In this line of code the error:
line 242 Update.cpp
if(!_enablePartition(_partition) || !_partitionIsBootable(_partition)) {
_abort(UPDATE_ERROR_READ);
return false;
}
I've tried all versions arduino-esp32
2.0.0
2.0.1
2.0.2
2.0.3-RC1
There is another strange thing, sometimes, right after erasing the flash and uploading a new file system with OTA, it displays the error message, but when resetting the ESP32-S2 it is up to date.
But from here on, new OTA updates don't work. Uploading via USB doesn't work either, I have to do the disk erase again.
# 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, , 1M
ota_1, app, ota_1, , 1M
spiffs, data, spiffs, , 0x1000
Sketch
/* Programa para ESP32 antes da atualização OTA */
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <Update.h>
/* Constantes - conexão wi-fi e webserver */
const char* host = "esp32";
const char* ssid = ""; /* coloque aqui o nome da rede wi-fi que o ESP32 deve se conectar */
const char* password = ""; /* coloque aqui a senha da rede wi-fi que o ESP32 deve se conectar */
/* Variáveis globais */
int contador_ms = 0;
/* Webserver para se comunicar via browser com ESP32 */
WebServer server(80);
/* Códigos da página que será aberta no browser
(quando comunicar via browser com o ESP32)
Esta página exigirá um login e senha, de modo que somente
quem tenha estas informações consiga atualizar o firmware
do ESP32 de forma OTA */
const char* loginIndex =
"<form name='loginForm'>"
"<table width='20%' bgcolor='A09F9F' align='center'>"
"<tr>"
"<td colspan=2>"
"<center><font size=4><b>ESP32 - identifique-se</b></font></center>"
"<br>"
"</td>"
"<br>"
"<br>"
"</tr>"
"<td>Login:</td>"
"<td><input type='text' size=25 name='userid'><br></td>"
"</tr>"
"<br>"
"<br>"
"<tr>"
"<td>Senha:</td>"
"<td><input type='Password' size=25 name='pwd'><br></td>"
"<br>"
"<br>"
"</tr>"
"<tr>"
"<td><input type='submit' onclick='check(this.form)' value='Identificar'></td>"
"</tr>"
"</table>"
"</form>"
"<script>"
"function check(form)"
"{"
"if(form.userid.value=='admin' && form.pwd.value=='admin')"
"{"
"window.open('/serverIndex')"
"}"
"else"
"{"
" alert('Login ou senha inválidos')"
"}"
"}"
"</script>";
const char* serverIndex =
"<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'></script>"
"<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>"
"<input type='file' name='update'>"
"<input type='submit' value='Update'>"
"</form>"
"<div id='prg'>Progresso: 0%</div>"
"<script>"
"$('form').submit(function(e){"
"e.preventDefault();"
"var form = $('#upload_form')[0];"
"var data = new FormData(form);"
" $.ajax({"
"url: '/update',"
"type: 'POST',"
"data: data,"
"contentType: false,"
"processData:false,"
"xhr: function() {"
"var xhr = new window.XMLHttpRequest();"
"xhr.upload.addEventListener('progress', function(evt) {"
"if (evt.lengthComputable) {"
"var per = evt.loaded / evt.total;"
"$('#prg').html('Progresso: ' + Math.round(per*100) + '%');"
"}"
"}, false);"
"return xhr;"
"},"
"success:function(d, s) {"
"console.log('Sucesso!')"
"},"
"error: function (a, b, c) {"
"}"
"});"
"});"
"</script>";
void setup(void)
{
Serial.begin(115200);
/* Conecta-se a rede wi-fi */
WiFi.begin(ssid, password);
Serial.println("");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Conectado a rede wi-fi ");
Serial.println(ssid);
Serial.print("IP obtido: ");
Serial.println(WiFi.localIP());
/* Usa MDNS para resolver o DNS */
if (!MDNS.begin(host))
{
//http://esp32.local
Serial.println("Erro ao configurar mDNS. O ESP32 vai reiniciar em 1s...");
delay(1000);
ESP.restart();
}
Serial.println("mDNS configurado e inicializado;");
/* Configfura as páginas de login e upload de firmware OTA */
server.on("/", HTTP_GET, []()
{
server.sendHeader("Connection", "close");
server.send(200, "text/html", loginIndex);
});
server.on("/serverIndex", HTTP_GET, []()
{
server.sendHeader("Connection", "close");
server.send(200, "text/html", serverIndex);
});
/* Define tratamentos do update de firmware OTA */
server.on("/update", HTTP_POST, []()
{
server.sendHeader("Connection", "close");
server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
ESP.restart();
}, []() {
HTTPUpload& upload = server.upload();
if (upload.status == UPLOAD_FILE_START)
{
/* Inicio do upload de firmware OTA */
Serial.printf("Update: %s\n", upload.filename.c_str());
if (!Update.begin(UPDATE_SIZE_UNKNOWN))
Update.printError(Serial);
}
else if (upload.status == UPLOAD_FILE_WRITE)
{
/* Escrevendo firmware enviado na flash do ESP32 */
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize)
Update.printError(Serial);
}
else if (upload.status == UPLOAD_FILE_END)
{
/* Final de upload */
if (Update.end(true))
Serial.printf("Sucesso no update de firmware: %u\nReiniciando ESP32...\n", upload.totalSize);
else
Update.printError(Serial);
}
});
server.begin();
}
void loop()
{
server.handleClient();
delay(1);
contador_ms++;
if (contador_ms >= 1000)
{
Serial.println("Programa V2");
contador_ms = 0;
}
}
Debug Message
Programa V2
Programa V2
Update: v3.bin
Flash Read Failed
Other Steps to Reproduce
No response
I have checked existing issues, online documentation and the Troubleshooting Guide
- I confirm I have checked existing issues, online documentation and Troubleshooting guide.