[21日目]激安中華USBマイコンは使えるのか


本記事は、Cerevoスタッフが業務や趣味について思うままに書き綴るアドベントカレンダー企画「Cerevo アドベントカレンダーTechBlog 2018」の第21日目です。

Cerevo アドベントカレンダーTechBlog 2018
http://tech-blog.cerevo.com/archives/category/adventcalendar/2018/

こんにちは世界.

回路設計を担当しておりますべーたです.

 

みなさんは製品の直材費をどうやって抑えていますか?弊社の設計ではコストダウンのために中国製の部品を使うことがあります.

そのため,普段から中国製の部品をいろいろと見て回っているのですが,時々驚くほど安い部品に遭遇することがあります.

今回は最近見つけたそんな部品の中から Jiangsu Qin Heng (WCH) 社の USBペリフェラル付きマイコンの CH551G を弄ってみたので紹介します.

 

Jiangsu Qin Heng (WCH) 社とは

汎用のARMマイコンの他,USB-UART変換IC等を製造している中国は南京の半導体メーカです.

USBシリアル変換モジュールなんかによく乗っているICで見かけた事があるのではないでしょうか.中でもCH340Gは国内でもモジュールが広く出回っています.スイッチサイエンスさんでもCH340G搭載のモジュールを販売されているようです.

 

CH551Gについて

タイトルにもある通り,私が実際に購入した時点では1個購入時の単価が0.3USD程度でした.1k個購入時の単価ではないですよ,1個だけ購入して0.3USDです.およそ30円でUSBペリフェラル付きのマイコンが手に入ります.きっと量産時には0.2USD程度になるでしょうか.USBペリフェラル付きのマイコンでこれほどまでに安いものが他にあるでしょうか.

また,出荷時点でブートローダが書き込まれているため,専用のデバッガ等も必要なく簡単にファームウェアの書き込みが可能です.

データシートを読んでみましょう.中国語のみの提供であり,英語データシートすらありませんが雰囲気で読んでいきます.増強型8051コアが載っているようです.増強型ということで何か強いのでしょう.MCS51比で8-15倍速いとかそんなような事が書いてある気がします.

余談ですが,中国系の多少インテリジェンスなICには8051コアが魔改造されて載っているものをよく見かけます.USBの他,カメラIFが付いていたりとか.最近はARMコアも見かけるようになってきましたが,まだ8051が多いのではないでしょうか.息の長いコアですね.

 

CH551 データシート

 

中国語を読むよりブロック図を見るとわかりやすいですね.内蔵発振器の出力はPLLで逓倍できるようです.VBUSの5Vから3.3Vを生成するレギュレータが乗っていることもわかります.いかにもUSBに接続することを想定した設計のようです.

因みに私は全く中国語が読めませんが,ざっくりの雰囲気を知るだけならばなんとなく意味はわかります.データシートを読み慣れた人ならば「睡眠的電流」と書かれているのを読んで”Sleep current”の事なんだろうなと容易に想像が付くかと思います.日本語話者であるメリットですね.ちゃんと中国語の勉強してみようかなぁ…

 

基板をつくる

出来合いの開発用ボードもあるようですが,送料が高いのが癪だったので会社の自己啓発予算を使って基板を起こしてしまいました.

今回は折角メインのマイコンが安いので生基板はもちろんのこと,コネクタやコモンモードチョーク,高速信号用のESDダイオードも含めた実装部品も全て中国ローカル部品で手配します.

 

手はんだなのでCMCからはんだ付けします

 

できた

 

部材は10セット分を手配しましたが,生基板も含んだ直材コストは1枚あたり1USDを楽勝で下回っています.

 

開発環境

ハードウェアが完成したので続いて開発環境を構築します.

ElectrodragonのWikiによるとKeilでのサンプルプロジェクトがGitHubで公開されているようです.Keilの8051用コンパイラのC51をインストールしてみることにします.試用版ではコードサイズが制限されますが,試す程度には使えるでしょう.

新規プロジェクトを作るとターゲットデバイスを入力する必要がありますが選択肢の中には当然ながらCH551はありません.同じ8051コアを搭載しているということでMicrochip(旧Atmel)のAT89C51を選択します.Outputにはhexファイルを出力するようにしておきます.

WCHからサンプルコードとドライバも提供されているのでダウンロードして展開しておきましょう.タイマやADC,シリアル通信などの各ペリフェラル毎のドライバが提供されているので必要なものを使えるよう配置しましょう.

 

Lチカ

皆さんご存知の通り,組み込みソフトウェアはLチカに始まりLチカに終わることがよく知られていますね.基板に実装されたLEDを点滅させてみます.

ドライバを見ているとDelay関数などもあるようでしたので邪道ですが手っ取り早く動かすために使っていきます.

#include
#include<Public/Debug.h>
#include<GPIO/GPIO.h>

sbit LED = P1^1;  //C51の方言.ビット操作できる.

void main(){
  CfgFsys( );     //Fsys=12MHz
  mDelaymS(20);
  Port1Cfg(1,1);  //PORT1_1=OUT
  while(1){
    LED = ~LED;   //Blink
    mDelaymS(500);
  }
}

これをBuildし,書き込んでみます.CH551は工場出荷状態でBootloaderが書き込まれているのでこれを利用します.専用のデバッガ等は必要ありません.

USBのD+を3.3Vとショートした状態でUSBを繋ぐとBootloaderが起動するようでした.ショートしたままだとUSBでの通信ができないので接続したら直ぐに外します.この状態でbuildして出てきたhexファイルをWCHISPToolにより書き込みます.

 

完全に理解した

 

これだけでは味気ないので次はタイマと割り込みを使って実用的なLチカにしていきましょう.

 

中断

マイコンを用いた実務レベルのアプリケーションで必ず使う機能の一つに割り込みがあります.これを使ってみましょう.

まず,データシートからTimerの章を参照します.ちなみに,割り込みは中国語で「中断」というそうです.それっぽい語句を探していると「溢出中断」と書いてあります.これも雰囲気でわかりますね.そう,オーバーフロー割り込みですね.これを使いましょう.

 

溢出中断(overflow interrupt)

 

16位(16bit)と書いてありますが8bit動作とした方が高機能になるため,8bitカウンタとして設定します.サンプルとドライバのソース,レジスタのリファレンスを見ながらコードを書いていきます.

#include
#include<Public/Debug.h>
#include<GPIO/GPIO.h>
#include<Timer/Timer.H>

sbit LED0 = P1^1;  //LED
sbit LED1 = P1^7;  //Debug

UINT16 cnt = 0;
void main(){
	int i;
	CfgFsys( );       //Fsys=3MHz
	mDelaymS(20);
	Port1Cfg(1,1);    //PORT1_1=OUT
        Port1Cfg(1,7);    //PORT1_7=OUT
	mTimer0Clk12DivFsys();        //Fclk = Fsys/12 = 250kHz
	mTimer_x_ModInit(0,2);        //8bit auto reloaded
	mTimer_x_SetData(0,0xf9f9);   //reload value = 249
	mTimer0RunCTL(1);             //Timer0 run
	ET0 = 1;                      //Timer0 int enable		
	EA = 1;	                      //global int enable
	while(1){
		;
	}
}
void	mTimer0Interrupt( void ) interrupt INT_NO_TMR0 using 1                //interrupt every 1kHz
{
  LED1 = ~LED1;
	if(cnt>499){  //do every 500ms
		cnt = 0;
                LED0 = ~LED0;
	}else{
		cnt++;
	}
}

これをBuildし書き込むと…

 

使い回し

 

割り込みの記述方法など,コンパイラ依存の書き方がありますがサンプルコードや開発環境のマニュアルを参照すれば無事にBuildが通りました.中国語データシートには一瞬だけ面食らいますが,レジスタ設定や割り込みを有効にする手続きは生のAVRやPIC等を扱ったことがあれば同様の手順で触れるようです.

 

とりあえず動いた

はい,これで役目を果たしたこの基板は部屋の隅に積んでおきましょう.

中国語データシートのみでハードモードな中華MCUですが,活用できそうなアプリケーションはあるでしょうか…

電源と通信用のmicroB端子が付いていて,いくつかのボタン入力とLED,溢出中断でシリアル接続のセンサとかをポーリングしてUSB-CDCに流すアプリケーション…なら使えるのではないでしょうか.

 

めでたしめでたし.

投稿者プロフィール

べーた
べーた

動くおもちゃがすき.アナログ回路屋です.


べーた
About べーた 3 Articles

動くおもちゃがすき.アナログ回路屋です.