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

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

本帖最后由 碧水渊 于 2018-5-17 16:52 编辑 6 w' ~! C7 U$ D. {5 Q- [
# r& |8 |( z! c9 _' I
RTT+LWIP学习第一周
( B) F4 F' m. a

* f% L) u' ]( ]
目标开发板:单片机STM32F407IGT6,PHY芯片DP83848
源码版本  :RT-Thread官方源码3.0.3

% x: s4 c: \3 z1 j9 _( c
源码的bsp中包含stm32f40x的rtt,通过env建立MDK工程,重新选择了目标芯片以后。遇到了第一个问题:bsp中的phy芯片是LAN9720和我的phy芯片不一致。
解决办法
硬件原理图如下所示
phy原理图.png
由于是phy芯片不一致,修改phy芯片相关的操作。即修改stm32f4xx_eth.c中的函数static voidphy_monitor_thread_entry(void *parameter)。

5 P0 N4 Z0 @+ `2 b% S1 |* P8 X
第一步:定义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) /* 建立有效连接状态标识 */

8 n+ m, z3 v$ m8 z+ y7 t: {
5 w+ Z1 p; u  C# A2 \1 _" y
第二步:初始化phy芯片DP83848
/* Read MICRregister */
tmpreg =ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_MICR);

3 A" G4 c$ D4 V+ c$ y# z
/* 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");
}

5 P+ K) H/ E- W8 s
/* Read MISR register */
tmpreg =ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_MISR);
: D2 o# t# Q5 ]+ C8 }
/* 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;
       }

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

$ i8 k, ^2 w! [# C6 o
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-4-26 09:44:14 | 显示全部楼层
#define PHY_PHYSTS                  0x01 /* PHY Status Register*/
8 x8 W" g3 e+ h7 S  k; S: x$ g* |1 J7 B9 ~( s! ?8 y$ P
这个地方写错了,查看DP83848手册 地址应为为0x10
使用道具 举报 回复
发表于 2018-5-17 17:14:19 | 显示全部楼层
写得很好,很有实用参考价值。
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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