前回記事を書いてからだいぶ時間が経っていました。「忘れてるんじゃないのか」と思う方もいましたかねぇ(いないか。ほとんどアクセスされてないし)。色々と忙しかったりして後手に回ってしまったというのが言い訳ですが、最近ついに手を出し始めました。
参考資料
現状特に何も出来ていないのですが、以下の資料で色々と調べたりしました。全て FTDI (今は Bridgetek) のアプリケーションノート番号も添えて記載します。
- FT93x Datasheet Embedded Microcontroller Datasheet
- ハードウェアの概要が載っているデータシート。回路構成とピンについてこれを参考に。
- FT93x Application Manual(AN_010)
- ペリフェラル等の詳細。
- FT900 API Programmers Manual(AN_365)
- ライブラリ等の参考に。
- FT9xx DFU Programming - YouTube
- (おそらく)メーカーが公式で出している動画です。
構成
前回の記事にある通り、FT932Q という 48pin QFN の物を買いました。そしてブレッドボードで評価したいので、Aitendo の QFN 変換基板 を購入しはんだ付けしました。
あと、後述するようにデバッガ・プログラマも購入して導入予定です。僕にしては珍しいでしょ。
そして今回は取り敢えず動作確認をしたいので、ブレッドボードでサクッと組みました。
一通り組んだ様子がこちら。はんだ付けめちゃめちゃ上手くないですか???🐎🐎🐎
回路構成
データシートに従ったのみです。一部回路定数が不明だったのでその点も含めて簡単に記します。
電源
まずは 3.3V を印加します。ピンダイアグラムで VCCIO3V, VCCIO3VA, VCCUSB3V3, ADC_REFP, DAC_REFP を全て 3.3Vに、GND を 0V に接続します。
また、マイコン内部のレギュレータによって 1.2V が生成されます。このためにコンデンサを外付けする必要があります。33 番ピンの方を 4.7uF と 0.1uF に接続します。僕は怠惰なので、10uF を1つを接続しただけです。
リセット周り
RESETN がアクティブ Low のリセットピンです。プルアップ抵抗で吊って GND に接続します。STESTRESETN は指示通り GND 直結です。
USB周り
D_DM, D_DP をそのままつなぎます。また、DRREF は 12kOhm を介して GND につなぎます。おそらくシャントレギュレータ的なものでしょう。12k ピッタリの値のものが良いです。
また、VBUS_DTC で USB の接続を検出するので、1kOhm を介して VBUS(5V) に接続します。3.3V 電源のデバイスなのに 5V つなぐのは怖いですね。
ブートローダー仕様・DFUでの吸い出し
それで、書き込みはどうやったら良いのか、ですが、USB DFU ブートローダーを使います。ブートシーケンスやら詳しい仕様は不明ですが、マイコンを PC に接続すると USB DFU 機器として認識されます。Mac で lsusb
をした時の一覧はこちら。一番上の行がそれですね。やった!
書き込みは毎回恒例の dfu-util
を使います。とあることに気をつければ(ここ重要)、特に問題なく書き込みできます。詳細は記事下部の悲劇をご覧あれ。
ともあれ、デフォルトでプログラムが書き込まれているようなので読み出してみましょうか。
$ dfu-util -U default.bin
これだけで出来ます。読み込みに関してはとても楽ですね。DFU バンザイ!
そして文鎮へ...
ちょっと書き込み環境とかがあまり良くわかっていないので、Windows で起動して色々やろうとしました。FTDI の公式開発環境をインストールして、付属の Eclipse を起動しました。参考資料として掲載したこの動画に従って GPIO DFU Example をビルドして書き込みました。
どうやらこれ、GPIO と UART のどちらも入力を受け付けるサンプルで、入力があったら DFU へエントリーするものらしいです。
では付属の FT9xx Programming Utility で書き込みをしたところ...
文鎮化しました。ショック。。。
なぜでしょう。書き込み後リセットをするとマイコンからなんの応答もありません。まあ USB が死んでるだけだろうと UART や GPIO での反応を見ようと思ってソースコードのピン番号を見ますが...指定された GPIO ピンがマイコンに存在しないのです。どういうことだよ。
種明かし
意味がわからなかったので、もうちょっとよく色々と見てみると、どうやら FT900 シリーズ用のプログラムであったことが判明。どういうことかというと、僕の使っている FT932 は FT930 シリーズなわけです。この FT930 は FT900 を小さくしたようなもので、GPIO の数とかが減らされています。先ほど書き込んだプログラムで入力、および UART 用のピンとして指定されたピンはまさに FT900 のみに存在するピン番号で、このまま書き込んでもマイコンくんは何も反応してくれません。
ソースコードを Eclipse エディタで見てみると確かにそんな記述があります。
#if defined(__FT930__)
#define GPIO_PIN_1 19
#define GPIO_PIN_2 20
#define GPIO_PIN_3 21
#else
#define GPIO_PIN_1 18
#define GPIO_PIN_2 17
#define GPIO_PIN_3 16
#endif
プロジェクトは __FT930__
マクロを定義していませんので、必然的に 下の GPIO18~16 を用いるプログラムになります。書き込む前にコードをよく呼んでおけばよかったね。
さらにさらに、このマイコンには DFU ブート用の切り替えピンが無いようで(実際のところまだ良くわかっていません)、ユーザープログラム中で明示的に DFU にエントリーするよう、関数を呼ばなければならないっぽいです。先程のプログラムは GPIO や UART の入力に応答して DFU に入る構成になっているので、やはり詰みというわけです。
つまり、ピン設定をデフォでやったら無事死亡。1wireするしかないやん...(1wire はデバッガを買わないと出来ず、しかも Windows 上でのみ可能)というわけです。
予定
ということで無事死んでくれた FT90 マイコンくん、流石に煮えきらないのでデバッガを買うことにしました。前々からいじりたくて仕方なかったマイコンだしね。
それが届くまでブートローダーとか色々と調査してみたいと思います。このブートローダーが辛く厳しいことになろうとは...(現状詳しいところまで分かっていないですが、とてもつらいつらいなのは分かっております...)