背景

PCとシリアル接続する基板の開発案件を実施しました。基板はArduinoを搭載する構成になっており、PCとの接続はFTDIのRT232RLにより、USBの仮想COMで通信を行うものです。Arduinoへのプログラムの書込みは
RT232RL のBit Bangモードを使用する方法を採用しました。本稿では、この開発時の失敗と解決方法について後述します。

Bit Bangモード とは

USBシリアル変換ICとして、おそらく最も普及していると思われるのが、FTDI社のRT232RLです。これはPCのUSBを仮想COMとしてRS-232Cシリアル通信を可能にしてくれる大変便利なICです。
RT232RL はシリアル通信だけではなく、パラレルの信号制御も可能で、この機能の事をBit Bangモードと言います。この機能を使うとちょっとしたパラレルの信号制御ができてしまう優れもので、PCからLEDを光らせるってことも可能です。
Bit Bangモード はRS-232Cの通信制御ポートも任意に制御でき、拡張バスのCBUSポートも制御できるため、かなりの事がPCから制御できてしまう機能になっています。参照:FTDIのBit Bangに関する資料

Bit Bangモードを使ってプログラムを書き込むソフトウェア

avrdude-serjtag

avrdude-serjtagは今回最も重要なソフトウェア。すz氏が制作したソフトウェアで、「すzのAVR研究」で公開しています。環境の構築方法については、「外付けAVRライタ無しでBootloaderを書き込む」のサイトを参考にさせていただきました。

Arudino IDEで出力されるHEXファイル

Arduino IDEでスケッチをコンパイルするとHEXファイルが出力されます。ところがどこにファイル出力されたのかデフォルトではわかりません。その場合は
Arduino IDE の環境設定>にある「より詳細な情報を表示する」にチェックを入れて保存します。

コンパイルが終了した際に表示される内容の中にHEX拡張子のファイル名が表示されます。ここで表示されているフォルダがあるので、これをコピーしてファイルエクスプローラーでペーストしてフォルダに移動すれば見つかります。ここで表示されるフォルダ名はIDEを起動する度に変わります。

RT232RLとMPUとの回路接続

失敗例(CBUSで書込み制御する考え方)

まず、失敗例から説明します。Bit Bangは、ほぼすべてのPinの制御ができるため、ハード的にはどこに接続しても書込みが可能と思われがちです。そのため書込み制御をCBUSに接続した回路例です。

ハードウェア設計者から見れば「できるはず」と思います。しかし、この構成実現可能にするのは、avrdude-serjtagの機能によります。
avrdude.confで、書込み制御信号のポートをCBUSに指定しても書込みはできませんでした。
avrdude-serjtag のバージョン をアップしてもできませんでした。
avrdude-serjtag はCBUSを使った書込み制御は想定して作られていません。LEDを光らせる程度にしか使っていない仕様になっています。

avrdude-serjtag のソースを使ってCBUSで書き込めるようにするのか?

avrdude-serjtagの恩恵を受けなければ無駄な工数をかけるだけです。やめましょう。

成功例 (通信制御ポートで書込み制御する考え方)

素直に、RTS、CTS、DTR、DCR、DCDなどの通信制御ポートをArudino MPUのICSP接続に対応させます。
通信制御ポート にさえ接続されていれば、 avrdude-serjtag は対応していますので、 avrdude.conf で設定した信号接続の内容により書き込めます。以下は avrdude.confの設定例です。 ピン番号を指定します。

#arduino diecimila
programmer
  id=”diecimila”;
  desc = “FT232R Synchronous BitBang”;
  type = ft245r;
  miso = 3;  # CTS X3(1)
  sck = 5;  # DSR X3(2)
  mosi = 6;  # DCD X3(3)
  reset = 7;  # RI X3(4)
;

あとがき

ハードウェア設計者の「できれば回路は変更したくない」との一言で、avrdude-serjtagのソースと一週間ほど睨めっこしましたが、工数の見込みが立ちそうにないことが判明し、回路の修正を依頼するに至りました。成功事例のある方法による設計をすべきと、あらてめ考えさせられた案件でした。