1.新建项目后找到board.h中的ETH CONFIG BEGIN,开启以太网配置。
2.找到phy_reset()并修改其中复位引脚至自己的板卡。这里我的与历程相同,无需修改。
3.找到at32_msp_emac_init(void *instance)并根据自己的板卡修改。
4.配置iwIp组件。
1)使能以太网物理层设备驱动程序
2)配置如下,注意红线框住处不能使能,否则IPV4配置无法生效。
5.编译报错。error: 'PHY_CONTROL_REG' undeclared (first use in this function); did you mean 'PHY_BASIC_CONTROL_REG'?
问题发现:
经查,我所使用的RT-Thread项目中,虽board.h头文件中存在LAN8720头文件的宏定义,但该工程中并没有对LAN8720相关的寄存器做定义,以至于上图报错。
解决方法:
将下列代码复制到drv_emac.h中。如下图,复制后编译即可(下列代码可能因网页格式问题,复制进RT-thread中会报错,需要将空格删除)。
#elif defined (PHY_USING_LAN8720A)
#define PHY_CONTROL_REG (0x00)/*!< basic mode control register 1 等价于 basic_control_reg*/
#define PHY_STATUS_REG (0x01)/*!< basic mode status register 1 等价于 PHY_BASIC_STATUS_REG*/
#define PHY_SPECIFIED_CS_REG (0x1FU)/*!< phy status register 22 读取这个寄存器, 获取连接状态*/
/* phy control register */
#define PHY_AUTO_NEGOTIATION_BIT (0x1000)/*!< enable auto negotiation 基础控制寄存器上, 写了这个寄存器位, 就代表使能自动协商了 */
// #define PHY_LOOPBACK_BIT (0x4000) /*!< enable loopback */
#define PHY_RESET_BIT (0x8000)/*!< reset phy 软件复位的寄存器位, 对的*/
/* phy status register */
#define PHY_LINKED_STATUS_BIT (0x0004)/*!< link status 基础状态寄存器读取来的, 0x4*/
#define PHY_NEGO_COMPLETE_BIT (0x0020)/*!< auto negotiation complete 基础状态寄存器读取来的, 没问题 */
#define PHY_DUPLEX_MODE (1<<4) //(0x0004)/*!< x---- full duplex mode 特别状态寄存器, 2位 10MBbit 3 位 100m , 4位表示半全双工 */
#define PHY_SPEED_MODE (1<<2) //)(0x0002)/*!< -10 mbps 标识位 51页 */
/* the phy interrupt source flag register. */
#define PHY_INTERRUPT_FLAG_REG 0x1DU /* 数据手册上为 interrupt souce register 第42页 */
// #define PHY_LINK_CHANGE_FLAG (1<<13) 8720 没有用到这玩意
/* the phy interrupt control register. */
//#define PHY_INTERRUPT_CTRL_REG 0x11U 没有这玩意, 只有dp83848 有
// #define PHY_INTERRUPT_EN ((1<<0)|(1<<1))//没有这玩意, 只有dp83848 有
/* the phy interrupt mask register. */
#define PHY_INTERRUPT_MASK_REG 0x1EU //
#endif
复制进来后如下图。
6.此时编译无问题,配置项仍不全面,须添加下图代码配置。
7.烧录运行,ifconfig命令使用参考
love潇潇熊的博客
rt-thread studio中添加lan8720网络驱动_rt-thread studio cube mx lan8720a-CSDN博客。