平成26年 5月 21日
USB用の実験環境(その2)
実験に使用する基板の説明を忘れていました。基板は数年前に購入したオプティマイズ社製PIC24USBを使用します。
こちらに基板の説明があります。ごく小さな基板にPIC24FJ256GB106とUSBコネクタ・電圧レギュレータ・発信器を実装しただけの基板ですが、USB関連の信号がパターン化されるだけでも随分と安心感があります。
exp16基板とPIC24USB基板でIO以外の違いとしては、発信器の周波数が異なっています。exp16は8MHz, PIC24USBは16MHzの発信器を実装しています。
プロジェクトから余計なハードウェアを削除する
前回の作業でPIC24FJ256GB106用のコンフィグレーションを作成しましたが、サンプルプログラムはexp16という基板用に作られています。このため実際に使用するPIC24USBには無いハードウェア部分の記述は削除する必要があります。
exp16という基板はこれのことのようです。CPU部分を別基板にしてあるので、各種のCPUを実装できる。
プログラムをmain()関数から追うとLED1個とスイッチ1個のみを使用しているだけのようです。これらを削除して、入力文字をすぐにオウム返しするエコーバックのプログラムに書き換えます。元のプログラムは入力文字に+1した文字を返すようになっています。
プログラムの依存関係を詳しく調査するのは時間が掛かるので、ざっとプログラムのファイル名を横睨みしたところ、bspフォルダ内のファイルがIO関連の処理をしているようです。このフォルダ以下のファイルををコンパイルの選択条件から外したところ、コンパイルは正しく行えます。当然リンクには失敗しますが。これでリンクエラーを起こした箇所から不要なIO操作をしている関数をコメントアウトします。
以下の3個のファイルを修正するだけでリンクまで通ります。
app_device_cdc_basic.c
app_led_usb_status.c
system_config/exp16/pic24fj256gb106/system.c
変更点を記述すると、
・app_device_cdc_basic.c
APP_DeviceCDCBasicDemoTasks()関数を以下に置き換える。(入力文字をオウム返しにする))
void APP_DeviceCDCBasicDemoTasks()
{
uint8_t numBytesRead;
if( USBUSARTIsTxTrfReady() == true){
numBytesRead = getsUSBUSART(writeBuffer, sizeof(writeBuffer));
if(numBytesRead > 0)
putUSBUSART(writeBuffer,numBytesRead);
}
CDCTxService();
}
・app_led_usb_status.c
APP_LEDUpdateUSBStatus()関数の中身を完全に空にする。(void関数なのでreturn文も不要)
・system_config/exp16/pic24fj256gb106/system.c
SYSTEM_Initialize()関数の中身を完全に空にする。(void関数なのでreturn文も不要)
下記のconfig文を変更する(コメントが従来の設定)
//#pragma config PLLDIV = DIV2 // USB 96 MHz PLL Prescaler Select bits (Oscillator input divided by 2 (8MHz input))
#pragma config PLLDIV = DIV4 // USB 96 MHz PLL Prescaler Select bits (Oscillator input divided by 2 (8MHz input))
//#pragma config ICS = PGx2 // Comm Channel Select (Emulator functions are shared with PGEC2/PGED2)
#pragma config ICS = PGx1 // Comm Channel Select (Emulator functions are shared with PGEC2/PGED2)
以上の変更でコンパイルからリンクまで正常に終了します。
プログラムをPICに書き込んで、infファイルを読み込ませると以下のように正しく認識されます。(USB Serial Port(COM3))
ハイパーターミナルで正しくエコーバックすることまで確認できました。
正直なところ、ここまではどうにか出来るのですが、この段階からシリアルポートを2chに増やすことが出来るかどうかは全く自信がありません。取りあえず分かる範囲の情報からトライしてみます。