卡住的代码如下:
static int enet_dma_init(ENET_Type *ptr, enet_desc_t *desc, uint32_t intr, uint8_t pbl)
{
/* generate software reset */
ptr->DMA_BUS_MODE |= ENET_DMA_BUS_MODE_SWR_MASK;
/* wait for the completion of reset process */
rt_kprintf("start ENET_DMA_BUS_MODE_SWR_GET(ptr->DMA_BUS_MODE)=%d\r\n",ENET_DMA_BUS_MODE_SWR_GET(ptr->DMA_BUS_MODE));
while (ENET_DMA_BUS_MODE_SWR_GET(ptr->DMA_BUS_MODE)) {
// rt_kprintf("start ENET_DMA_BUS_MODE_SWR_GET(ptr->DMA_BUS_MODE)=%d\r\n",ENET_DMA_BUS_MODE_SWR_GET(ptr->DMA_BUS_MODE));
}
rt_kprintf("end ENET_DMA_BUS_MODE_SWR_GET(ptr->DMA_BUS_MODE)=%d\r\n",ENET_DMA_BUS_MODE_SWR_GET(ptr->DMA_BUS_MODE));
/* initialize bus mode register */
ptr->DMA_BUS_MODE |= ENET_DMA_BUS_MODE_AAL_MASK;
ptr->DMA_BUS_MODE &= ~ENET_DMA_BUS_MODE_FB_MASK;
/* enable pblx8 mode */
ptr->DMA_BUS_MODE |= ENET_DMA_BUS_MODE_PBLX8_MASK;
/* set programmable burst length */
ptr->DMA_BUS_MODE &= ~ENET_DMA_BUS_MODE_PBL_MASK;
ptr->DMA_BUS_MODE |= ENET_DMA_BUS_MODE_PBL_SET(pbl);
/* disable separate pbl */
ptr->DMA_BUS_MODE &= ~ENET_DMA_BUS_MODE_USP_MASK;
/* descriptor length */
#if ENET_SOC_ALT_EHD_DES_LEN == ENET_SOC_ALT_EHD_DES_MIN_LEN
ptr->DMA_BUS_MODE &= ~ENET_DMA_BUS_MODE_ATDS_MASK;
#elif ENET_SOC_ALT_EHD_DES_LEN == ENET_SOC_ALT_EHD_DES_MAX_LEN
ptr->DMA_BUS_MODE |= ENET_DMA_BUS_MODE_ATDS_MASK;
#endif
/* set the maximum enabled burst length */
if (ENET_DMA_BUS_MODE_FB_GET(ptr->DMA_BUS_MODE) == 0) {
ptr->DMA_AXI_MODE |= ENET_DMA_AXI_MODE_BLEN4_MASK | ENET_DMA_AXI_MODE_BLEN8_MASK | ENET_DMA_AXI_MODE_BLEN16_MASK;
} else {
/* TODO: set BLENX_MASK */
}
/* initialize Tx descriptors list: chain mode */
rt_kprintf("enet_dma_init: enet_dma_tx_desc_chain_init start\r\n");
enet_dma_tx_desc_chain_init(ptr, desc);
/* initialize Rx descriptors list: Chain Mode */
rt_kprintf("enet_dma_init: enet_dma_rx_desc_chain_init start\r\n");
enet_dma_rx_desc_chain_init(ptr, desc);
rt_kprintf("enet_dma_init: enet_mode_init start\r\n");
enet_mode_init(ptr, intr);
rt_kprintf("enet_dma_init: enet_dma_flush start\r\n");
enet_dma_flush(ptr);
return true;
}
会卡在ENET_DMA_BUS_MODE_SWR_GET(ptr->DMA_BUS_MODE)
这一步,置位1之后,硬件会自动复位,但是事实上并没有复位
设置的时钟频率是50Mhz,这个我增加了打印,打印输出的均为250Mhz,然后设置网络时钟的时候250/5,IO的是设置完引脚之后直接使用软件导出的,又对比着设计图确认一遍,没问题,但是他还是卡在SWR复位的位置
用示波器或频率计确认一下 RMII_REFCLK 有稳定的50Mhz时钟。