最近的项目,我使用自己画的板子,使用的STM32F429VIT6(即100Ppin)的片子,外接PHY为RTL8201CP,将例程中RMII接口改为MII接口,发现如下问题:程序卡在下面的循环中,出不来
while (((heth->Instance)->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET)
{
}
这一段代码出现在文件stm32f4xx_hal_eth.c中的函数HAL_StatusTypeDef HAL_ETH_Init(ETH_HandleTypeDef *heth)中,前后文为
/* Ethernet Software reset */
/* Set the SWR bit: resets all MAC subsystem internal registers and logic */
/* After reset all the registers holds their respective reset values */
(heth->Instance)->DMABMR |= ETH_DMABMR_SR;
/* Wait for software reset */
while (((heth->Instance)->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET)
{
}
这是在设置ETH_DMABMR_SR位软件复位后,等待ETH_DMABMR_SR位变为1,但是此寄存器永远不会变为1,
我查阅了手册,此位描述为:
“位 0 SR: 软件复位 (Software reset)
当该位置 1 时, MAC DMA 控制器会复位所有 MAC 子系统的内部寄存器和逻辑。在所有内核时钟域完成复位操作后,该位自动清零。重新编程任何内核寄存器之前,在该位中读取0 值。 ” (出自《STM32F4xx中文参考手册》P912)
为了侦测此位,我在程序中加入了一个变量“T”,将程序改为
/* Ethernet Software reset */
/* Set the SWR bit: resets all MAC subsystem internal registers and logic */
/* After reset all the registers holds their respective reset values */
T= (heth->Instance)->DMABMR;
(heth->Instance)->DMABMR &= ((uint32_t)0xFFFFFFFE);
T= (heth->Instance)->DMABMR;
(heth->Instance)->DMABMR &= ((uint32_t)0x0);
T= (heth->Instance)->DMABMR;
(heth->Instance)->DMABMR |= ETH_DMABMR_SR;
T= (heth->Instance)->DMABMR;
/* Wait for software reset */
while (((heth->Instance)->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET)
{
T= (heth->Instance)->DMABMR;
}
紫色部分为我加入的代码,发现两个问题
1、ETH_DMABMR_SR位根本不可能为0,以我粗浅的认识,写入1的前提是本来为0,但是此位从来不会为0,即使强制写入也不可能为0,这个寄存器的其他位都可以人为的强制写入0,但是此位不行。
2、ETH_DMABMR寄存器文档上说复位值为0x0000 2101(出自《STM32F4xx中文参考手册》P911),但是读出的数据却是0x0002 0101。
有没有知道或者遇到过类似问题的高手,不吝赐教。
电路原理图在附件中:[img]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\117225113\QQ\WinTemp\RichOle\M)08[~)2XYRBI})X9`F(BPC.png[/img]
[img]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\117225113\QQ\WinTemp\RichOle\M)08[~)2XYRBI})X9`F(BPC.png[/img] |