关于LWIP的PHY搭建,采用的PHY芯片为LAN8720A,RMII模式。
关于硬件连接部分采用的是原子的板子F407,硬件连接如下:
注意:LAN8720A 可以通过 PHYAD0 引脚来配置,该引脚与 RXER 引脚复用,芯片内部自带下拉电阻,当硬复位结束后, LAN8720A 会读取该引脚电平,作为器件的 SMI 地址,接下拉电阻时(浮空也可以,因为芯片内部自带了下拉电阻),设置 SMI 地址为 0,当外接上拉电阻后,可以设置为 1。本硬件RXER引脚浮空,其PHY芯片地址为0
关于SMT32CubeMx引脚时钟等配置根据实际情况配置即可,不在此进行赘述;
点开ETH配置中的Parameter Setting选项卡,配置如下:
在这个选项卡中,只需按照实际填写PHY地址即可,我用的PHY芯片地址为0,在此输入0即可;
点开ETH配置中的Advanced Parameters选项卡,选择如下:
由于STM32CubeMx系统默认的是,LAN8742A,因此我们选择user PHY配置LAN8720A;
其配置如下:
关于PHY芯片的配置项不多,多数采用默认参数即可,需要更改的已用红线标示如来:
PHY Address Value:就是我们在之前设置的PHY芯片地址;
PHY Name:这个仅是一个标志符,可以随便设置,在这里我设置的是LAN8720;
PHY Special Control/Status Register Offset:可以根据芯片手册查到,如下:
注意:该寄存器的地址是十进制的31
同样的,关于PHY Speed mask和PHY Duplex mask寄存器的设置如下:
其中Bits4:2就包含了PHY Speed mask和PHY Duplex mask的掩码,
Bits2代表两种速度10MB/s和100MB/s;PHY Speed mask(0x0004)
Bits4代表两种工作方式半双工和全双工;PHY Duplex mask(0x0010)
然后开启ETH的中断即可,采用默认优先级即可;
LWIP配置如下:
其余保持默认即可
最后在生成的代码中,ETH硬件初始化部分加入对PHY硬件复位的代码:(注意:因为硬件设计,才在此处加入此代码,根据实际情况添加)
添加如下代码:
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx_hal.h"
#include "lwip.h"
#include "gpio.h"
/* USER CODE BEGIN Includes */
#include "tcp.h"
#include "stats.h"
/* USER CODE END Includes */
static struct tcp_pcb *tcp_echoserver_pcb;
void tcp_echoserver_init(void);
static err_t tcp_echoserver_accept(void *arg,struct tcp_pcb *newpcb,err_t err);
static err_t tcp_echoserver_recv(void *arg,struct tcp_pcb *tpcb,struct pbuf *p,err_t err);
void tcp_echoserver_init(void)
{
err_t err;
tcp_echoserver_pcb=tcp_new();
if(tcp_echoserver_pcb!=NULL)
{
err=tcp_bind(tcp_echoserver_pcb,IP_ADDR_ANY,7);
if(err==ERR_OK)
{
tcp_echoserver_pcb=tcp_listen(tcp_echoserver_pcb);
tcp_accept(tcp_echoserver_pcb,tcp_echoserver_accept);
}
else
{
memp_free(MEMP_TCP_PCB,tcp_echoserver_pcb);
}
}
}
static err_t tcp_echoserver_accept(void *arg,struct tcp_pcb *newpcb,err_t err)
{
tcp_recv(newpcb,tcp_echoserver_recv);
return ERR_OK;
}
static err_t tcp_echoserver_recv(void *arg,struct tcp_pcb *tpcb,struct pbuf *p,err_t err)
{
tcp_write(tpcb,p->payload,p->len,1);
pbuf_free(p);
return ERR_OK;
}
/* USER CODE END 0 */
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_LWIP_Init();
/* USER CODE BEGIN 2 */
tcp_echoserver_init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
MX_LWIP_Process();
}
/* USER CODE END 3 */
}
将程序下载至目标板,连接网线至电脑;
更改电脑IPV4的属性如下:
最后使用命令行ping目标板,如下:
至此就完成了PHY芯片的测试,LWIP正常工作;
写在后面的话,关于其他PHY芯片的配置于此类似,但需注意各个芯片寄存器地址的差异;
上一篇:STM32Cubemx下实现通用定时器微秒级延时
下一篇:Stm32cubeMX生成配置工程的例子和过程记录
推荐阅读最新更新时间:2024-03-16 16:00
设计资源 培训 开发板 精华推荐
- 微灵医疗李骁健:脑机接口技术正在开启意识与AI融合的新纪元
- USB Type-C® 和 USB Power Delivery:专为扩展功率范围和电池供电型系统而设计
- 景昱医疗耿东:脑机接口DBS治疗技术已实现国产替代
- 首都医科大学王长明:针对癫痫的数字疗法已进入使用阶段
- 非常见问题解答第223期:如何在没有软启动方程的情况下测量和确定软启动时序?
- 兆易创新GD25/55全系列车规级SPI NOR Flash荣获ISO 26262 ASIL D功能安全认证证书
- 新型IsoVu™ 隔离电流探头:为电流测量带来全新维度
- 英飞凌推出简化电机控制开发的ModusToolbox™电机套件
- 意法半导体IO-Link执行器电路板为工业监控和设备厂商带来一站式参考设计
- Melexis采用无磁芯技术缩小电流感测装置尺寸