调试STM32F417+DP83848,遇到的问题

2019-07-20 22:06发布

1.第一次是卡在初始化MAC层及DMA配置的软复位部分,如下:
ETH_SoftwareReset();                                                 
while (ETH_GetSoftwareResetStatus() == SET);

一直跳不出while循环,这主要是PHY芯片管脚配置的问题,我把一些不常用的管脚:PWR_DOWN/INT之类的不在程序中配置。
2.第二次卡初始化ETH中:
rval=ETH_Init(&ETH_InitStructure,DP83848_PHY_ADDRESS);
返回值为0,初始化不成功。
将问题定位在读取PHY芯片寄存器的函数中:
/* We wait for linked status... */
    do
    {
      timeout++;
    } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO));

    /* Return ERROR in case of timeout */
    if(timeout == PHY_READ_TO)
    {
      return ETH_ERROR;
    }

查看芯片手册,发现将COL管脚配置为悬空,表示1,我其他PHY地址管脚都是配置的悬空,那么这时的PHY地址为01
3.程序中一直往上位机发送数据,上位机只接收到一两个数据包;上位机往STM32发数据,总进到中断中,但没有调用接收数据的回调函数。
状态寄存器不对:LAN8720跟DP83848的状态寄存器不同。
////LAN8720 PHYD&#190;&#198;&#172;μ&#196;×′ì&#172;&#188;&#196;′&#230;&#198;÷
//#define PHY_SR                                ((uint16_t)31)                 //LAN8720μ&#196HY×′ì&#172;&#188;&#196;′&#230;&#198;÷μ&#216;&#214;·
//#define PHY_SPEED_STATUS    ((uint16_t)0x0004)         //LAN8720 PHY&#203;ù&#182;è&#214;μ&#209;ú&#194;&#235;
//#define PHY_DUPLEX_STATUS   ((uint16_t)0x00010) //LAN8720 PHYá&#172;&#189;ó×′ì&#172;&#214;μ&#209;ú&#194;&#235;  

/* The DP83848 PHY status register  */
#define PHY_SR                 ((uint16_t)0x10) /* PHY status register Offset */
#define PHY_SPEED_STATUS       ((uint16_t)0x0002) /* PHY Speed mask */
#define PHY_DUPLEX_STATUS      ((uint16_t)0x0004) /* PHY Duplex mask */

完成这些,程序基本调通。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。