【LwIP学习营】【第一周】移植中遇到phy芯片不一致及其解...

发表在 网络学习营2018-5-17 16:24 [复制链接] 2 2122

本帖最后由 碧水渊 于 2018-5-17 16:52 编辑 * ~# }( F, P( |+ R
( `4 _# A/ k3 j& P' n. j' G
RTT+LWIP学习第一周

5 f9 q8 U, g- ~( n  y
, L( L! G; q: c1 s. k
目标开发板:单片机STM32F407IGT6,PHY芯片DP83848
源码版本  :RT-Thread官方源码3.0.3

/ U, n$ p6 ?3 C- b; {$ ~9 o2 D
源码的bsp中包含stm32f40x的rtt,通过env建立MDK工程,重新选择了目标芯片以后。遇到了第一个问题:bsp中的phy芯片是LAN9720和我的phy芯片不一致。
解决办法
硬件原理图如下所示
phy原理图.png
由于是phy芯片不一致,修改phy芯片相关的操作。即修改stm32f4xx_eth.c中的函数static voidphy_monitor_thread_entry(void *parameter)。

" H' y3 ^7 t! h& g% z7 Z5 Q
第一步:定义phy芯片DP83848的地址和用到的寄存器
#define DP83848_PHY_ADDRESS 0x01
/* PHY registers */
#define PHY_MICR                    0x11 /* MII Interrupt Control Register */
#define PHY_MICR_INT_EN             ((uint16_t)0x0002) /* PHY Enable interrupts */
#define PHY_MICR_INT_OE             ((uint16_t)0x0001) /* PHY Enable output interrupt events */
#define PHY_MISR                    0x12 /* MII Interrupt Status and Misc. Control Register */
#define PHY_MISR_LINK_INT_EN        ((uint16_t)0x0020) /* Enable Interrupt on change of link status */
#define PHY_LINK_STATUS             ((uint16_t)0x2000) /* PHY link status interrupt mask */
#define PHY_PHYSTS                  0x01 /* PHY Status Register*/
#define PHY_PHYSTS_AUTONEG_COMPLETE ((uint16_t)0x0010) /* 自动协商完成 */
#define PHY_PHYSTS_DUPLEX_STATUS    ((uint16_t)0x0004) /* 全双工,半双工,状态标识*/
#define PHY_PHYSTS_SPEED_STATUS     ((uint16_t)0x0002) /* 10Mb/s和100Mb/s速度状态标识 */
#define PHY_PHYSTS_LINK_STATUS      ((uint16_t)0x0001) /* 建立有效连接状态标识 */
2 m( i" t* ?9 `& {/ P+ d
' k, B9 q! \- ^, F) |- M$ W: a
第二步:初始化phy芯片DP83848
/* Read MICRregister */
tmpreg =ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_MICR);
  i; O9 c/ t* h$ w1 T; g0 K
/* Enable output interrupt events to signalvia the INT pin */
tmpreg |= (uint32_t)PHY_MICR_INT_EN |PHY_MICR_INT_OE;
if(!(ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_MICR, tmpreg)))
{
       /* Return ERROR in case of writetimeout */
       STM32_ETH_PRINTF("phy writetimeout\r\n");
}

- ]8 ~, y: ?6 z3 C$ e7 E+ s
/* Read MISR register */
tmpreg =ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_MISR);

" K# S: F3 ~2 u3 Q' f
/* Enable Interrupt on change of linkstatus */
tmpreg |= (uint32_t)PHY_MISR_LINK_INT_EN;
if(!(ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_MISR, tmpreg)))
{
        /* Return ERROR in case of writetimeout */
        STM32_ETH_PRINTF("phy writetimeout\r\n");
}
/* Return SUCCESS */
STM32_ETH_PRINTF("phy init\r\n");
第三步:修改读取phy芯片DP83848的link status的函数
uint16_t status =ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_PHYSTS);
STM32_ETH_PRINTF("DP83848PHYSTS:0x%04X\r\n", status);
phy_speed_new = 0;
if(status &(PHY_PHYSTS_AUTONEG_COMPLETE |PHY_PHYSTS_LINK_STATUS)) //link status changed
{
       phy_speed_new = PHY_LINK_MASK;
       if((status & 0x03) == 1)
       {
             phy_speed_new |= PHY_100M_MASK;
       }

, ~$ N; x( {/ ?
       if(status & 0x04)
       {
             phy_speed_new |= PHY_DUPLEX_MASK;
       }
}
第4步,编译完成,下载到开发板。通过网线把开发板连接到路由器上。
在finsh窗口中输入list_if()命令。
listif.png
查看IP地址为192.168.1.100
在电脑的cmd窗口中就可以ping通开发板。
pcping.png

5 U, T5 r+ |. Q) [* N( C. ]& _
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2018-5-17 17:14:19 | 显示全部楼层
写得很好,很有实用参考价值。
使用道具 举报 回复
发表于 2019-4-26 09:44:14 | 显示全部楼层
#define PHY_PHYSTS                  0x01 /* PHY Status Register*/
0 U* o: F0 H1 V, f- u6 J3 _; g- h- [. H$ W7 L. v0 M! l4 y/ q
这个地方写错了,查看DP83848手册 地址应为为0x10
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表