1.第一次是卡在初始化MAC层及DMA配置的软复位部分,如下:
ETH_SoftwareReset();
while (ETH_GetSoftwareResetStatus() == SET);
一直跳不出while循环,这主要是PHY芯片管脚配置的问题,我把一些不常用的管脚:PWR_DOWN/INT之类的不在程序中配置。
2.第二次卡初始化ETH中:
rval=ETH_Init(Ð_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¾Æ¬μÄ×′쬼Ä′æÆ÷
//#define PHY_SR ((uint16_t)31) //LAN8720μÄ
HY×′쬼Ä′æÆ÷μØÖ·
//#define PHY_SPEED_STATUS ((uint16_t)0x0004) //LAN8720 PHYËù¶èÖμÑúÂë
//#define PHY_DUPLEX_STATUS ((uint16_t)0x00010) //LAN8720 PHYᬽó×′ì¬ÖμÑúÂë
/* 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 */
完成这些,程序基本调通。
没接网线,初始化LAN8720通不过,这时已经分配好四个数组的内存:DMARxDscrTab DMATxDscrTab Rx_Buff Tx_Buff,和mem mep内存,
这次初始化不通过,会继续初始化,继续给四个数组分配内存,这样,内存已经被分配完了,再接上网线,程序就会停在分配内存的位置。
一周热门 更多>