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

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

本帖最后由 碧水渊 于 2018-5-17 16:52 编辑
9 l: j: _  v0 f# p1 x+ Y+ ?0 M; J; ~) F
RTT+LWIP学习第一周

& R# t1 O8 n: \0 ]
0 B& }0 b7 O$ u! x/ z
目标开发板:单片机STM32F407IGT6,PHY芯片DP83848
源码版本  :RT-Thread官方源码3.0.3
* X( ]' {* e6 _' f4 P! B
源码的bsp中包含stm32f40x的rtt,通过env建立MDK工程,重新选择了目标芯片以后。遇到了第一个问题:bsp中的phy芯片是LAN9720和我的phy芯片不一致。
解决办法
硬件原理图如下所示
phy原理图.png
由于是phy芯片不一致,修改phy芯片相关的操作。即修改stm32f4xx_eth.c中的函数static voidphy_monitor_thread_entry(void *parameter)。

3 ~* A! h+ D8 k% ^1 k2 T. K
第一步:定义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) /* 建立有效连接状态标识 */
' g. E6 {- o, o4 r3 |' m& J) P( e

0 j6 i: n" z" V4 ^
第二步:初始化phy芯片DP83848
/* Read MICRregister */
tmpreg =ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_MICR);
6 f$ f* {- A# ]. a1 K( X* L# m
/* 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");
}
9 i7 @% ^, B: h3 J6 g2 k4 F  J
/* Read MISR register */
tmpreg =ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_MISR);
4 a+ q# t" K/ i2 N) N) Q/ l
/* 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;
       }
4 ^4 m! N1 a  |
       if(status & 0x04)
       {
             phy_speed_new |= PHY_DUPLEX_MASK;
       }
}
第4步,编译完成,下载到开发板。通过网线把开发板连接到路由器上。
在finsh窗口中输入list_if()命令。
listif.png
查看IP地址为192.168.1.100
在电脑的cmd窗口中就可以ping通开发板。
pcping.png
* V, o0 i% l0 b5 U3 L" y4 o9 w
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2018-5-17 17:14:19 | 显示全部楼层
写得很好,很有实用参考价值。
使用道具 举报 回复
发表于 2019-4-26 09:44:14 | 显示全部楼层
#define PHY_PHYSTS                  0x01 /* PHY Status Register*/
& V4 k2 m. t$ \  y! ?; h7 p5 C+ x3 _* Z4 D$ |
这个地方写错了,查看DP83848手册 地址应为为0x10
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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