ESP8266:Прошивки/Arduino/FAQ/При попытке загрузить ESP8266 получаю ошибку «espcomm sync failed». Как решить эту проблему?: различия между версиями
Myagkij (обсуждение | вклад) |
Нет описания правки |
||
Строка 60: | Строка 60: | ||
Затем откройте терминал на скорости [[74880 бод]] и посмотрите, какие сообщения присылает [[ESP8266]] при сбросе, выполняемом для загрузки прошивки. Правильное сообщение должно выглядеть примерно так: | Затем откройте терминал на скорости [[74880 бод]] и посмотрите, какие сообщения присылает [[ESP8266]] при сбросе, выполняемом для загрузки прошивки. Правильное сообщение должно выглядеть примерно так: | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
ets Jan 8 2013,rst cause:2, boot mode:(1,7) | ets Jan 8 2013,rst cause:2, boot mode:(1,7) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 78: | Строка 78: | ||
'''3.''' Еще один способ – это просмотр более детальных отладочных сообщений. Кликните в [[IDE Arduino]] на '''Файл > Настройки (File > Preferences)''' и поставьте галочку рядом с пунктом '''«Показать подробный вывод: Загрузка» («Show verbose output during: upload»)'''. Чтобы загрузка прошивки была успешной, эти логи должны выглядеть примерно так: | '''3.''' Еще один способ – это просмотр более детальных отладочных сообщений. Кликните в [[IDE Arduino]] на '''Файл > Настройки (File > Preferences)''' и поставьте галочку рядом с пунктом '''«Показать подробный вывод: Загрузка» («Show verbose output during: upload»)'''. Чтобы загрузка прошивки была успешной, эти логи должны выглядеть примерно так: | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
C:\Users\Krzysztof\AppData\Local\Arduino15\packages\esp8266\tools\esptool\0.4.8/esptool.exe -vv -cd ck -cb 115200 -cp COM3 -ca 0x00000 -cf C:\Users\KRZYSZ~1\AppData\Local\Temp\build7e44b372385012e74d64fb272d24b802.tmp/Blink.ino.bin esptool v0.4.8 - (c) 2014 Ch. Klippel <ck@atelier-klippel.de> setting board to ck setting baudrate from 115200 to 115200 setting port from COM1 to COM3 setting address from 0x00000000 to 0x00000000 espcomm_upload_file espcomm_upload_mem setting serial port timeouts to 1000 ms opening bootloader resetting board trying to connect flush start setting serial port timeouts to 1 ms setting serial port timeouts to 1000 ms flush complete espcomm_send_command: sending command header espcomm_send_command: sending command payload read 0, requested 1 trying to connect flush start setting serial port timeouts to 1 ms setting serial port timeouts to 1000 ms flush complete espcomm_send_command: sending command header espcomm_send_command: sending command payload espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data Uploading 226368 bytes from to flash at 0x00000000 erasing flash size: 037440 address: 000000 first_sector_index: 0 total_sector_count: 56 head_sector_count: 16 adjusted_sector_count: 40 erase_size: 028000 espcomm_send_command: sending command header espcomm_send_command: sending command payload setting serial port timeouts to 15000 ms setting serial port timeouts to 1000 ms espcomm_send_command: receiving 2 bytes of data writing flash .............................................................................................................................................................................................................................. starting app without reboot espcomm_send_command: sending command header espcomm_send_command: sending command payload espcomm_send_command: receiving 2 bytes of data closing bootloader flush start setting serial port timeouts to 1 ms setting serial port timeouts to 1000 ms flush complete | C:\Users\Krzysztof\AppData\Local\Arduino15\packages\esp8266\tools\esptool\0.4.8/esptool.exe -vv -cd ck -cb 115200 -cp COM3 -ca 0x00000 -cf C:\Users\KRZYSZ~1\AppData\Local\Temp\build7e44b372385012e74d64fb272d24b802.tmp/Blink.ino.bin esptool v0.4.8 - (c) 2014 Ch. Klippel <ck@atelier-klippel.de> setting board to ck setting baudrate from 115200 to 115200 setting port from COM1 to COM3 setting address from 0x00000000 to 0x00000000 espcomm_upload_file espcomm_upload_mem setting serial port timeouts to 1000 ms opening bootloader resetting board trying to connect flush start setting serial port timeouts to 1 ms setting serial port timeouts to 1000 ms flush complete espcomm_send_command: sending command header espcomm_send_command: sending command payload read 0, requested 1 trying to connect flush start setting serial port timeouts to 1 ms setting serial port timeouts to 1000 ms flush complete espcomm_send_command: sending command header espcomm_send_command: sending command payload espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data Uploading 226368 bytes from to flash at 0x00000000 erasing flash size: 037440 address: 000000 first_sector_index: 0 total_sector_count: 56 head_sector_count: 16 adjusted_sector_count: 40 erase_size: 028000 espcomm_send_command: sending command header espcomm_send_command: sending command payload setting serial port timeouts to 15000 ms setting serial port timeouts to 1000 ms espcomm_send_command: receiving 2 bytes of data writing flash .............................................................................................................................................................................................................................. starting app without reboot espcomm_send_command: sending command header espcomm_send_command: sending command payload espcomm_send_command: receiving 2 bytes of data closing bootloader flush start setting serial port timeouts to 1 ms setting serial port timeouts to 1000 ms flush complete | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 112: | Строка 112: | ||
Каждая новая попытка отображается в логах загрузки: | Каждая новая попытка отображается в логах загрузки: | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
resetting board | resetting board | ||
trying to connect | trying to connect |
Версия от 19:55, 23 мая 2023
![]() |
Черновик |
При попытке загрузить ESP8266 получаю ошибку «espcomm_sync failed». Как решить эту проблему?[1]
Это сообщение информирует о проблеме с загрузкой прошивки на ESP8266 через последовательное соединение. Причина может варьироваться в зависимости от типа модуля, от параметров, выбранных при загрузке, от того, используете ли вы отдельный USB-Serial конвертер, и т.д. То есть одного простого ответа на то, что является основной причиной проблемы, нет. Чтобы найти ее, придется выполнить диагностику.
Примечание: Если вы новичок в теме ESP8266 и хотели бы избежать потенциальных проблем с загрузкой прошивки, купите модуль ESP8266 со встроенным конвертером USB-Serial. Это существенно сократит количество факторов (в частности, уменьшит возню с настройками), из-за которых вы можете случайно помешать процессу загрузки.
На картинке ниже показаны платы со встроенным конвертером USB-Serial. Их использование, повторюсь, значительно упростит разработку ваших первых проектов на ESP8266.
![](/ruwiki/images/6/6f/A01-example-boards-with-usb.png)
Если вы используете «голый» (стандартный) модуль ESP8266 (например, ESP-01 или ESP-12), самостоятельно подключенный к отдельному USB-Serial конвертеру, обязательно проделайте следующее:
- Обеспечьте модуль достаточным питанием
- Подключите контакты GPIO0, GPIO15 и CH_PD при помощи подтягивающих/стягивающих резисторов
- Переведите модуль в режим загрузчика
Более подробно читайте в разделе «Стандартные модули ESP8266» статьи «Платы для аддона ESP8266 для IDE Arduino». На картинке ниже показаны платы без встроенного конвертера USB-Serial:
![](/ruwiki/images/4/48/A01-example-boards-without-usb.png)
Предварительные проверки
Чтобы исправить ошибку «espcomm_sync failed», пройдите шаг за шагом инструкцию ниже. Это список решений, ранжированных от самого простого до самого сложного.
1. Прочтите сообщение, показанное в отладочном окне IDE Arduino. Во многих случаях оно предоставляет точную информацию о том, где именно возникла проблема.
![](/ruwiki/images/5/52/A01-espcomm_open-failed.png)
К примеру, сообщение на картинке выше, говорит, что IDE Arduino не может открыть последовательный порт COM3. Следовательно, нужно проверить, выбран ли в IDE Arduino порт, к которому подключен ваш модуль.
![](/ruwiki/images/f/f6/A01-serial-port-selection.png)
2. Если модуль подключен к последовательному порту, но не отвечает как модуль ESP8266, сообщение в отладочном окне будет слегка другим (см. ниже). Если к вашему ПК подключены другие модули, проверьте, что загрузили код на ESP8266, а не на, к примеру, Arduino UNO.
![](/ruwiki/images/c/c5/A01-espcomm_sync-failed.png)
3. Чтобы ваш ПК мог общаться с ESP8266, выберите в IDE Arduino правильный модуль ESP8266. Если выбрать неправильный модуль, загрузка прошивки может завершиться неудачей.
![](/ruwiki/images/d/d7/A01-board-selection.png)
Выбрать правильную плату нужно для того, чтобы IDE Arduino мог применить правильный «метод сброса» при переключении платы в режим загрузчика. Разные платы используют разные методы сброса. У некоторых плат нет аппаратных компонентов, чтобы выполнить сброс через IDE Arduino. В таком случае плату нужно перевести в режим загрузчика вручную.
4. Кроме того, загрузка прошивки может не удаться из-за слишком высокой скорости передачи данных. Если у вас длинный или некачественный USB-кабель, попробуйте снизить скорость загрузки в меню «Upload Speed».
![](/ruwiki/images/2/2b/A01-serial-speed-selection.png)
Дополнительные проверки
1. Если проблема не исчезла, проверьте, точно ли модуль вошел в режим загрузчика. Для этого нужно подключить к ESP8266 добавочный конвертер USB-Serial, а затем посмотреть на показываемые сообщения.
Итак, для начала подключите контакты RX и GND конвертера к контактам TX и GND на ESP8266, как показано ниже:
![](/ruwiki/images/0/06/A01-secondary-serial-hookup.png)
Затем откройте терминал на скорости 74880 бод и посмотрите, какие сообщения присылает ESP8266 при сбросе, выполняемом для загрузки прошивки. Правильное сообщение должно выглядеть примерно так:
ets Jan 8 2013,rst cause:2, boot mode:(1,7)
Если у вас появилось такое же сообщение, но с другими значениями, то расшифровать его можно при помощи таблицы из этой статьи (см. третью таблицу в разделе «Сообщения о режимах запуска и причине сброса/перезагрузки»). Ключевая информация содержится в первой цифре, находящейся в скобочках рядом с надписью «boot mode», как показано на картинке ниже:
![](/ruwiki/images/e/e8/A01-boot-mode-decoding.png)
К примеру, сообщение «boot mode (3, 3)» информирует, что контакты GPIO2 и GPIO0 выставлены на HIGH, а GPIO15 – на LOW. Это настройка для нормальной работы модуля (т.е. выполнения программы, записанной на flash-память), но не для режима загрузчика (т.е. программирования flash-памяти).
Примечание: Если выполнить этот шаг неправильно, вы не сможете загрузить прошивку на модуль через последовательный порт.
2. Вы убедились, что модуль находится в режиме загрузчика, но загрузить прошивку по-прежнему не удается. Если вы используете внешний конвертер USB-Serial, проверьте, правильно ли он работает, закольцевав выход на вход. Этой очень простая проверка. Просто подключите друг к другу контакты RX и TX на конвертере как показано на картинке ниже. Затем откройте монитор порта и впишите там несколько символов. Если все в порядке, то все написанные вами символы должны сразу же появится в мониторе порта. Чтобы выполнить такую проверку на модуле со встроенным USB-Serial конвертером, может понадобиться разрушить некоторые дорожки на печатной плате. Я бы сделал это лишь в полном отчаянии. Лучше попробуйте способы, описываемые еще ниже.
![](/ruwiki/images/f/fb/A01-usb-to-serial-loop-back.png)
3. Еще один способ – это просмотр более детальных отладочных сообщений. Кликните в IDE Arduino на Файл > Настройки (File > Preferences) и поставьте галочку рядом с пунктом «Показать подробный вывод: Загрузка» («Show verbose output during: upload»). Чтобы загрузка прошивки была успешной, эти логи должны выглядеть примерно так:
C:\Users\Krzysztof\AppData\Local\Arduino15\packages\esp8266\tools\esptool\0.4.8/esptool.exe -vv -cd ck -cb 115200 -cp COM3 -ca 0x00000 -cf C:\Users\KRZYSZ~1\AppData\Local\Temp\build7e44b372385012e74d64fb272d24b802.tmp/Blink.ino.bin esptool v0.4.8 - (c) 2014 Ch. Klippel <ck@atelier-klippel.de> setting board to ck setting baudrate from 115200 to 115200 setting port from COM1 to COM3 setting address from 0x00000000 to 0x00000000 espcomm_upload_file espcomm_upload_mem setting serial port timeouts to 1000 ms opening bootloader resetting board trying to connect flush start setting serial port timeouts to 1 ms setting serial port timeouts to 1000 ms flush complete espcomm_send_command: sending command header espcomm_send_command: sending command payload read 0, requested 1 trying to connect flush start setting serial port timeouts to 1 ms setting serial port timeouts to 1000 ms flush complete espcomm_send_command: sending command header espcomm_send_command: sending command payload espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data Uploading 226368 bytes from to flash at 0x00000000 erasing flash size: 037440 address: 000000 first_sector_index: 0 total_sector_count: 56 head_sector_count: 16 adjusted_sector_count: 40 erase_size: 028000 espcomm_send_command: sending command header espcomm_send_command: sending command payload setting serial port timeouts to 15000 ms setting serial port timeouts to 1000 ms espcomm_send_command: receiving 2 bytes of data writing flash .............................................................................................................................................................................................................................. starting app without reboot espcomm_send_command: sending command header espcomm_send_command: sending command payload espcomm_send_command: receiving 2 bytes of data closing bootloader flush start setting serial port timeouts to 1 ms setting serial port timeouts to 1000 ms flush complete
Логов может быть больше, и это зависит от количества попыток подключения, выполненных «esptool». Проанализируйте эти логи на предмет аномалий в настройках, выбранных в IDE Arduino – вроде другого последовательного порта, метода сброса, скорости передачи данных и т.д. Исправьте найденные ошибки.
Методы сброса
Если вы дошли досюда, а ошибка «espcomm_sync failed» никуда не делась, значит, пришло время расчехлить пушки покрупнее.
Чтобы понять, что происходит, подключите к контактам GPIO0, RST и RXD на ESP8266 осциллограф или логический анализатор. Затем сравните свои измерения с формой сигнала на графиках ниже. В них задокументированы два стандартных метода сброса ESP8266 для загрузки кода, которые можно выбрать в IDE Arduino – «ck» и «nodemcu».
Ck
На картинке ниже изображена цепь, специально подготовленная для определения формы сигнала при использовании метода «ck». Он проще сброса методом «nodemcu» и поэтому часто используется для подключения стандартных модулей ESP к макетной плате. Сверьте это подключение со своим.
![](/ruwiki/images/0/0d/A01-circuit-ck-reset.png)
Графики ниже показывают сигналы напряжения на контактах GPIO0 и RST при загрузке прошивки.
Первый график показывает форму сигнала в начале загрузки кода.
![](/ruwiki/images/d/d5/A01-reset-ck-closeup.png)
Второй график показывает полную загрузку скетча «Blink.io» на скорости 921600 бод. Это довольно высокая скорость, поэтому на загрузку уходит всего 8 секунд.
![](/ruwiki/images/d/d0/A01-reset-ck-complete.png)
Когда у «esptool» не получается выполнить загрузку, он инициализирует сброс. Подобная ситуация показана, к примеру, на графике ниже.
![](/ruwiki/images/6/61/A01-reset-ck-complete-1-retry.png)
Каждая новая попытка отображается в логах загрузки:
resetting board
trying to connect
flush start
setting serial port timeouts to 1 ms
setting serial port timeouts to 1000 ms
flush complete
espcomm_send_command: sending command header
espcomm_send_command: sending command payload
read 0, requested 1
Цепь, показанная выше, имеет одно важное ограничение при работе с IDE Arduino. После открытия монитора порта ( Ctrl + ⇧ Shift + M ) линии RTS и DTR переключаются в состояние LOW. Поскольку линия RTS подключена к входной линии REST на ESP8266, то ESP8266 просто зависнет в состоянии сброса и запустить его будет нельзя. Следовательно, после загрузки прошивки вам нужно отключить обе линии или воспользоваться другой консолью (не монитором порта IDE Arduino), которая не переключает RTS и DTR в состояние LOW. В противном случае модуль зависнет в ожидании переключения REST в состояние HIGH и в мониторе порта ничего показывать не будет.
Что касается другой консоли, можно воспользоваться монитором порта IDE Arduino для ESP8266, разработанной пользователем mytrain и обсуждаемой в отчете 1360.
Если предпочитаете программы, то для Windows я бы порекомендовал бесплатную и удобную Termite.
Nodemcu
Метод сброса «nodemcu» получил название от платы NodeMCU, где он был реализован в самый первый раз. Этот метод позволяет обойти ограничения с управлением линиями RTS и DTR, о которых говорилось в главе о методе «ck».
Ниже показана простая цепь для измерения формы сигнала при помощи метода «nodemcu»:
![](/ruwiki/images/8/86/A01-circuit-nodemcu-reset.png)
Первый график показывает напряжение на контактах GPIO0 и RST в начале загрузки прошивки:
![](/ruwiki/images/d/d9/A01-reset-nodemcu-closeup.png)
Обратите внимание, что последовательность сигналов длится в 10 раз короче, чем при использовании метода «ck» – примерно 25 мс против 250 мс.
Второй график показывает загрузку скетча «Blink.ino» на скорости 921600 бод. Не считая разницы в длине последовательности сигналов, он выглядит как аналогичный график для метода «ck».
![](/ruwiki/images/b/b6/A01-reset-nodemcu-complete.png)
Третий график тоже демонстрирует загрузку скетча «Blink.ino» на скорости 921600 бод, но с двумя попытками сброса.
![](/ruwiki/images/b/bd/A01-reset-nodemcu-complete-2-retries.png)
Если вам интересно, как реализуется этот метод сброса, обратите внимание на схемы ниже. Он не притягивает линии RTS и DTR к «земле», когда вы открываете в IDE Arduino монитор порта.
![](/ruwiki/images/d/d0/A01-nodemcu-reset-implementation.png)
Такая цепь состоит из двух транзисторов и резисторов, расположенных на плате NodeMCU. Слева изображены полная схема и таблица истинности – она показывает, как сигналы RTS и DTR на последовательном порту преобразуются в контакты RST и GPIO0 на ESP8266. Более подробно смотрите в репозитории NodeMCU на GitHub.
Эм... похоже, я застрял
Надеемся, советы выше помогли вам справиться с ошибкой «espcomm_sync failed», а загрузка прошивки на ESP8266 стала быстрой и беспроблемной.
Если опять нет, пробегитесь по вопросам ниже (они представляют короткую версию того, о чем писалось в главах выше):
Предварительные проверки
- Подключен ли ваш модуль к последовательному порту? Видит ли его IDE Arduino?
- Отвечает ли подключенный девайс на IDE Arduino? Какое именно сообщение появляется в отладочном окне?
- Правильный ли модуль ESP8266 выбран в меню «Плата»? Что именно у вас выбрано?
- Пробовали ли вы снизить скорость загрузки? Какую скорость вы уже попробовали?
Дополнительные проверки
- Какое сообщение присылает ESP8266 на скорости 74880 бод, когда вы входите в режим загрузчика?
- Проверяли ли вы конвертер USB-Serial, зациклив его? Каков был результат?
- Соответствует ли информация, показанная в логах, настройкам IDE Arduino? Если да, что в них?
Метод сброса
- Какой метод сброса вы используете?
- Какая у вас схема подключения? Она соответствует той, что показана в FAQ?
- Какую форму имеет сигнал во время сброса? Она соответствует форме сигнала в FAQ?
- Какую форму имеет сигнал при полной загрузке скетча? Она соответствует форме сигнала в FAQ?
ПО
- Вы используете стабильную версию аддона ESP8266 для IDE Arduino? Что это за версия?
- Как называется и какая версия у ваших IDE и ОС?
Если застопорились на каком-то шаге, опишите его как можно подробней и обратитесь за помощью на форум сообщества ESP8266.
Итого
С таким разнообразием модулей и плат на базе ESP8266, а также возможных методов сброса, решение проблем с загрузкой может потребовать очень много проб и попыток. Если вы новичок, лучше использовать платы со встроенными USB-Serial конвертером и цепью для питания. Осторожно проверяйте сообщения в отладочном окне, а затем действуйте согласно этим сообщениям. Выберите правильный тип модуля в IDE Arduino и правильно настройте скорость загрузки прошивки. Проверьте, действительно ли плата переключена в режим загрузчика. Проверьте работоспособность USB-Serial конвертера, зациклив его. Проанализируйте детальные логи на предмет несоответствий с настройками IDE Arduino.
Проверьте схему подключения и форму сигнала на соответствие используемому методу сброса.
Если застряли, спросите совета у сообщества, предоставив данные обо всех выполненных вами шагах.
![](/ruwiki/images/0/0d/A01-test-stand.jpg)
На картинке выше показана тестовая площадка для метода «ck».
Во время подготовки этой статьи не пострадало ни одного ESP8266.