主题:SysConfig 中讨论的其他器件
工具/软件:
我想检测 McASP0 上外部时钟的电源。
我是根据以下位置的样片实施的: C:\ti\mcu_plus_sdk_am62x_10_01_00_33\examples\drivers\mcasp\mcasp_playback_codec_aic31。
虽然我已经阅读过相关文档(请参阅 www.ti.com/.../spruiv7b.pdf 的第 1073 页)、但我无法确定如何实现这一点。
具体来说、我想实现以下四个功能:
- 检测何时首次提供外部时钟(最初未提供)。
- 检测外部时钟何时停止。
- 检测何时再次为外部时钟供电。
- 检测到外部时钟后、重新启动 McASP 并输出到扬声器。
这与以下线程相关:
e2e.ti.com/.../sk-am62-how-to-properly-restart-mcasp0-after-calling-mcasp_close
如果可能、我希望获得基于源代码的指导。
我到目前为止尝试过的(供参考):
μ s 工作中:
- SYSCFG 配置为从 AUDIO_EXT_ERFX1 接收时钟。
- 当时钟由 AUDIO_EXT_ERFP1 供电时、音频输出工作。
- 如果
Drivers_mcaspOpen()事先调用、则进行初始时钟检测。
μ s 不工作:
- 初始时钟检测的逻辑似乎不正确。
-
Drivers_mcaspOpen()和Drivers_mcaspClose()的行为有问题。
μ s 我为时钟检测尝试的步骤: (假设最初没有提供外部时钟)
- 调用
Drivers_mcaspOpen() - 出现错误、但我继续处理:
ERROR: Drivers_mcaspOpen:295: MCASP open failed for instance 0 !!! - 根据文档进行初始化:
void init_mcasp0_rclkchk() { uint32_t val = CSL_REG32_RD(MCASP0_RCLKCHK); val &= ((0x00 << 16) | (0x00 << 8)); val |= (RCKCHK_MAX << 16); val |= (RCKCHK_MIN << 8); val |= (2 << 0); CSL_REG32_WR(MCASP0_RCLKCHK, val); CSL_REG32_FINS((CSL_MCASP0_CFG_BASE + MCASP_RSTAT_OFFSET), MCASP_RSTAT_RCKFAIL, 1u); } - 检查
MCASP0_RCNT并RCKFAIL:void chk_mcasp0_rcnt() { uint32_t rcnt = (CSL_REG32_RD(MCASP0_RCLKCHK) >> 24) & 0xFF; uint32_t rmax = (CSL_REG32_RD(MCASP0_RCLKCHK) >> 16) & 0xFF; uint32_t rmin = (CSL_REG32_RD(MCASP0_RCLKCHK) >> 8) & 0xFF; DebugP_log("[MCASP0]RCNT: %3u | RMAX: %3u | RMIN: %3u\r\n", rcnt, rmax, rmin); } bool poll_mcasp0_rckfail() { uint32_t isFail = CSL_REG32_FEXT((CSL_MCASP0_CFG_BASE + MCASP_RSTAT_OFFSET), MCASP_RSTAT_RCKFAIL); if (isFail == CSL_MCASP_RSTAT_RCKFAIL_YES) { DebugP_log("RCKFAIL: clock NG\r\n"); CSL_REG32_FINS((CSL_MCASP0_CFG_BASE + MCASP_RSTAT_OFFSET), MCASP_RSTAT_RCKFAIL, 1u); return false; } else if (isFail == CSL_MCASP_RSTAT_RCKFAIL_NO) { DebugP_log("clock OK\r\n"); return true; } else { DebugP_log("ERROR!! %d\r\n", isFail); return false; } } - 提供外部时钟
poll_mcasp0_rckfail()返回 trueDrivers_mcaspOpen()失败、但在调用Drivers_mcaspClose()并重新打开后、成功- Re 运行
init_mcasp0_rclkchk() - 通话
MCASP_startTransferRx()/MCASP_startTransferTx()→扬声器输出正常 - 停止外部时钟
poll_mcasp0_rckfail()检测时钟停止- 根据文档(,,,)停止 McASP
MCASP_stopTransferRxMCASP_stopTransferTxMCASP_withdrawRxMCASP_withdrawTx - Re 运行
init_mcasp0_rclkchk() - 不会再次检测到外部时钟
- 调用
Drivers_mcaspClose()/Drivers_mcaspOpen()使程序挂起