チョイ前から話題になっている格安 USB ホストマイコン、CH559 というのがあります。ココ最近秋月で売られるようになったので、手を出してみることにしました。
それにしても USB ホスト機能付きで 250 円ってすごいと思いませんか??(僕に使いこなせるか不安ですが)
参考
- 格安USBホストマイコン CH559をいじってみた(大盛) - q61.org blog
- 黒井さんのブログ。こちらに概要やハマりどころなどがよくまとまっています。結構参考になります。
- SDCCを使ってCH559の開発をした際のハマりポイント - Qiita
- こちらも使用記。特にブートローダーピンの仕様を参考にさせていただきました(何故かデータシートに書いていない)。
- GitHub - bootrino/ch559samplestranslated: ch559 source code samples translated into english
- ペリフェラルを動かすためのサンプルコード(のほとんど)を英語に翻訳された方の repo。
これあればペリフェラルのコード書く必要ないじゃん困ったときの参考にしたいと思います。
- ペリフェラルを動かすためのサンプルコード(のほとんど)を英語に翻訳された方の repo。
開発環境
コンパイラは sdcc
です。8051 と言ったらコレでしょ。
書き込みソフトは CH55x_python_flasher というのが GitHub で見つかったので、使用させてもらいます。
$ git clone https://github.com/hexeguitar/CH55x_python_flasher
回路とブート動作
回路らくらくです。内蔵 12MHz 発振で動くので外部クリスタル不要。
電源は 5V に VBUS を直結することをおすすめします。内部に 5V → 3.3V の LDO が入っているので、データシートの指示通りにコンデンサを入れるだけで内部ロジックに使われる 3.3V を生成できます。
あとピンの耐圧が 5V まで上昇するらしいですが、データシート上の記述で見なかったなあ。
ただ、以下、動作仕様で注意点があります。
- P4.6 が LOW だとブートローダー起動
- ブートローダー起動判定はリセット時ではなく電源投入時というのがポイント。
- いずれもデータシートに記載なし。なんだと!
- リセットは正論理
- つまり High 入力でリセットがかかるということ。
- ただ、リセットピンは内蔵プルダウンがあるのでスイッチのみの設置で実装可能。
- しかし評価・開発に於いてはリセット不要と考える(後述)
僕はこの癖のあるブート仕様のため、以下の構成にしました。
- 電源 5V に直列にそのまま電源スイッチを導入
- 電源の質を落とすことになるので非常に良くないが、まあ電流はそんなに食わないし大丈夫っしょということで(適当)
- リセットピンはオープン(内蔵プルアップにより High 固定となる)
- P4.6 は GND 固定
- 評価の都合、毎回リセットに入ってほしいため。書き込みソフトでライト後にユーザープログラムを動かすことも可能なためこれでいいかなあと。
コード・ビルド・書き込み
コードは sdcc お得意の書き方で。レジスタ定義が独特だよね。
「とりあえずLチカで」って感じでコードを書いたんですが、ハマりまくりました。思い込みでやってた僕が悪いんだけど。
ポートの出力レベル設定はデフォルトで 5mA max 出力、オープンドレインなのです。電流値もちょっと小さいかな。普通に LED と抵抗をつないで GND に落とす接続をする場合は変更する必要がありますね。
よって、出力電流の増強とプッシュプル出力に変更を行う必要がありました。「はんだ付けの熱でマイコンが半殺しになったのか?」と結構はまってました。
LED は P1.3 (ピン番号46)につけています。
__sfr __at(0x90) P1;
__sfr __at(0xBA) P1_DIR;
__sfr __at(0xC6) PORT_CFG;
int main(void) {
PORT_CFG &= ~(1 << 1); // P1.x: Push-Pull
PORT_CFG |= (1 << (1+4)); // P1.x: 10mA max
P1_DIR |= 1 << 3;
while(1) {
for(volatile long i = 0; i < 100000; i++);
P1 ^= 1 << 3;
}
}
以下でコンパイル。
$ sdcc -mmcs51 --std-c99 --opt-code-size -I../include -o Register.ihx main.c
$ makebin -p Register.ihx Register.bin
sdcc が吐き出す形式は Intex HEX です。一方でプログラマはバイナリファイルが必要なので makebin
という sdcc
付属のツールで変換しています。
後は書き込みです。ブートローダに入れるために電源スイッチを落としてまた投入した後に以下のコマンドを実行
$ ./chflasher.py -w -s -f ~/Micom_Projs/CH559_projs/Register/Register.bin [master]
Found CH559
Flash size: 64 blocks, 65536 bytes.
Reserved for application: 60 blocks, 61440 bytes.
Bootloader version: 2.40
Flash Erased
Filesize: 167 bytes
[====================] 100% Writing success
[====================] 100% Verify success
Starting application...
これで LED がチカチカしているはずです。書き込みエラーが起こる場合はめげずに何度も書き込みを実行してみてください。
さすが USB マイコン、書き込みに USB/シリアル変換が要らないのは楽ですよね〜〜
〆
と、開発環境構築からLチカまで終了しました。
参考サイトにあるように、このマイコンはハマりどころが多いです。データシートの英語が酷いのも相まって、なかなかに評価が難航しています(さっきまで UART にハマっていた)。
そのへんの愚痴も含めて、投稿していきたいと思います。
悲しいお知らせ
なんと僕愛用の FPGA ボード、PYNQ がご逝去なされました(多分)。静電気とかでしょうか...
PL (Programmable Logic) の何かが死んでいます。SD カードから Linux は起動するのに...
特に負荷をかけるような使用をした覚えはないので、決定的な理由を思いつかないのが難点です。7セグLEDをピンに直結して使用していましたが、こちらはボード上に 200Ω の保護抵抗が実装されています。ですのでこれによる過電流が原因ではないと思います。
残念ですが、ここは仕方がないと割り切って新しいボードを発注しました。コレまでと同じ PYNQ-Z1 ですよ。