(2014.01.09)
USBリファレンス・ハードウェア(USB機能の付いたマイコンボード、これです)を入手し、アプリケーション・ライブラリの”USB Device CDC-Basic Demo”に手を入れて、XC8で動くUSBリファレンス・ソフトウェアを用意することにしました。
XC8でコンパイルするとエラーになる部分に修正を加え、何とかコンパイルが通りました。
----------------------------------------
ご参考までに修正の概要を以下に記します。
#ifdef __XC8 #include#ifndef __18CXX #define __18CXX #endif #ifndef __18F14K50 #define __18F14K50 #endi #define ROM const #define FAR #endif @main.c #ifdef __XC8 void High_ISR (void) @0x08 { asm(" goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS "); } void Low_ISR (void) @0x18 { asm(" goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS "); } extern void _startup (void); // See c018i.c in your C18 compiler dir void _reset (void) @REMAPPED_RESET_VECTOR_ADDRESS { asm(" goto _startup "); } void Remapped_High_ISR (void) @REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS { asm(" goto _YourHighPriorityISRCode "); } void Remapped_Low_ISR (void) @REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS { asm(" goto _YourLowPriorityISRCode "); } void interrupt YourHighPriorityISRCode() { #if defined(USB_INTERRUPT) USBDeviceTasks(); #endif } void interrupt low_priority YourLowPriorityISRCode() { } #else オリジナル・コード #endif
---------------------------------------
プログラムをビルドし、USBリファレンス・ハードウェアに書き込んで動かしてみると、やはり”Unkown Device”になります。動かないのは残念ですが、重要な手がかりです。動作実績のあるハードウェアに問題は無く、ソフトウェアのどこかにXC8とC18で異なる部分がある筈です。
最初にXC8とC18のマップ・ファイルを比較しましたが、記述の違いが大きくてギブアップしました。やむを得ずソース・ファイルを一つ一つ比較することにしたのですが、親族SNS管理人には有る筈の違いが見つかリません。orz
途方に暮れてWEB上の情報を探していたところ、こちらの方のサイトに行き着きました。
同じ事を試みて成功されたようです。有り難いことにソース・コードを公開(これです)されています。早速、ダウンロードしてソース・コードを比較してみると・・・
@usb_device.c
<拝見したコード>
// バッファ ディスクリプタ テーブルの確保を行う(EP0/EP1/EP2)
volatile BDT_ENTRY BDT[BDT_NUM_ENTRIES] @USB_BDT_ADDRESS; // 4レジスタ x 12個(48byte)
// EP0用の受信データバッファの確保を行う
volatile CTRL_TRF_SETUP SetupPkt @CTRL_TRF_SETUP_ADDR_TAG; // 8byte
volatile BYTE CtrlTrfData[USB_EP0_BUFF_SIZE] @CTRL_TRF_DATA_ADDR_TAG; // 8byte
<XC8で動かないオリジナル・コード>
volatile BDT_ENTRY BDT[BDT_NUM_ENTRIES] BDT_BASE_ADDR_TAG;
volatile CTRL_TRF_SETUP SetupPkt CTRL_TRF_SETUP_ADDR_TAG;
volatile BYTE CtrlTrfData[USB_EP0_BUFF_SIZE] CTRL_TRF_DATA_ADDR_TAG;
シミュレータでアドレスを調べると、動かないコードの方はBDT配列がUSBRAM上に配置されていません!
ようやく不具合の首ねっこを捕まえました。
原因はusb_hal_pic18.hにある以下の記述です。
//----- Defintions for BDT address -------------------------------------------- #if defined(__18CXX) #if defined(__18F14K50) || defined(__18F13K50) || defined(__18LF14K50) || defined(__18LF13K50) #define USB_BDT_ADDRESS 0x200 #define CTRL_TRF_SETUP_ADDR 0x230 <== 追加 #define CTRL_TRF_DATA_ADDR 0x238 <== 追加 #else #define USB_BDT_ADDRESS 0x400 #define CTRL_TRF_SETUP_ADDR 0x430 <== 追加 #define CTRL_TRF_DATA_ADDR 0x438 <== 追加 #endif #endif #ifdef __XC8 #define BDT_BASE_ADDR_TAG @USB_BDT_ADDRESS #define CTRL_TRF_SETUP_ADDR_TAG @CTRL_TRF_SETUP_ADDR #define CTRL_TRF_DATA_ADDR_TAG @CTRL_TRF_DATA_ADDR #else #define BDT_BASE_ADDR_TAG __attribute__ ((aligned (512))) <==元のコード #define CTRL_TRF_SETUP_ADDR_TAG <==元のコード #define CTRL_TRF_DATA_ADDR_TAG <==元のコード #endif
この修正で、ようやく”USB Device CDC-Basic Demo”がXC8でも動くようになりました。
さらに、PIC18F25k50用に修正したものをタッチ・マウス基板に書き込むと、こちらでも動くことが確認できました。
(パチパチパチ~)
どうやらXC8で動くUSBリファレンス・ソフトウェアが完成したようです。
ヤレヤレ
|
|
|
この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。