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 (エラー発生)
以下、解析備忘録
上記の時に、どのような状態になっているのかを、確認してみました。
まず、オシロスコープで確認しましたが、物理的には問題なく動作しているようです。
つぎに、プロトコルアナライザを使って確認してみました。
これを見ても、問題なく通信は出来ている様子です。
その時問題が起きなかった PL-2303 を使って比較をしています。
エラーが起きているのは通信途中のデバイス側からの応答メッセージのタイミングのようです。
この通信内容を みんなだいすき Excel にして比較してみます。
バイナリーデータをそのまま見てもわからないので、参考資料として以下の資料も合わせて読みます。
ESP8266 データシートページ の ESP8266 SDK Application Note Firmware Download Protocol ダウンロード
すると、どうやら CH340G のボーレート 9,600 bps の時は はじめに指定していた送信サイズとそのチェックサムを無視して 早めにデータを切り上げて終了コードを送ってしまっているようです。
なぜ USB Serial 変換アダプタによってこのような違いが出るかわかりませんが、ボーレートを早くするとこの現象は発生しなくなるようです。
ドライバの問題か、Arduino IDE から呼び出しているボードマネージャーが悪いようですが、とりあえず動くようになったので解析は一旦終了。