请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:OMAP-L138 Thread 中讨论的其他器件:OMAPL138
您好!
我正在尝试编写一个函数来将 EMAC 模块置于复位状态。 正如我在文档中所理解的那样、电源和睡眠控制器不能只通过软复位寄存器对其进行复位。 首先需要确保 EMAC 模块当前未传输帧。 以确保我要执行拆解并等待其生效。 这就是我遇到问题的地方。
以下是我的代码:
void EMAC_Stop (void) { //取消激活中断 //禁用 EMAC_C0RX 中断 CSL_fins (aintcRegs->EICR、AINTC_EICR_INDEX、AINTC_EventID_EMAC_C0RX); //禁用 EMAC_C0RX 中断 CSL_fins (aintcRegs->EICR、AINTC_EICR_INDEX、AINTC_EventID_EMAC_C0TX); //teardown 接收和发送通道 CSL_FINST (emacRegs->RXTEARDOWN、EMAC_RXTEARDOWN_RXTDNCH、CHA0); CSL_FINST (emacRegs->TXTEARDOWN、EMAC_TXTEARDOWN_TXTDNCH、 CHA0); //TODO 添加超时 while ((0!= emacRegs->RX0HDP)||(0!= emacRegs->TX0HDP); CSL_FINST (emacRegs->TXCONTROL、EMAC_TXREROL_TXEN、DISABLE); CSL_FINST (emacRecontrol->TXCONTROL) EMAC_RXCONTROL_RXEN、DISABLE); CSL_FINST (emacRegs->SOFTRESET、EMAC_SOFTRESET_SOFTRESET、RESET); //TODO 添加超时 while (0!= CSL_FEXT (emacRegs->SOFTRESET、EMAC_SOFTRESET_SOFTRESET) ; CSL_fins (emacCtlRegs->SOFTRESET、ECTL_SOFTRESET_RESET、1); //将模块复位 // 1. 等待 PTSTAT 中的 GOSTAT[x]位清零。 您必须等待任何操作 //先前启动的转换在启动新转换之前完成。 while (CSL_FEXT (psc1Regs->PTSTAT、PSC_PTSTAT_GOSTAT0)!= 0) { ; } // 2. 将 MDCTLn 中的下一位设置为 SwRstDisable (0)、SyncReset (1)、Disable (2h)、 //启用(3h)、自动睡眠(4h)或自动唤醒(5h)。 CSL_FINST (psc1Regs->MDCTL[CSL_PSC_EMAC]、PSC_MDCTL_NEXT、SWRSTDISABLE); // 3. 将 PTCMD 中的 GO[x]位设置为1以启动转换。 CSL_FINST (psc1Regs->PTCMD、PSC_PTCMD_GO0、SET); // 4. 等待 PTSTAT 中的 GOSTAT[x]位清零。 模块是安全的 //在新状态下,只在 PTSTAT 中的 GOSTAT[x]位清零后。 while (CSL_FEXT (psc1Regs->PTSTAT、PSC_PTSTAT_GOSTAT0)!= 0) { ; } }
有时它会停留在以下行: while ((0!= emacRegs->RX0HDP)||(0!= emacRegs->TX0HDP))
在开始拆卸后。 我希望在撕裂完成后、TX0HDP 为空。 我还(通过调试器)检查了帧描述符的描述符标志、从 TX0HDP 指向的描述符开始。
我是否误解了 EMAC 模块所需的关机过程或拆卸行为?
此致
Arthur