USBのトラブルシュートをした結果、原因が分かりました。
前回で、USBモードが動かないと書きましたが、以前からプログラムには、MLAからCDC-Serial Emulatorを持ってきて組み込んでありましたが、回路もちゃんと組んでない状態でしたので、一部コメントアウトしているところがありました。具体的には、下のUSBDeviceAttch()です。ここをコメントアウトしないと、プログラムが止まってしまうからでした。 今回、詳しく調べていくと関数内の次の行で、USBENが1(enable)にならず、ずっと止まっていることが分かりました。これは、USBを使うときの一番基本の設定なのに何故止まってしまうのか不思議でした。 マニュアルを見ると、 とあるので、RC発振器(INTOSC)8MHzを2分周してをPLLに食わせて48MHzを作り、それを8分周することで、LOW Speed USBに必要な6MHz設定しましたが、動きません。 (Microchip DataSheet DS39931Dより) 解決しないまま、FFTの高速化のため、この48MHzが使えるんじゃないかと思って、設定を変えてみたことがきっかけで原因が分りました。 (Microchip DataSheet DS39931Dより) 48MHzは、CPDIVで2分周して24MHzを使うことになりますが、その後の切替スイッチのところにある注記(4)です。 このスイッチをPrimary Clock側にしないとUSBは動かないってあります!なんと。 でも、USBのクロックとCPUのクロックって別でいいと思うじゃないですか。 ただ、残念ながら、PCのデバイス認識としてはエラーが出ているので、まだ完全ではないですが、ハード的にはつながった様です。 副作用として、FFTの処理速度は3倍になりました。また、消費電流も大幅増加。 なので、結論としては、通常作動とUSB接続状態でクロックを可変とする必要があるため、USB接続の判別ハードは必要ということも分かりました。 原因が分かって、がっくりと言う感じですが、要は”マニュアルをしっかり読め”ということに尽きるんですかね。 USBのソフトは完全にできてませんが、目途が立ったということで、電池寿命延長のための消費電流低減について、いくつかトライアルをしてみます。 まだ、完成までいろいろありますが、よろしかった、お付き合い願います。USBイネーブル信号
MAIN_RETURN main(void)
{
/* Initialize I/O and Peripherals for application */
SYSTEM_Initialize(SYSTEM_STATE_USB_START);
USBDeviceInit();
//deug
// USBDeviceAttach();
while(1)
{
SYSTEM_Tasks();
・・・
void USBDeviceAttach(void)
{
・・中略・・
//debug
while(!U1CONbits.USBEN){U1CONbits.USBEN = 1;}
クロック設定
USBのD-、D+端子もプルアップされるはずなのに、0.5Vぐらいの電圧が出て(多分浮遊電圧か)いているという状況です。
で、その通り設定してみたら、ちゃんとD-,D+端子もプルアップされるし、USBENは1になって、PCに刺すとちゃんと認識してくれました。まずは、第一段階クリアです。今後の計画