[トップページへ戻る]

FT232Rモジュール利用 AVR TPIライター

2012年2月
米粒AVRと呼ばれたりする非常に小さなAVR、ATtiny10。6ピンしかありません。ファームの書き込みにはSPIライターや高電圧パラレルライターではなく、TPI (Tiny Programming Interface)に対応したライターを使います。AVRISP mkII(Atmel純正ライター)は対応しています。TPIライター、面白そうだったので自作してみました。

【用語】
ATtiny10は一部の用語が他のtiny/megaシリーズと異なります。この記事では次のように表記しています。
(ATtiny10) Configration Bits → Fuse Byte(ヒューズバイト)※Fuse Low Byte とも。
(ATtiny10) Device ID Bits → Signature Byte(署名バイト)

【関連記事】 FT232Rモジュール活用シリーズ、他
#1 ドライバのインストールからソフト開発まで ←FT232Rモジュールの導入方法。
#3 FT232-AVRライター とにかく導入が簡単 ←SPIライター。
AVR 高電圧パラレル/シリアルライター ←USB-シリアル変換モジュールを利用。
2012/04 追記 HID TPIライター ←本記事のライターより実用的なTPIライター。

秋月電子通商
FT232RL USBシリアル変換モジュール (商品ページ)


ご案内
2012/11 追記
本ライター(FTTPIW)のv1.00はリリース当時の開発環境において安定動作していました。8月、何らかの理由で動作が不安定になっていることが分かり、安定化を目指したv1.01をリリースしました。11月、プログラムを改良してv1.02をリリースしました。開発環境において安定動作しています。
これまでのバージョンアップにより、読み書き速度が低下しました。v1.00の時点でも常用するには厳しい速度だったので致命的です。今後、本ライターの改良は難しいと思います。本記事は自作TPIライターの一例として見るに留め、実際に製作するものとしては「HID TPIライター」の方を検討してください。


FT232-AVR TPI Writer
FTTPIW : FT232-AVR TPI Writer
ダウンロードfttpiw.zip FTTPIW v1.02
LEDチカチカテスト同梱(Cのソース,HEXファイル)
開発/動作確認環境
WindowsXP, .NET Framework 3.5/SP1

FTTPIWはATtiny10シリーズ用のライターと書き込みソフトです。
SPI方式でもなく高電圧パラレル方式でもない、TPI方式のライターです。
必要な物は秋月電子FT232RLモジュールと、数百Ωの抵抗2個だけです。

同梱のLEDチカチカテストのソース内に、ATtiny10のソフト開発における注意点を書いたので参考にしてください。
・存在する汎用レジスタはR16-R31/R17はゼロレジスタ。X:R26-R27(Lo-Hi), Y:R28-R29(Lo-Hi), Z:R30-R31(Lo-Hi)
・入力ピンのプルアップはPORTBレジスタではなくPUEBレジスタで設定する。
・GCCのバグによりグローバル変数が使えない。レジスタに割り付けると使える。…(*)
・_delay_ms()で263ms未満だとコンパイルエラー(263msというのはF_CPU=1MHzの場合)※delay.hも参照 …(*)
(*) AVR-GCCがバージョンアップしていけば、いずれ対応されると思います。

使用例 (v1.00)
ISPでの書き込み、動作開始、停止。
PB0,PB1,PB2に接続したLEDが点灯。
1秒ごとに2進数を表す形で変化します。
※動画は無音です。
読み書きの速さはPC環境にほとんど依存しません。
FT232の仕様上、スピードは遅いです。
およそ、{HEX容量(byte) x 0.08}秒かかります。
例: 1024byte → 約80秒。 200byte → 約16秒。


【参考】 書き込みテスト用のダミーファイル詰め合わせ
dmyhexeep.zip

2012/11 追記 v1.02の変更点について
安定化のため内部パラメータを変更しました。動作環境(PC)によって速さに違いが出ました。
【参考】 v1.02
実行環境:WindowsXP/SP3, Core2Duo E6320(1.86GHz)

上:オプション指定なし(全てデフォルト値)で実行した結果。
下:レイテンシータイムのオプション「-ftl4」を指定した結果。
  1KBの書き込み+ベリファイで5分強。

読み書きエラーが発生する場合
FT232Rモジュールを一旦PCのUSBコネクタから抜き、再度差し込んで5秒ほど待ってからfttpiw.exeを実行してください。それで正常に動作しなければ、オプション指定で'-ftl','-ftw'を調整してみてください。それでも正常に動作しなければ、済みませんがあきらめてください。※「HID TPIライター」を製作してください。

回路図と配線図
回路図

※訂正:12Vを受けるトランジスタはダーリントン接続すべきです。


配線図

より安定した動作のため、ターゲットデバイスの近くにパスコンを入れることをお勧めします。

FT232Rモジュールのジャンパー設定
J1 [1-2-3] [2-3]をショートする。(I/Oピンが5V入出力になる)
J2 [1-2] FT232Rモジュールの使用法として基本的に常時ショートさせておく。
(FT232Rモジュール自体の電源5VをUSBコネクタから取る)

ブレッドボード上の使用例 基板で仕上げる場合

中央の6ピンDIPがATtiny10です。
LEDアレイは右端の3個を使用しています。

関連記事「#3 FT232-AVRライター とにかく導入が簡単」のハードがそのまま使えます。作り方など詳細はそちらの記事を見てください。
図中の抵抗100Ωは、100Ω〜1kΩで適当に。
電源は5Vにします。3.3Vは不可。

使い方とオプションスイッチ
ヘルプ画面
……。見ての通り「雰囲気英語」です。オプションの意味が思い出せればよし。※日本語だと文字数が多くて画面に収まらない。
使い方とオプションスイッチは拙作AVRライター「FTAVRW」と同様です。※元々はavrsp.exe(ChaN氏)を参考にしています。
ATtiny9/5/4にも対応したつもりですが、動作確認したのはATtiny10のみです。


使い方:書き込み方法
方法1
コマンドライン入力で実行します。
'fttpiw'の後にHEXファイル名を指定します。オプションスイッチも一緒に指定します。

方法2
fttpiw.exeのアイコン/ショートカットアイコンに、HEXファイルをドラッグ&ドロップします。オプションスイッチは別途iniファイルに記述しておきます(後述)。

ヒント/注意
  • ファイル名やオプションスイッチの記述順は特に決まっていません。
  • HEXファイル+ヒューズ設定が統合された形式のファイルには対応していません。
  • HEXファイルは複数のファイルを指定することもできます(テーブル配置などの利用)。
    その際、アドレスが重なった部分があると、後ろのファイルの内容が有効となります。
    例: >fttpiw file1.hex file2.hex
    file1.hexとfile2.hexでアドレスが重なっている部分があると、その部分はfile2.hexの内容が有効になる。
使い方:コマンド指示
ターゲットAVRからISPケーブルを抜かずに、AVRの動作を開始することができます。いわゆる「ライターを論理的に切り離す」機能です。コマンドラインから「go」コマンドを入力します。例: >fttpiw go
動作中のAVRを書き込み待機状態に戻すには「stop」コマンドを入力します。例: >fttpiw stop
ただ、「stop」コマンドを実行せずとも、AVRの動作中にいきなりhexファイルをドラッグ&ドロップしても書き込みはできるので、「stop」コマンドはあまり使わないかもしれません。

コマンド 説明
go ライターをターゲットAVRから論理的に切り離し、AVR内のプログラムを実行します。
技術的には、FT232RモジュールのI/Oピンを全てハイ・インピーダンスにしています。
stop ターゲットAVRにリセットをかけ、プログラム書き込みモードに遷移します。
技術的には、FT232RモジュールのI/Oピンのうち、RESET線にLoを出力し、SCK/MISO/MOSI線をハイ・インピーダンスにしています。

オプションスイッチ
オプション 説明
-rp -rp<n>
-rf
ターゲットAVRの内容を読み出します。
順に、プログラムコード(Flashメモリの内容)、現在のヒューズ設定。
※ヒューズ設定の表示はavrsp.exe(ChaN氏)に付属するfuse.txtの書式を参考にしました。
プログラムコードはインテルHEX形式で表示します。ファイルへ保存するにはリダイレクトしてください。例: fttpiw -rp >flash.hex
プログラムコードは1レコード内のデータ数を1〜255byteで指定できます。デフォルトは16byteです。
例: fttpiw -rp32 >flash.hex ※1レコードあたり32byteで出力。
-r ターゲットAVRに関する情報を表示します。
署名バイトやメモリサイズなど。
-v 書き込みせず、ベリファイのみ行います。
ターゲットAVRからプログラムコードを読み出し、指定したHEXファイルの内容と照合します。
-v- 書き込み後、ベリファイしません。
プログラムコードを書き込んだ後、通常は自動的にベリファイしますが、それをスキップします。
-e ターゲットAVRのプログラムコード(Flashメモリのコード領域)を消去します。
ロックビットは解除されます。ヒューズ設定は影響を受けません。
プログラムコードを書き込むとき、ライターソフトは自動的に消去処理を実行しています。
-fl<b> -fl<h> ヒューズバイト(Configration Bits)を設定します。※'l'は小文字のエル。
※他のAVRに倣い、ここではヒューズLowバイトと呼んでいます。
<b>は8桁の0/1で指定します。例: -fl11111001 ※'0'がプログラム、'1'がアンプログラム。
<h>は1byteの16進数で指定します。大文字小文字は区別しません。「0x」は付けません。例: -flF9
-l<b> -l<h> ロックビットを設定します。※'l'は小文字のエル。
<b>は8桁の0/1で指定します。例: -l11111100 ※'0'がプログラム、'1'がアンプログラム。
<h>は1byteの16進数で指定します。大文字小文字は区別しません。「0x」は付けません。例: -lF6
-dev<n> PCに接続したFT232Rモジュールのインデックスを指定します。デフォルトは0番。
モジュールを1個しか接続していない場合は0番に確定しています。2個以上接続している場合に、どのモジュールを使用するのか指定します。例: -dev2 ※3番目のモジュール。
-w
-w1
-w2
1回の処理が終わった後のキー入力待ちをどうするかです。デフォルトは'-w'。
-w : 常時キー入力待ちをする。
-w1 : エラー発生時のみキー入力待ちをする。
-w2 : 常時キー入力待ちをしない。
アイコンへドラッグ&ドロップする使い方をしていると、実行時にコマンドプロンプトが開き、結果を表示したあと勝手に閉じてしまいます。エラーが発生してもメッセージが読めません。そのためこのオプションを指定し、PAUSE状態にします。
あらかじめコマンドプロンプトを開いてコマンドラインからキー入力する使い方をしている場合は、キー入力待ちをする意味がないので(コマンドプロンプトは勝手に閉じない)、'-w2'指定でよいです。
高度な設定
-pa<nnnn> RESET/SCK/MISO/MOSIと、FT232RモジュールD0〜D7のピンアサインを指定します。
<nnnn>は0〜7を組み合わせた4桁の数字列です。数字の重複は許可しません。
4桁の数字列は左から順にRESETピン、SCKピン、MISOピン、MOSIピンの対応を表します。
例: -pa1042 …RESET=D1、SCK=D0、MISO=D4、MOSI=D2 ※これがデフォルト値(配線図と同じ)。

図示した配線図と異なるピンアサインでライターを使用したい場合、このオプションでピンアサインを指定し、iniファイルに記述しておきます。
-t<name> 何らかの理由で署名バイトが読めないターゲットAVRに対し、名前を指定してライターに認識させます。AVRの型番の「AT」を除いた部分を記述します。
例: -ttiny10 ※ATtiny10として認識させる。
-ftl<n> FT232Rのレイテンシータイム。0〜16msを指定します。デフォルトは16ms. 値が小さいほど読み書きが速くなりますが、動作が不安定になります。
※PC環境によります。
-ftw<n> FT232Rの内部処理でWrite直後にReadする際の待ち時間(ms)。レイテンシータイムを元に自動設定されます。読み書きエラーが頻発する場合、1〜20ms程度を指定すると改善するかもしれません。
※PC環境によります。
-gt<n> TPIのガードタイム。{0,2,4,8,16,32,64,128}のどれかを指定します。デフォルトは2カウント。値を変更しても、基本的にライター動作には影響しません。
※エラー頻発時の気休めオプションです。

2012/11 追記
v1.01で'-ftl','-ftw','-gt'オプションを追加しました。v1.02で安定性が向上しました。読み書き速度を短縮するには'-ftl'オプションが効果的ですが、攻め込んだ値を指定するとエラーが頻発します。ほどほどにしてください。
高速化/安定化のためにオプション指定を試行錯誤するくらいなら、このライターよりも「HID TPIライター」を製作することをお勧めします。

iniファイル
fttpiw.ini
オプションスイッチをfttpiw.iniに記述しておくと、fttpiw.exe実行時にそれが反映されます。
fttpiw.iniはfttpiw.exeと同じフォルダに置きます。
iniファイルとコマンドラインに、値が違う同じオプションスイッチがあった場合、コマンドラインの方が有効となります。
例: iniファイルに'-w1'が記述されていて、コマンドラインから'-w2'を指定すると、'-w2'の方が有効となる。




解説編

TPI - Tiny Programming Interface について
TPIの詳細はATtiny10のデータシートを読んでください。ここではライター製作の観点でコメントします。


フレーム形式
TPIの通信は1本のデータ線を送受信に使う半二重通信です。
{スタートビット:1('0')+データビット:8+パリティビット:1(偶数パリティ)+ストップビット:2('1''1')}の、計12ビットを1フレームとする単位で送受信を行います。RS232Cのシリアル通信と同様のフレーム形式です。
それならPCに仮想COMポートを増設してライターソフトを作ればいいかというと…そうは行かず。
RS232Cの通信に、送受信と同期したクロック出力はありません。これがあれば話は簡単だったのですが。
【ポイント】
TPIライターを作るには、送受信に同期したクロック出力が必要。

ガードタイム
ライターが送信方向から受信方向へ切り替わるとき、受信準備のため、一定時間待ちます(ガードタイム)。具体的にはアイドルビット('1')を何個か出力します。TPIモードに入った後、0〜128個で設定します(デフォルトは128)。実際に実行されるガードタイムはこの設定値プラス2個です。
ガードタイムは短すぎると通信エラーが発生します。試行錯誤しながら適切な値を決めます。
※クロックの送信を止めず、送信から受信へレジスタを切り替えたり準備していると、その間にターゲットデバイスからデータがやってきてしまい、取りこぼす。…といったことが起こり得ます。それを回避するのがガードタイムです。
【ポイント】
フレームを送信後、{2 + (0〜128)}個のアイドルビットを出力すると、受信するデータが送られてくる。

ライターが受信方向から送信方向へ切り替わるとき、特にガードタイムはありませんが、データシートには最低1ビットのアイドルビットをスタートビットの前に挿入すべきとあります。
14.3.10 Direction Change
(途中略) When the external programmer changes from receive mode to transmit, a minimum of one
IDLE bit should be inserted before the start bit is transmitted.

複数個のフレームを連続して送信する場合、アイドルビットを挿入する必要はありません。挿入しても通信エラーにはなりません。

コマンド
TPIで使用するレジスタや、フラッシュメモリのデータ領域へは、コマンドを実行してアクセスします。
コマンド 内容
SKEY 64bitのキー:NVM_PROGRAM_ENABLE_KEYをターゲットデバイスに送信する。
{1byte * 8要素}の配列で定義して、末尾要素のLSBから送信すればよい。
SLDCS
SSTCS
TPI制御レジスタ(Control and Status Space Register)の読み書き。
SSTPR データアドレスをポインタレジスタ(PR)にセットする。
SLD/PR++
SST/PR++
Flashデータ領域の読み書き。
プログラムコード、署名バイト、OSC校正バイト、ヒューズバイト、ロックビット、が対象。
SIN
SOUT
NVMCSR, NVMCMDレジスタの読み書き。どちらもI/Oレジスタ。
IN…値をバッファへINする(レジスタからloadする)。
OUT…値をバッファからOUTする(レジスタへstoreする)。

TPIライター製作案

(1)
何らかのマイコン(例えばAVR ATtiny2313)のSPI(Serial Peripheral Interface)機能を使ったライターです。
TPIDATA線をMISO(ライター側受信)/MOSI(ライター側送信)に分け、ショート防止(過電流保護)のため100Ω〜1kΩ程度の抵抗を入れます。PCとマイコンの接続には任意のUSB-シリアル変換モジュールを利用します。

(2)
(1)のUSB-シリアルモジュールにFT232Rを使うとすれば、ビットバンモードでSPI機能を作り込んでターゲットデバイスと通信することができます。今回製作したライター「FTTPIW」はこのタイプです。

(3)
TPIのフレーム形式はUSARTのフレーム形式と同様なので、マイコン(例えばAVR ATtiny2313)内蔵のUSARTを使ってターゲットデバイスと通信します。マイコンのUSARTにはRxD/TxDに同期したクロック出力機能があるので(XCK)、TPIライターが作れそうです。…が、そうするとPCとの通信にUSARTが使えません。USARTを2系統内蔵したマイコンなら問題解決です。安価で入手性のよいATmega88Pあたりで作るなら、V-USB技術を使います。

(1)のハード構成は「AVR 高電圧パラレル/シリアルライター」と同じです。そこにTPIライターのファームを詰め込んでしまうことも出来ます。しかしそんなに何でも詰め込んでしまっては、かえって使いにくいかもしれません。
(3)の案はUSBaspをTPI対応のavrdudeで使うことと同じです。わざわざ自分でソフトを開発しなくても、自作TPIライターは既にあったわけです。ですが自分はライターソフトの開発に興味があったので、独自に製作しました。

TPIはBREAKキャラ(1フレーム全体がビット'0'のフレーム)をサポートしていますが、ライターは必ずしもBREAKキャラを送信する必要はありません。ターゲットデバイスがBREAKキャラ待ちの状態に陥った(おちいった)と判断したら、単に通信エラー発生としてプログラムを終了させるのです。今回製作したライター「FTTPIW」はそのようにしています。

FT232Rビットバンモード使用上の注意
FT232Rのレイテンシタイム(Latency Time/応答遅延時間)はデフォルトで16msです。最小0msまで設定できますが、正常動作は保証されていません。例えばビットバンモードにおいて、書き込み関数(FT_Write())に続けて読み込み関数(FT_Read())を実行するとき、レイテンシタイムが数msだとエラーが頻発します。
最適値は通信速度とプログラムの組み方によります。経験上、レイテンシタイムは4ms以上、書き込み後の読み込みにはレイテンシタイム+4msの待ち時間で、安定動作するように思います。※あくまで経験に基づく値。
2012/11 追記
レイテンシタイムを短くして読み/書き関数を連続実行するとエラーが発生します。実処理時間が追いつかないのでしょう。最適値はプログラムの組み方や実行環境(PC)によります。参考までに、FTTPIW v1.02ではレイテンシタイム4ms、書き込み後の読み込み待ち5msでも安定して動作しました。※開発環境において。他の環境においては保証されない。


◆ ◆ ◆
FT232Rモジュールを利用したAVR用TPIライターを作りました。
米粒AVR ATtiny10を使ってみたい、とりあえず使えるライターが欲しい、
というつもりで作ったのでスピードはあまり追求していません。
その点で製作案(1)か(3)を作ってみたい気もします。


(C) 『昼夜逆転』工作室 [トップページへ戻る]
inserted by FC2 system