posted by rerofumi
2012/9/11 火曜日 2:33:03
USBホスト付きの PIC32MX と Bluetooth ドングルで無線シリアル通信したい、というのが前回吐露した野望。
しかし、いくら前人の手によるソースコードがあると言っても PIC32MX での動作実績はまだ無いみたい。
そこで、ひとまず PIC24F で動作させてみて勘所や注意点をつかみまくることにした。
テストボードとして使うのは Android ADK Sterter kit の基板。
PIC24FJ256GB110 が載っていて、USBホストコネクタが付いていて、LEDやスイッチ、それにI/Oの引き出しとお膳立てが全てそろっている理想的なボード。Bluetoothドングルテストに持ってこいな完成基板、秋月電子通商で 4000円で買えるよ。
ソースコードは github の hrdakinori / PIC24F_btstack から入手できる。
上記ページにあるように Microchip の USB スタックソースコードと btstack はそれぞれ配布元からダウンロードして、手作業で必要なソースをツリーに用意する。
で、プロジェクトは MPLAB8 のものだけれども今回は MPLABX にコンバートして使ってみる。コンパイラは XC16 Free edition。
コンパイラが違うのもあるけれどもそれ以上に PIC24FJ64GB002 と PIC24FJ256GB110 が別物のチップというのが大きく、サンプルはそのままビルドができなかった。
エラーになるのは2カ所。
1つめは CLKDIVbits.PLLEN が無いあたり。
ここいらの差異はまだ良くわかっていないのでコンフィグビットを整えて、PLL Enable はスキップすることにした。
#if defined(__PIC24FJ256GB110__) _CONFIG1(JTAGEN_OFF & FWDTEN_OFF & ICS_PGx2) // JTAG off, watchdog timer off _CONFIG2(FNOSC_PRIPLL & POSCMOD_HS & PLL_96MHZ_ON & PLLDIV_DIV2) // Primary HS OSC with PLL, USBPLL /2 #elif defined(__PIC24FJ256GB106__) _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx1) _CONFIG2( PLL_96MHZ_ON & IESO_OFF & FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS & FNOSC_PRIPLL & PLLDIV_DIV4 & IOL1WAY_ON) #elif defined(__PIC24FJ64GB002__) _CONFIG1(WDTPS_PS1 & FWPSA_PR32 & WINDIS_OFF & FWDTEN_OFF & ICS_PGx1 & GWRP_OFF & GCP_OFF & JTAGEN_OFF) _CONFIG2(POSCMOD_NONE & I2C1SEL_PRI & IOL1WAY_OFF & OSCIOFNC_ON & FCKSM_CSDCMD & FNOSC_FRCPLL & PLL96MHZ_ON & PLLDIV_DIV2 & IESO_OFF) _CONFIG3(WPFP_WPFP0 & SOSCSEL_IO & WUTSEL_LEG & WPDIS_WPDIS & WPCFG_WPCFGDIS & WPEND_WPENDMEM) _CONFIG4(DSWDTPS_DSWDTPS3 & DSWDTOSC_LPRC & RTCOSC_SOSC & DSBOREN_OFF & DSWDTEN_OFF) #endif
int main ( void ) { // Initialize the processor and peripherals. // Init Clock // CPU 32MHz // Peripheral 8MHz CLKDIV = 0x0000; #if defined(__PIC24FJ256GB106__) || defined(__PIC24FJ64GB002__) unsigned int pll_startup_counter = 600; CLKDIVbits.PLLEN = 1; while(pll_startup_counter--); #endif
2つめは、usb_host.c の中で使われている DEBUG メッセージの部分。
debug の print 出力が無いか変更になっているっぽい。
取り敢えず、無効にしてみた。
#ifndef __PIC24FJ256GB110__ #include#else #define DEBUG_PutChar(a) #define DEBUG_PutString(a) #define DEBUG_PutHexUINT8(a) #endif
これでビルドが通った。
これで動作させたら PC から認識できてペアリングまで完了した。おおー。
(ペアリングキーはソースコード内に書いてあるけど ‘0000’)
ここまで難なくこれたのだけれども、TeraTerm で COM ポートを開こうとしたら失敗した。
どうやったらつなげられるのか、調査するのはこの先のお話。
はたしてうまいこと行きますかね。
サンプルコードは LED 1つとスイッチ 1つを使って送受信の確認に使っているのだけれども、そのポートも Accessory Development Starter kit のものに変更しなくてはいけない。
ADK Starter ket では LED は Port E の 0-7 になっている。
ボタンはポートがばらばらなのだけれども、一番左の BTN2 が Port A の 1 とわかりやすいところにあるのでこれを取り敢えず使っていこう。
PIC24F 版は XC16 の Optimize -O1 (-O2 は商用上位バージョンでないと使えない)のコンパイルで 17551 word (1word=3byte, 52653byte) ほど。
単純に PIC32MX を予測はできないけれども、少なくとも秋月で売っている PIC32MX220F(フラッシュ 32KB)には入らなそう。
というわけでフラッシュ128KB の DIP型最大サイズの PIC32MX250F を Digikey で発注しておいた。
これで準備万端。
Leave a Reply