こんにちは、皆さん。
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
スケジューラを起動しています...
時計を見るために、さらにいくつかの印刷明細書を印刷しました。クロックツールでは正しく設定されているのですが、正常に動作していないようです。
/* ======================= メイン ====================== */
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時計診断終了 ---
カルロスさん、早速のご返信ありがとうございます。
私は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
これで解決しますか?
こんにちは、 @SOOTY1 さん。
投稿ありがとうございます!
お使いのSDKのバージョンを教えていただけますか?
CLOCK_EnableUsbhs0HostClock の戻り値を確認してください。
LPCXpresso54608ボード用のSDKに含まれるUSBホストのサンプルを参照することもできますが、それらのサンプルではHSではなくUSB FSを使用しています。
高速USBを動作させるには、CPUクロックを次のように設定する必要があります。
最低周波数は60MHz。
BR。
いくつか試してみましたが、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 で有効化され、ビルドに含まれ、ワークスペースに存在します。
こんにちは、 @SOOTY1さん
返信が遅くなり申し訳ありません。詳細なテストを実施していただき、ありがとうございました。
呼び出しを削除していただけますか?
CLOCK_EnableClock(kCLOCK_Usbh1);
SDKに関する問題はまだ解決していません(詳細はスレッドを参照してください)。
本日、SDKを25.06.00に変更し、Config Toolsも26.03にアップデートしました。
USBホスト初期化失敗エラーコード3が依然として発生します。設定ツールのクロックツリーでマニュアル通りに設定されているように見えるにもかかわらず、PLLが起動しません。
どんなご意見でも大歓迎です。
ありがとう、
@carlos_oこんにちは、
cppを使って分周器レジスタを変更することには成功しましたが(設定ツールでは不可能でした)、それでもクロックがUSB1に接続されないという問題は解決できません。
適切な電源投入手順、クロック接続手順、またはこのエラーを回避するための手順を投稿していただけませんか?USB接続に関しては現状非常に特殊な仕様になっていることは理解していますが、それでも必ず何らかの明確な解決策があるはずです(ユーザーマニュアルやフォーラム、インターネット上では見つけることができませんでした)。
ありがとう、
@carlos_oこんにちは、config toolsで設定してもレジスタの値が変わらず、clockconfig.cで確認できることを示すためだけに説明します。生成されたファイル -
システム起動中...
コアクロック = 96000000 Hz
BOARD_InitBootClocksの後:
USB PLL周波数 = 0 Hz
クロック有効化の戻り値: 1
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で失敗しました
見て、クロック設定.cであっても、USB1CLKがMAINCLKSELAに設定されている状態 -
実際にはレジスタ値を変更していません。
void BOARD_BootClockRUN(void)
ヤージュ
/*!< クロックソースを設定する */
/*!< FRO の設定 */
POWER_DisablePD(kPDRUNCFG_PD_FRO_EN); /*!< FROがオンになっていることを確認します */
CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< 誤って電圧を変更しないように、まず FRO 12MHz に切り替えます。
電流速度に対する電圧を下回っていること */
POWER_DisablePD(kPDRUNCFG_PD_SYS_OSC); /*!< システム発振器電源を有効にする */
SYSCON->SYSOSCCTRL = ((SYSCON->SYSOSCCTRL & ~SYSCON_SYSOSCCTRL_FREQRANGE_MASK) | SYSCON_SYSOSCCTRL_FREQRANGE(1U)); /*!< システム発振器範囲を設定します */
/*!< ROMとOTPに電源が供給されていることを確認する必要があります(PDRUNCFG0[17,29]= 0U)
このAPIはROMコードに実装されているため、このAPIを呼び出す前に*/
CLOCK_SetupFROClocking(12000000U); /*!< 念のため、FROを12MHzに設定します */
POWER_SetVoltageForFreq(96000000U); /*!< 最も高速なクロック出力の1つであるシステムクロック出力の電圧を設定します */
CLOCK_SetFLASHAccessCyclesForFreq(96000000U); /*!< コアのFLASH待機状態を設定します */
/*!< SYS PLL の設定 */
const pll_setup_t pllSetup = {
.pllctrl= SYSCON_SYSPLLCTRL_SELI(16U) | SYSCON_SYSPLLCTRL_SELP(8U) | SYSCON_SYSPLLCTRL_SELR(0U)、
.pllmdec= (SYSCON_SYSPLLMDEC_MDEC(8191U))
.pllndec= (SYSCON_SYSPLLNDEC_NDEC(770U))
.pllpdec= (SYSCON_SYSPLLPDEC_PDEC(98U))
.pllRate= 180000000U、
.フラグ= PLL_SETUPFLAG_WAITLOCK | PLL_SETUPFLAG_POWERUP
};
CLOCK_AttachClk(kEXT_CLK_to_SYS_PLL); /*!< SYS PLLクロックソースを設定します */
CLOCK_SetPLLFreq(&pllSetup); /*!< PLLを目的の値に設定します */
/*!< オーディオPLLの設定 */
const pll_setup_t audio_pllSetup = {
.pllctrl= SYSCON_AUDPLLCTRL_SELI(59U) | SYSCON_AUDPLLCTRL_SELP(31U) | SYSCON_AUDPLLCTRL_SELR(0U)、
.pllmdec= (SYSCON_AUDPLLMDEC_MDEC(30583U))
.pllndec= (SYSCON_AUDPLLNDEC_NDEC(1U))
.pllpdec= (SYSCON_AUDPLLPDEC_PDEC(5U))
.pllRate= 48000000U、
.フラグ= PLL_SETUPFLAG_WAITLOCK | PLL_SETUPFLAG_POWERUP
};
CLOCK_AttachClk(kEXT_CLK_to_AUDIO_PLL); /*!< オーディオPLLクロックソースを設定します */
CLOCK_SetAudioPLLFreq(&audio_pllSetup); /*!< PLLを目的の値に設定します */
/*!< USB PLLの設定 */
const usb_pll_setup_t usb_pllSetup = {
.msel= 95U、
.nsel= 3U、
.psel= 0U、
。直接= 真、
。バイパス= 偽、
.fbsel= 偽、
.inputRate= 12000000U、
};
CLOCK_SetUsbPLLFreq(&usb_pllSetup); /*!< PLLを目的の値に設定します */
/*!< ROMとOTPに電源が供給されていることを確認する必要があります(PDRUNCFG0[17,29]= 0U)
このAPIはROMコードに実装されているため、このAPIを呼び出す前に*/
CLOCK_SetupFROClocking(96000000U); /*!< 高周波FRO出力を選択された周波数に設定します */
/*!< 区切り線を設定する */
CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< 分周器カウンタをリセットし、分周器を値 1 に設定します */
CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 0U, true); /*!< USB0CLKDIV分周器カウンタをリセットして停止します */
CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 6U, false); /*!< USB0CLKDIV分周器を値6に設定します */
CLOCK_SetClkDiv(kCLOCK_DivUsb1Clk, 0U, true); /*!< USB1CLKDIV分周器カウンタをリセットして停止します */
CLOCK_SetClkDiv(kCLOCK_DivUsb1Clk, 2U, false); /*!< USB1CLKDIV分周器を値2に設定します */
CLOCK_SetClkDiv(kCLOCK_DivSctClk, 0U, true); /*!< SCTCLKDIV 分周器カウンタをリセットして停止します */
CLOCK_SetClkDiv(kCLOCK_DivSctClk, 48U, false); /*!< SCTCLKDIV分周器を48に設定します */
/*!< クロックセレクタの設定 - 周辺機器にクロックを接続する */
CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /*!< MAIN_CLKをFRO_HFに切り替える */
SYSCON->ASYNCAPBCTRL = SYSCON_ASYNCAPBCTRL_ENABLE_MASK; /*!< 非同期APBサブシステムを有効にする */
CLOCK_AttachClk(kMAIN_CLK_to_ASYNC_APB); /*!< ASYNC_APB を MAIN_CLK に切り替える */
CLOCK_AttachClk(kUSB_PLL_to_USB0_CLK); /*!< USB0_CLKをUSB_PLLに切り替える */
CLOCK_AttachClk(kFRO_HF_to_USB1_CLK); /*!< USB1_CLKをMAIN_CLKに切り替える */
CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM2); /*!< FLEXCOMM2 を AUDIO_PLL に切り替える */
CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM3); /*!< FLEXCOMM3 を AUDIO_PLL に切り替える */
CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM5); /*!< FLEXCOMM5 を AUDIO_PLL に切り替える */
CLOCK_AttachClk(kAUDIO_PLL_to_FLEXCOMM7); /*!< FLEXCOMM7 を AUDIO_PLL に切り替える */
CLOCK_AttachClk(kAUDIO_PLL_to_SCT_CLK); /*!< SCT_CLK を AUDIO_PLL に切り替える */
/*!< SystemCoreClock 変数を設定します。*/
SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;
}
(メイン画面より)
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));
PRINTF("BOARD_InitBootClocks実行後:\n");
PRINTF("USB PLL周波数 = %lu Hz\r\n", CLOCK_GetFreq(kCLOCK_UsbPll));
/* === 推奨パワーアップ順序 === */
POWER_DisablePD(kPDRUNCFG_PD_VD2_ANA); // Crystal アナログドメイン - FIRST
POWER_DisablePD(kPDRUNCFG_PD_VD3); // PLLドメイン
POWER_DisablePD(kPDRUNCFG_PD_VD5); // PHYドメイン
POWER_DisablePD(kPDRUNCFG_PD_USB_PLL);
POWER_DisablePD(kPDRUNCFG_PD_USB1_PHY);
SDK_DelayAtLeastUs(15000, SystemCoreClock); // 15ms — 水晶発振子が安定するまでの時間を与える
/* 強制水晶発振器 */
SYSCON->SYSOSCCTRL = 0x00000000;
// CLOCK_EnableClock(kCLOCK_Usbh1);
status_t clkStatus = CLOCK_EnableUsbhs0HostClock(kCLOCK_UsbSrcUsbPll, 48000000U);
PRINTF("クロックイネーブルが返されました: %d\r\n", clkStatus);
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);
}
@carlos_oこんにちは、大丈夫です、返信ありがとうございます!
はい、ご提案いただいたとおり、時計関連の呼び出しを削除しました。しかし、それでもなお失敗している。
奇妙なことに、USB1CLKDIVの値は毎回0x0と報告される。(これは288MHz USBPLLから派生した6分の1の値です)しかし、これはまだPLLが動作していないためかもしれません。この起動シーケンスを一切行わなくても、PLLは起動しなかった。基板上には12MHzの水晶発振子が搭載されています。
USBPLL から MAINCLKSELA に変更して、96MHz を分割して USB1CLK に供給するようにしてみましたが、Core clock Freq は確認できたものの、96MHzに変更すると、USBCLKDIVは0x0のまま(選択されたのは/2)、USBCLKSELは0x00000002になりました。(MAINCLKSELAを反映するように値を変更すべきでした)
それについてはどう解釈すればいいのか分からない。
システム起動中...
コアクロック = 180000000 Hz
BOARD_InitBootClocksの後:
USB PLL周波数 = 0 Hz
クロック有効化の戻り値: 1
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で失敗しました
現在のメインは
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));
PRINTF("BOARD_InitBootClocks実行後:\n");
PRINTF("USB PLL周波数 = %lu Hz\r\n", CLOCK_GetFreq(kCLOCK_UsbPll));
/* === 推奨パワーアップ順序 === */
POWER_DisablePD(kPDRUNCFG_PD_VD2_ANA); // Crystal アナログドメイン - FIRST
POWER_DisablePD(kPDRUNCFG_PD_SYS_OSC);
POWER_DisablePD(kPDRUNCFG_PD_VD3); // PLLドメイン
POWER_DisablePD(kPDRUNCFG_PD_VD5); // PHYドメイン
POWER_DisablePD(kPDRUNCFG_PD_USB_PLL);
POWER_DisablePD(kPDRUNCFG_PD_USB1_PHY);
SDK_DelayAtLeastUs(15000, SystemCoreClock); // 15ms — 水晶発振子が安定するまでの時間を与える
/* 強制水晶発振器 */
SYSCON->SYSOSCCTRL = 0x00000000;
// CLOCK_EnableClock(kCLOCK_Usbh1);
status_t clkStatus = CLOCK_EnableUsbhs0HostClock(kCLOCK_UsbSrcUsbPll, 48000000U);
PRINTF("クロックイネーブルが返されました: %d\r\n", clkStatus);
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);
}
こんにちは、 @SOOTY1さん
LPC546xxの利用可能なコード例を確認したところ、host_hid_generic_bmの例では、デバイスを高速(HS)モードで動作させるように構成する方法が示されていることがわかりました。
参考として、こちらの例をご覧ください。上記の手順を実行しても問題が解決しない場合は、サポートチケットを開いて、お客様の具体的なコードとハードウェア構成を詳細に確認させてください。
ありがとうございます。問題は、サンプルボードの設定が私のものと大きく異なるため、その方法をサンプルボードの設定からどのように抽出すればよいのか分からないことです。
USBの実装は諦めます。
@carlos_o
628の例にあるさまざまなファイルからなんとか組み立てることができました
USBホストの初期化に成功しました。どうもありがとうございました。