USBホストモード ホスト初期化エラー3 LPC54605J256 こんにちは、皆さん。 USBホストの初期化で問題が発生しています。何を試しても、エラー3「ドライバーインスタンスが見つかりません」が表示され続けます。どんなご意見でも歓迎します。ありがとう。 LPC54605J256。カスタムボード。 USBの一部は正常に動作しているようです。 これがメインのUSBシステムの図面です。 私は組み込みシステム開発の初心者なので、おそらく何か見落としていることがあるでしょう。例えば、USBポートの番号付けや、main関数内の余分なUSB初期化処理などです。私は設定ツールだけを使うように心がけました。 クロック、ピン、ペリフェラルはすべて良好で、関連するUSBピン、ホストモード、NVICが有効になっています。fsl-power.h が含まれています。USBは48MHzのPLLを使用しています。抵抗器REXTの正しい値を持っています。すべての設定ツールで定義されているUSBピンとUSBHSHは、ツールの要求どおりに定義されています。 USBIDはどの方向にも縛られていないが、portmodeで強制的に設定できると理解している。 キーパッドに電源が供給されます。VUSB - 4.5V。キーパッドのLEDライトは点灯しますが、初期化に失敗するため、それ以上何も起こりません:) コントローラーIDを確認しました。高速ホストに使用しています。 #define CONTROLLER_ID kUSB_ControllerIp3516Hs0 ホストのconfig.hで宣言されています1Uとして int main(void) ヤージュ vPortDefineHeapRegions(xHeapRegions); BOARD_InitBootPins(); BOARD_InitBootClocks(); BOARD_InitBootPeripherals(); SEGGER_RTT_Init(); PRINTF("システム起動中...\r\n"); /* USB1 HS PHY 電源 */ POWER_DisablePD(kPDRUNCFG_PD_USB1_PHY); /* USB1 HSホストクロックを有効にする */ CLOCK_EnableClock(kCLOCK_Usbh1); CLOCK_EnableUsbhs0HostClock(kCLOCK_UsbSrcUsbPll, 48000000U); /* USB1を強制的にホストモードにする */ USBHSH->PORTMODE &= ~(1UL << 16); USBHSH->PORTMODE |= (1UL << 16); /* PHY用の小さな遅延 */ for (volatile uint32_t d = 0; d < 180000; d++) __NOP(); PRINTF("USB PORTMODE = 0x%08lX\r\n", USBHSH->PORTMODE); PRINTF("USBHSH->PORTSC1 = 0x%08lX\r\n", USBHSH->PORTSC1); PRINTF("USBHSH->USBSTS = 0x%08lX\r\n", USBHSH->USBSTS); PRINTF("USBHSH->USBCMD = 0x%08lX\r\n", USBHSH->USBCMD); /* USBホストスタックを開始 */ usb_status_t usbStatus = USB_HostInit(CONTROLLER_ID, &g_HostHandle, USB_HostEvent); if (usbStatus == kStatus_USB_Success) ヤージュ PRINTF("USBホスト初期化成功\r\n"); } それ以外 ヤージュ PRINTF("USBホスト初期化失敗: %d\r\n", (int)usbStatus); } プロセス: JLinkGDBServerCLExe システム起動中... USBポートモード = 0x00050000 USBHSH->PORTSC1 = 0x00001000 USBHSH->USBSTS = 0x00000000 USBHSH->USBCMD = 0x00000501 USBホスト初期化失敗: 3 スケジューラを起動しています... LPC546xx Re: USB Host mode Host init error 3 LPC54605J256 時計を見るために、さらにいくつかの印刷明細書を印刷しました。クロックツールでは正しく設定されているのですが、正常に動作していないようです。 /* ======================= メイン ====================== */ int main(void) ヤージュ vPortDefineHeapRegions(xHeapRegions); BOARD_InitBootPins(); BOARD_InitBootClocks(); BOARD_InitBootPeripherals(); SEGGER_RTT_Init(); PRINTF("システム起動中...\r\n"); /* USB1 HS PHY 電源 */ // POWER_DisablePD(kPDRUNCFG_PD_USB1_PHY); /* USB1 HSホストクロックを有効にする */ // CLOCK_EnableClock(kCLOCK_Usbh1); // CLOCK_EnableUsbhs0HostClock(kCLOCK_UsbSrcUsbPll, 48000000U); // status_t status; // status = CLOCK_EnableUsbhs0HostClock(kCLOCK_UsbSrcUsbPll, 480000000U); // PRINTF("USBホストクロック初期化ステータス = %d\r\n", status); /* USB1を強制的にホストモードにする */ USBHSH->PORTMODE &= ~(1UL << 16); USBHSH->PORTMODE |= (1UL << 16); /* PHY用の小さな遅延 */ for (volatile uint32_t d = 0; d < 180000; d++) __NOP(); PRINTF("USB PORTMODE = 0x%08lX\r\n", USBHSH->PORTMODE); PRINTF("USBHSH->PORTSC1 = 0x%08lX\r\n", USBHSH->PORTSC1); PRINTF("USBHSH->USBSTS = 0x%08lX\r\n", USBHSH->USBSTS); PRINTF("USBHSH->USBCMD = 0x%08lX\r\n", USBHSH->USBCMD); PRINTF("\r\n--- USBクロック診断 ---\r\n"); /* USB PLLの状態 */ PRINTF("USBPLLCTRL : 0x%08lX\r\n", SYSCON->USBPLLCTRL); PRINTF("USBPLLSTAT : 0x%08lX\r\n", SYSCON->USBPLLSTAT); /* USB1クロック多重化器+分周器 */ PRINTF("USB1CLKSEL : 0x%08lX\r\n", SYSCON->USB1CLKSEL); PRINTF("USB1CLKDIV : 0x%08lX\r\n", SYSCON->USB1CLKDIV); /* パワーゲーティングのスナップショット */ PRINTF("PDRUNCFG : 0x%08lX\r\n", SYSCON->PDRUNCFG); /* SDKレベルのビュー */ PRINTF("USB1CLK周波数: %lu\r\n", CLOCK_GetFreq(kCLOCK_UsbClk)); PRINTF("--- USBクロック診断終了 ---\r\n\r\n"); /* USBホストスタックを開始 */ usb_status_t usbStatus = USB_HostInit(CONTROLLER_ID, &g_HostHandle, USB_HostEvent); if (usbStatus == kStatus_USB_Success) ヤージュ PRINTF("USBホスト初期化成功\r\n"); } それ以外 ヤージュ PRINTF("USBホスト初期化失敗: %d\r\n", (int)usbStatus); } システム起動中... USBポートモード = 0x00050000 USBHSH->PORTSC1 = 0x00001000 USBHSH->USBSTS = 0x00000000 USBHSH->USBCMD = 0x00000501 --- USB時計の診断 --- USBPLLCTRL : 0x00001017 USBPLLSTAT : 0x00000001 USB1CLKSEL : 0x00000002 USB1CLKDIV : 0x00000005 PDRUNCFG : 0x40000610 USB1CLK周波数: 0 --- USB時計診断終了 --- Re: USB Host mode Host init error 3 LPC54605J256 カルロスさん、早速のご返信ありがとうございます。 私はSDK 2.14.0を使用しています(もっと新しいバージョンを使ってみましたが、おそらくUSBドライバで失敗しました。IDEにはSDK(最新)と必要な(古い)ドライバの不一致と表示されました)。申し訳ありませんが、今はその詳細を覚えていません。 私は180MHzのCPUシステムクロックを使用しています。 これと共に - CLOCK_EnableUsbhs0HostClock(kCLOCK_UsbSrcUsbPll, 48000000U); status_t ステータス; status = CLOCK_EnableUsbhs0HostClock(kCLOCK_UsbSrcUsbPll, 48000000U); PRINTF("USBホストクロック初期化ステータス = %d\r\n", status); 私は戻ります - USBホストクロック初期化ステータス = 1 これで解決しますか? Re: USB Host mode Host init error 3 LPC54605J256 こんにちは、 @SOOTY1 さん。
投稿ありがとうございます!
お使いのSDKのバージョンを教えていただけますか?
CLOCK_EnableUsbhs0HostClock の戻り値を確認してください。
LPCXpresso54608ボード用のSDKに含まれるUSBホストのサンプルを参照することもできますが、それらのサンプルではHSではなくUSB FSを使用しています。
高速USBを動作させるには、CPUクロックを次のように設定する必要があります。 最低周波数は60MHz。
BR。
Re: USB Host mode Host init error 3 LPC54605J256 いくつか試してみましたが、USB時計が正しく接続されず、動作しないようです。USBPLLからの48MHz入力によるクロック設定で正しく選択されています。 int main(void) ヤージュ vPortDefineHeapRegions(xHeapRegions); BOARD_InitBootPins(); BOARD_InitBootClocks(); BOARD_InitBootPeripherals(); SEGGER_RTT_Init(); PRINTF("システム起動中...\r\n"); PRINTF("コアクロック = %lu Hz\r\n", CLOCK_GetFreq(kCLOCK_CoreSysClk)); /* 電源とクロック */ POWER_DisablePD(kPDRUNCFG_PD_USB1_PHY); POWER_DisablePD(kPDRUNCFG_PD_VD2_ANA); // 外部水晶振動子アナログ領域 POWER_DisablePD(kPDRUNCFG_PD_VD3); // USB PLLドメイン POWER_DisablePD(kPDRUNCFG_PD_VD5); // USB PHYドメイン SDK_DelayAtLeastUs(1500, SystemCoreClock); CLOCK_EnableClock(kCLOCK_Usbh1); CLOCK_EnableUsbhs0HostClock(kCLOCK_UsbSrcUsbPll, 48000000U); [48Mか480Mのどちらにすべきか分かりませんが、どちらにしても動作しません] PRINTF("USB PLL周波数 = %lu Hz\r\n", CLOCK_GetFreq(kCLOCK_UsbPll)); PRINTF("USB1CLK周波数 = %lu Hz\r\n", CLOCK_GetFreq(kCLOCK_UsbClk)); /* ホストモードを強制する - ビット16 */ USBHSH->PORTMODE &= ~(1UL << 16); USBHSH->PORTMODE |= (1UL << 16); PRINTF("USB PORTMODE = 0x%08lX\r\n", USBHSH->PORTMODE); PRINTF("USBHSH->PORTSC1 = 0x%08lX\r\n", USBHSH->PORTSC1); PRINTF("USBHSH->USBSTS = 0x%08lX\r\n", USBHSH->USBSTS); PRINTF("USBHSH->USBCMD = 0x%08lX\r\n", USBHSH->USBCMD); PRINTF("\r\n--- USBクロック診断 ---\r\n"); /* USB PLLの状態 */ PRINTF("USBPLLCTRL : 0x%08lX\r\n", SYSCON->USBPLLCTRL); PRINTF("USBPLLSTAT : 0x%08lX\r\n", SYSCON->USBPLLSTAT); /* USB1クロック多重化器+分周器 */ PRINTF("USB1CLKSEL : 0x%08lX\r\n", SYSCON->USB1CLKSEL); PRINTF("USB1CLKDIV : 0x%08lX\r\n", SYSCON->USB1CLKDIV); /* パワーゲーティングのスナップショット */ PRINTF("PDRUNCFG : 0x%08lX\r\n", SYSCON->PDRUNCFG); /* オプションのSDKレベルビュー(利用可能な場合) */ // PRINTF("USB1CLK周波数: %lu\r\n", CLOCK_GetFreq(kCLOCK_UsbPll)); PRINTF("--- USBクロック診断終了 ---\r\n\r\n"); /* スタックの初期化 */ usb_status_t status = USB_HostInit(CONTROLLER_ID, &g_HostHandle, USB_HostEvent); if (status != kStatus_USB_Success) { PRINTF("USB_HostInit がステータス %d で失敗しました\r\n", status); } 与える - プロセス: JLinkGDBServerCLExe システム起動中... コアクロック = 180000000 Hz USB PLL周波数 = 0 Hz USB1CLK周波数 = 0 Hz USBポートモード = 0x00050000 USBHSH->PORTSC1 = 0x00001000 USBHSH->USBSTS = 0x00000000 USBHSH->USBCMD = 0x00000501 --- USB時計の診断 --- USBPLLCTRL : 0x00000D3F USBPLLSTAT : 0x00000001 USB1CLKSEL : 0x00000002 USB1CLKDIV : 0x00000000 PDRUNCFG : 0x40000610 --- USB時計診断終了 --- USB_HostInit がステータス 3 で失敗しました。 パワーアップの手順に何か問題があるのでしょうか?正直、今はよく分かりません。 私はこれに長い間取り組んできました。ドライバが間違っている、または見つからないという問題も、別の問題だと思います。 それについてはさらによくわかりません。.map に登録されていますが、host_config で有効化され、ビルドに含まれ、ワークスペースに存在します。 Re: USB Host mode Host init error 3 LPC54605J256 こんにちは、 @SOOTY1さん
返信が遅くなり申し訳ありません。詳細なテストを実施していただき、ありがとうございました。
呼び出しを削除していただけますか?
CLOCK_EnableClock(kCLOCK_Usbh1);
電話する前に
CLOCK_EnableUsbhs0HostClock(kCLOCK_UsbSrcUsbPll, 48000000U);
理由は、クロックの有効化は既にCLOCK_EnableUsbhs0HostClock()関数内で処理されているためです。さらに、一部のペリフェラルは設定を変更する前に無効化する必要があり、事前にクロックを有効にすると、適切な再構成が妨げられる可能性があります。
結果を教えてください。 Re: USB Host mode Host init error 3 LPC54605J256 @carlos_o SDKに関する問題はまだ解決していません(詳細はスレッドを参照してください)。 本日、SDKを25.06.00に変更し、Config Toolsも26.03にアップデートしました。 USBホスト初期化失敗エラーコード3が依然として発生します。設定ツールのクロックツリーでマニュアル通りに設定されているように見えるにもかかわらず、PLLが起動しません。 どんなご意見でも大歓迎です。 ありがとう、
View full article