USB Serial で ESP8266 書き込みエラー時の解析

USB Serial変換IDに CH340G を使用したハイパワーUSB Serial アダプタを作りました。
これを使って Universal ESPduino (ESP8266) に書き込みをしようとした所、エラーメッセージが表示されて書き込めない事があったため、解析してみました。

エラーメッセージは以下のようなもので、転送はしているようですが、デバイス側からエラーとして受け取ってもらえていないようです。

ビルドオプションが変更されました。全体をリビルドしています。
最大1044464バイトのフラッシュメモリのうち、スケッチが287487バイト(27%)を使っています。
最大81920バイトのRAMのうち、グローバル変数が38188バイト(46%)を使っていて、ローカル変数で43732バイト使うことができます。
Uploading 291632 bytes from C:\Arduino\temp/NewOTA.ino.bin to flash at 0x00000000
error: failed sending 1072 bytes
     ・・・・・・
.error: failed sending 1040 bytes
warning: espcomm_send_command: didn’t receive command response
warning: espcomm_send_command(FLASH_DOWNLOAD_DATA) failed
warning: espcomm_send_command: wrong direction/command: 0x01 0x03, expected 0x01 0x04
error: espcomm_upload_mem failed
error: espcomm_upload_mem failed

あるいは、このようなエラーになることもありました

ビルドオプションが変更されました。全体をリビルドしています。
最大1044464バイトのフラッシュメモリのうち、スケッチが287487バイト(27%)を使っています。
最大81920バイトのRAMのうち、グローバル変数が38188バイト(46%)を使っていて、ローカル変数で43732バイト使うことができます。
Uploading 291632 bytes from C:\Arduino\temp/NewOTA.ino.bin to flash at 0x00000000
warning: espcomm_send_command: didn’t receive command response
warning: espcomm_send_command(FLASH_DOWNLOAD_DATA) failed
error: espcomm_upload_mem failed
error: espcomm_upload_mem failed

 

結論を先に言うと、以下の2点が原因でした。

  • RTSではなくCTSが必要 → はんだブリッジ切り替え
  • ボーレートが 9600bps ではNG → 115,200 bps を使用

ちなみに、ハイパワーUSB Serial アダプタでは、以下のボーレートを試してみましたが、正常に書き込めなかったのは  9,600 bps だけでした。

921,600
512,000
256,000
115,200
57,600
9,600  (エラー発生)

 

以下、解析備忘録


上記の時に、どのような状態になっているのかを、確認してみました。

まず、オシロスコープで確認しましたが、物理的には問題なく動作しているようです。

つぎに、プロトコルアナライザを使って確認してみました。

UART をキャプチャーした様子

これを見ても、問題なく通信は出来ている様子です。
その時問題が起きなかった PL-2303 を使って比較をしています。
エラーが起きているのは通信途中のデバイス側からの応答メッセージのタイミングのようです。

この通信内容を みんなだいすき Excel にして比較してみます。

バイナリーデータをそのまま見てもわからないので、参考資料として以下の資料も合わせて読みます。

ESP8266 データシートページ の ESP8266 SDK Application Note Firmware Download Protocol ダウンロード

すると、どうやら CH340G のボーレート 9,600 bps の時は はじめに指定していた送信サイズとそのチェックサムを無視して 早めにデータを切り上げて終了コードを送ってしまっているようです。

なぜ USB Serial 変換アダプタによってこのような違いが出るかわかりませんが、ボーレートを早くするとこの現象は発生しなくなるようです。

 

ドライバの問題か、Arduino IDE から呼び出しているボードマネージャーが悪いようですが、とりあえず動くようになったので解析は一旦終了。

コメントを残す