调试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 */

完成这些,程序基本调通。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
qianyuyu
2019-07-21 00:43
原子哥的程序里面有个小坑,如果程序已经跑起来,你还没接网线,这时再接网线,程序会卡在分配内存的位置,原因是:
没接网线,初始化LAN8720通不过,这时已经分配好四个数组的内存:DMARxDscrTab  DMATxDscrTab Rx_Buff Tx_Buff,和mem mep内存,
这次初始化不通过,会继续初始化,继续给四个数组分配内存,这样,内存已经被分配完了,再接上网线,程序就会停在分配内存的位置。

一周热门 更多>