前々から気になっていた、Cypress の EZ-USB をポチってしまいました。なんでも、このマイコンは USB ペリフェラルがとにかく便利に構成してあるみたいなんですよね。
あまり下調べせずにポチりました。まだデータシートすら見ていませんが、やりながら理解していきたいなあと。例の青いボードです。
それで、China Post から来たんですが、これがおっそいおっそい。もともとここは配達が雑で遅いことが分かっていましたが、僕が注文したタイミングで丁度税関が郵便物の調査を強化したらしく、結局2週間遅れで手元に到着しました。
このマイコンの構成は置いておいて、取り敢えず動かせる環境づくりをします。今後のためにね。
参考サイト
- EZ-USB/FX2 - Linux工作室
- Electronics -- USB-FX2 Interface Board (USB-2.0)
- 今回使うプログラマーとサンプルプロジェクトは全てここから。
EEPROM
そういえば、このボートにはユーザーが意図する USB 機能を実現させるために EEPROM が載っています。これによって好きなディスクリプタを構成して、デバイスを好きに構成することが出来るらしいです。
ですが、今回はそんな高度なことはせず、とりあえず RAM にロードさせて使うという使用法を採用したいと思いますので、EEPROM につながるジャンパピンは全て取り除くことにします。
使用ツール
コンパイラ
sdcc
です。いつものように Homebrew でインストール。
$ brew install sdcc
書き込み
CycFX2Prog を使います。参考サイトの2つ目からダウンロードして make
。
僕の Mac の場合は以下のように怒られました。
$ make
gcc -pipe -c -O2 -fno-rtti -fno-exceptions -DCYCFX2PROG_VERSION=\"0.47\" -W -Wall -Wformat cycfx2prog.cc
In file included from cycfx2prog.cc:24:
cycfx2dev.h:18:10: fatal error: usb.h: No such file or directory
18 | #include <usb.h>
| ^~~~~~~
compilation terminated.
make: *** [cycfx2prog.o] Error 1
ふむふむ、libusb
が無いんですな。そもそもインストールしてないよ!って人はしてください。
$ brew install libusb-compat
その上で以下のように改造。
CFLAGS = -O2 -fno-rtti -fno-exceptions -DCYCFX2PROG_VERSION=\"$(VERSION)\" \
-W -Wall -Wformat $(shell pkg-config --cflags libusb)
LDFLAGS = $(shell pkg-config --libs libusb)
これで make
をかければコンパイル完了するはずです。出来たバイナリをパスの通ったディレクトリにコピーすれば便利です。
サンプル
hello_world_usb。を動かしてみましょう。ここからダウンロード。
fx2regs.hの改造
なんかやたらエラーで怒られるので、sdcc 仕様にします。ひょっとして古いSDCCではOKだったんかな?
xdata
を__xdata
にat()
を__at()
にsfr
を__sfr
に
これらを変えます。Vim だったら以下の Ex コマンドを打ってください。
:%s/ xdata / __xdata /g
:%s/ at \(0x..\)/ __at (\1)/g
:%s/sfr/__sfr/g
42行目を書き換え
#define _AT_(a) __at(a)
以上で OK なはず!続いて hello.c
の方も直していきます。
hello.cの改造
21行目。アンダーバーを1つ増やす
#define NOP __asm nop __endasm
55行目。xdata
を __xdata
に。
これでコンパイルできるはず。
$ make
sdcc -mmcs51 -I../include hello.c
できた!
あとは make run
で以下のように動作したら OK ですね。
$ make run
cycfx2prog prg:hello.ihx run delay:10 dbulk:6,-512,5
Using ID 04b4:8613 on 020.050.
Putting 8051 into reset.
Programming 8051 using "hello.ihx".
Putting 8051 out of reset.
Delay: 10 msec
Reading <=512 bytes from EP adr 0x86
0x0000 48656c6c6f20776f 726c642120596f75 7220465832206973 2074616c6b696e67 Hello world! Your FX2 is talking
0x0020 20746f20796f7520 7669612074686520 555342206c696e65 2e202830303029 to you via the USB line. (000)
Reading <=512 bytes from EP adr 0x86
0x0000 48656c6c6f20776f 726c642120596f75 7220465832206973 2074616c6b696e67 Hello world! Your FX2 is talking
0x0020 20746f20796f7520 7669612074686520 555342206c696e65 2e202830303129 to you via the USB line. (001)
Reading <=512 bytes from EP adr 0x86
0x0000 48656c6c6f20776f 726c642120596f75 7220465832206973 2074616c6b696e67 Hello world! Your FX2 is talking
0x0020 20746f20796f7520 7669612074686520 555342206c696e65 2e202830303229 to you via the USB line. (002)
Reading <=512 bytes from EP adr 0x86
0x0000 48656c6c6f20776f 726c642120596f75 7220465832206973 2074616c6b696e67 Hello world! Your FX2 is talking
0x0020 20746f20796f7520 7669612074686520 555342206c696e65 2e202830303329 to you via the USB line. (003)
Reading <=512 bytes from EP adr 0x86
0x0000 48656c6c6f20776f 726c642120596f75 7220465832206973 2074616c6b696e67 Hello world! Your FX2 is talking
0x0020 20746f20796f7520 7669612074686520 555342206c696e65 2e202830303429 to you via the USB line. (004)
make: *** [run] Segmentation fault: 11
Blink
調子に乗って僕も簡易的なLチカプログラムを書いてみました。
#include "fx2regs.h"
int main(void) {
OEA = 1;
while(1) {
for(volatile unsigned long long i = 0; i < 100000; i++);
IOA ^= 1;
}
}
$ sdcc -mmcs51 -I ../include blink.c
$ cycfx2prog prg:blink.ihx run
PA0 に LED をつないで、ゆっくりチカチカしていれば OK です。
というわけで、今回は環境構築 & 動作確認でした。