その2です。
その1ではLチカという変態色溢れるFT232RLの活用事例をご紹介しました。その2として本記事では、おそらくコイツの本望であろうシリアル通信について述べたいと思います。
※ すみませんが、作者はUART以外のシリアル通信を知りません。SPIとかなんじゃらほいと言った感じです。I2Cはまあまあです。お気づきの点がありましたらぜひぜひコメント欄にて意見・提案等お教えください。
マイコンとの通信および書き込み
今宵は色々なマイコンライタが登場しているのですが、ここではそんなのいらねぇよ!と言わんばかりにこの内容について述べたいと思います。
screen
でシリアル通信
非常に簡単です。ターゲットと接続し、
$ screen /dev/tty.usbserial-xxxx <baudrate>
とすればOK。baudrate
は自分がプログラムで設定したレートとしてください。
LPCマイコン
なんじゃそれ?と言う人も多いでしょうが、知る人ぞ知る、32bit ARMマイコンです。ぅゎぁ っょぃ
当ブログでも、開設直後にLPC11U35の記事を書きました。僕はこのLPCマイコンが好きです。よく使うのは114514ことLPC114514、野獣先輩ことLPC810です。いや、ヤジュセンは買ってすぐに見放しました。当時は秋月で1114のDIPが200円、810が85円だったなぁ。
まぁLPC好きとかいいながらアセンブラ使ったこと無いんですが。このマイコン、ARMなだけに書き込み方法が2つあって、SWDとUARTです。うちここではUARTの方を説明します。
結線
まずはFT232RLモジュールの方を。まず付属のジャンパーピンを2つとも付けます。1つは3ピンありますが、3.3V出力とするために真ん中とGND側をショートさせましょう。電源のプラス極はVIO、GNDはGNDから引っ張ってきましょう。つづいてモジュール側のTXDをマイコン側のRXDへ、モジュールのRXDをマイコンのTXDへ繋ぎます。
ここから裏技を使って書き込みをラクにします。その他のシリアル通信用のピンについてですが、RTS#は書き込み開始時の挙動が丁度LPCマイコンの書き込みモード投入に合うんです。なので、ブートモード選択ピンにRTSを繋ぎましょう。僕の持ってるやつだと、PIO0_1なはずです。
さらに、DTRが通信開始時に一瞬だけLowになります。これはまさにリセット動作!!ということでまんまリセット端子に繋いでしまいましょう。
書き込みプログラムの実行
リセットタイミングの問われるFlashMagicを使う方はそのまま書き込んで頂けると自動リセットで勝手にスイーっと書き込みが始まります。カチッ..カチッ!とする生活からおさらばですね。みんな大好きlpc21isp
の方は
$ lpc21isp -control -hex ~/Documents/LPCXpresso_8.2.2/workspace/fuck/Debug/fuck.hex /dev/tty.usbmodem1413 115200 12000
等してください。ファイル名は気にしないでください。ポイントは-control
オプションを付けること。これで簡単にできます。シリアルモニタもFlashMagic、lpc21isp
どちらも同様にしていただければよいですね。
STM32
ほぼLPCと同じですが、とりあえずシリアル通信ピンの接続はTXDとRXDとDTRだけでやりました。ブートモード選択は...どうだったけなあぁ。各自データシートにてご確認ください。今は某LPC11U35ボードにてSWDで開発してしまっているので確かではありません...
個人的に、これで書き込めたことはないです。おそらくUSART書き込みはサポートされていない?? 通常のUART通信はできました。
Nucleoという、ボードの上のほうがどう考えてもメインなマイコンボードでも行けるはずです。
PIC
なんとPICも書けます。PICKitいらず。ぼったくりやがって。
詳細はこちらのサイトへ。結構お得に、かつ簡単にできます。 PICerFT
このライタはWindowsのみでしか使えません。MacでもWine等で無理やり起動させてみましたが、どうもドライバが上手く動かないようで認識してくれません。いずれにしろ上のライタの作者様のお陰でFT232RLでPICにプログラムできるのは確かですから、また1つFT232RLの最強度が増したことになります。
AVR
結構愛用している人がいそうなAVRマイコン。ATMega328PやATTinyと言ったラインナップで、なかなかいい感じのマイコンです(抽象的)。
すみません。Lチカしたことしかありません。許してください。書き込みソフトは定番のavrdude
を使います。なんとここにプログラムインターフェイスとしてFT232RLがサポートされているんですよ!!
$ avrdude -c fuck 2>&1 | grep ft
arduino-ft232r = Arduino: FT232R connected to ISP
avrftdi = FT2232D based generic programmer
bwmega = BitWizard ftdi_atmega builtin programmer
diecimila = alias for arduino-ft232r
ft232r = FT232R Synchronous BitBang
ft245r = FT245R Synchronous BitBang
ほら!すっごくないですか?ということで実際にやってみましょー
まず結線です。以下に自分の持っているAVRマイコンとの対応表を示します。
FT232RL | CPU側 | ATmega328P | ATtiny85 |
---|---|---|---|
TXD | SCK | 19 | 7 |
RXD | MISO | 18 | 6 |
RTS | MOSI | 17 | 5 |
DTR | RESET | 1 | 1 |
VIO | VCC | 7, 20 | 8 |
GND | GND | 8, 22 | 4 |
それで書き込み...え?ATMega328Pのヒューズビットがわからない?仕方ないですねぇ。FT232RLで書き込んであげましょう。
ヒューズビットの書き込み
ATMega328Pの場合は以下の手順を踏んでもらえば、8MHz内蔵クロック動作 3.3V電源駆動のマイコンになります。
まず最初に接続ができているか確認しましょう。
$ avrdude -c ft232r -p m328p -B4800
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.10s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: Fuses OK (E:FD, H:DA, L:E2)
avrdude done. Thank you.
こんな感じにプログレスバーが出ればOKです。あとは下のように打つだけ。
$ avrdude -c ft232r -p m328p -t
avrdude> w efuse 0 0xfd
>>> w efuse 0 0xfd
avrdude> w hfuse 0 0xda
>>> w hfuse 0 0xda
avrdude> w lfuse 0 0xe2
>>> w lfuse 0 0xe2
avrdude> q
>>> q
Done!それ以外のAVRマイコンや、外部発振にしたい場合はEngbedded AVR Fuse Calculatorが便利ですのでこれを使うと良いと思います。
さあプログラムを書き込もう
さてと、本題の書き込みに入りましょう。結線を確認するために、マイコンと接続してみます。
$ avrdude -c ft232r -p m328p -B4800
-p
オプションで接続マイコンを指定。-B
は通信 Baud Rate を指定します。上はATMega328Pの場合ですが、それ以外のマイコンでは-p
の後に適当に打てばAVRマイコンのリストがズラズラと出てきます。そこでこれかな?と思うやつを選べばうまくいきます。例えば...
$ avrdude -c ft232r -p fuck
みたいな。それで自分が使っているマイコンが見つかったら fuck
をそれに置き換えてください。これでいいはずです。プログレスバーが出ればOK。
さて、書き込みです。基本的にはhexファイルを書き込むのですが、以下のコマンドを打つだけでリセットも何もなく書き込みが完了します。なお、プログラムの書き方等も一応ローカルにまとめてありますので、後日ご紹介します。
おい!FT2232H忘れてるぞ!
あ、そうでした。このFT2232Hは、MPSSE(だっけ?)という機能のお陰で、なんとJTAG が使えるんです。また、これ1つでI2CやSPIもできるという謎デバイスなんです。当然シリアル通信も可能。だったらこっちの方が強いじゃんというわけですが、この一連の記事で何故FT232RLを最強だとしたかというと...
- FT2232のボード自体が大きくスペースを取る
- FT2232ボードは端子から5Vしか取れない(3V3を使いたい場合は外付けで電源回路が必要)。対してFT232ボードはデフォルトで5Vと3V3どちらも使える
という点を大きく見たからです。やっぱり利用しやすさ、大事。うん。
〆
いかがでしたでしょうか。ざっとFT232RLについてプレゼンしてきましたが、いかんせん大雑把なのでよくわからない方もいるでしょう。とりあえずggrks色々と調べてしていただけば僕の記事よりも詳しく説明されているものがあると思います。思った以上のポテンシャルがあるので、上手く動かせた日には「あのライタ買うなんてw」と思ってしまうこともあるでしょう。そう、FT232RLは最強なのですから。
コメント
FT232RLが最強というお話を見まして、少しだけ付け加えて頂くと良いと思います。
FT232RLは受信バッファ128Byte 送信バッファ256Byteとなっていますが、FT231Xですと受信・送信バッファともに512Byteあります。
FT231Xの中身は3.3Vで動作しているので、DTRだけはリセットとして想定した時には
5Vトレラントにするため、トランジスタなどのバッファが搭載される方が良いみたいですが、他の端子は3.3Vでも5Vでも動きます。(実験済み)
又、FT232RLが28ピンであるのに対して20ピンで済みますので、実装面積も小さいです。
僕は、そういう事を十分に知らないでBitbangライタとして利用してしまったのですがFT232RLの場合と比べるとおおよそ1.4倍の速度で読み書き出来ます。もしかすると高ボーレートで使うのでなければ、FT231Xが最強の様な気がします。
FT232RL、完敗ですね(笑)FT231Xが全てにおいて上位互換ではないですか!しかもUSBコネクタがminiでなくてmicroなのがまた推せるなぁと言った感じです。
今度秋葉原に行く機会があるので買いたいですねぇ〜〜
事実僕自身この記事を書いた時はFTDI社のチップを知らずに、適当に扇動的なタイトルを付けてしまったのですが、良い感じに反論していただいて嬉しいです(笑)
LinuxやMacで信号のインバート等のEEPROM書き換え方法あるかな〜と調べて見たらありましたね↓
https://github.com/richardeoin/ftx-prog
完璧です。買いたいと思います!