AVRライタ(For ATmega328P)を作ってみる

お久しぶりです。最近は新型 DC マイクロマウスの製作(とデレステ)に夢中でブログ更新できていませんでしたね。という訳で今回はちょっと前に作ったものの Twitter でつぶやくことくらいしかしていない 自作 AVR ライタ についてご紹介します。

Motivation

ちょっと前に PICerFT で PIC ライタ製作をしました。Y. Onodera さんの書き込みソフトでは書き込み時以外は VDD は Hi-Z となっていて、ライタに繋ぎっぱなしで電源を ON にすることは出来ませんでした。この際に Visual C# と FTDI の D2XX ライブラリを用いて、無理やり VDD をオンにするソフトを制作 した(なんとかできた)ということが最初のきっかけです。
そして、サークルの後輩が良い感じに他人のソースコードをパクって(非難ではなく、むしろ褒めています)万能マイコンボードを作成。このボードでは乗っているマイコン自体の開発も、CMSIS-DAP としての動作も、AVR ライタとしての動作も可能というものでした。ここの AVR ライタに惹かれ、今回は FT232RL の BitBang を用いてライタ作ってやんよ ということになったというわけです。前置き長いですね

使用ハードウェア

  • 秋月 FT232RL モジュール

これのみです。その他外部に抵抗器とかは必要としません(あった方がいいが)。

その他仕様

対象マイコンは ATmega328P のみです。その他 88 や 168 も同じように出来るとは思います。と言っても、本ソフトはデバイスIDで接続チェックとか一切してないんで普通に可能です。
開発環境は Mac、動作確認も Mac でのみしております。実際の使い方はこの記事一番下の方で。

参考資料・大まかなコマンド発行手順

参考資料は avr.jp さんにある、328P の完全データシートと AVR910 です。データシートは 31 章の MEMPROG をご参照あれ。ちょっと訳が独特なので、「普通の」日本語との対応表を書いておきますね。

訳出 解釈
施錠ビット ロックビット
識票バイト 元は Signature Bytes。デバイスIDがある所。
並列プログラミング パラレルプログラミング
直列プログラミング シリアルプログラミング
プログラム/非プログラム Programmed/Unprogrammed
語数 ワード数
多忙フラグ ビジーフラグ
されてしまう 現在完了+受身の直訳(have been Vpp)

以下、作成時のポイントを列挙しますね。

  • 波形は全て手動で作成。すなわち、わざわざシリアルクロックも自作でやった。
    • PC からの送信はクロックの立ち上がりで行われる。一方マイコンからの受信は立ち下がり
  • 書き込み/消去命令はただの wait では上手くいかなかった。ビジーフラグのポーリングが必須。
    • プログラム書き込み時は、読み書きを1ワードごとに繰り返すため通信速度が遅い遅い。
    • やや遅いのは確かだが、1バイト書き込むごとにポーリングを入れたら動作がめちゃ安定するようになった。しかも 23400bps でも十分。
    • というか、FT232RL の受信バッファオーバーランを防ぐために、毎コマンド発行後に読み込んでいる。
  • 書き込み時は 下位ワードアドレス -> 上位ワードアドレス -> ページアドレス の順で指定する。
    • ページアドレス指定と同時に書き込みコマンドが発行される。
  • コマンド表の濃い赤の部分はデバイスから値が返ってくるということ。その際の PC からの送出データはなんでも良い。
  • AVR はワードごとのリトルエンディアン。0xABCD -> CD AB の順に書き込む。
  • HEX ファイルのパーサがつらい。strtok とか駆使して頑張った。

完成したソフトウェア

一応完成です。動作はめちゃ遅いですが。ソフト名はかの有名な avrdude をもじって avrNerd (AVR オタク)としました。
FTD2XX ライブラリを使用しているため、FTDI のドライバは切っておいてください。下のコマンドのどちらかを打てば切れます。再度有効化したい場合は unloadload に置き換えて実行してください。

$ sudo kextunload -b com.FTDI.driver.FTDIUSBSerialDriver
$ sudo kextunload -b com.apple.driver.AppleUSBFTDI

コマンドオプションは以下のとおりです。

オプション 機能
-e EEPROM含めチップ全消去
-w path path にある HEX ファイルを書き込み
-lf 0xAA 下位ヒューズビットを 0xAA に書き換え
-hf 0xAA 上位ヒューズビット
-ef 0xAA 拡張ヒューズビット

配線は ここ にあるとおりです。なおフラッシュ読み込み機能はありますが、クソ遅いので利用はお勧めしません。ダウンロードはこちらからどうぞ↓。

avrNerd Rev. 2 (2018/3/5 版)

当然のことながら、動作は保証しませんので、実験として利用する、実際にどういうプログラムを書いたかを見てみる等に使用することをお勧めします。

修正したい

  • ヒューズバイトを複数書き込もうとしても、一番最初に指定したものしか書き込まれない事象を解決
  • Baud Rate をコマンドラインで指定できるように
  • help 表示をちゃんとさせる