STM32CubeMx下LWIP教程(一)-PHY硬件层搭建

关于LWIP的PHY搭建,采用的PHY芯片为LAN8720A,RMII模式。
关于硬件连接部分采用的是原子的板子F407,硬件连接如下:
STM32CubeMx下LWIP教程(一)-PHY硬件层搭建_第1张图片
注意:LAN8720A 可以通过 PHYAD0 引脚来配置,该引脚与 RXER 引脚复用,芯片内部自带下拉电阻,当硬复位结束后, LAN8720A 会读取该引脚电平,作为器件的 SMI 地址,接下拉电阻时(浮空也可以,因为芯片内部自带了下拉电阻),设置 SMI 地址为 0,当外接上拉电阻后,可以设置为 1。本硬件RXER引脚浮空,其PHY芯片地址为0

关于SMT32CubeMx引脚时钟等配置根据实际情况配置即可,不在此进行赘述;
点开ETH配置中的Parameter Setting选项卡,配置如下:
STM32CubeMx下LWIP教程(一)-PHY硬件层搭建_第2张图片
在这个选项卡中,只需按照实际填写PHY地址即可,我用的PHY芯片地址为0,在此输入0即可;
点开ETH配置中的Advanced Parameters选项卡,选择如下:
STM32CubeMx下LWIP教程(一)-PHY硬件层搭建_第3张图片
由于STM32CubeMx系统默认的是,LAN8742A,因此我们选择user PHY配置LAN8720A;
其配置如下:
STM32CubeMx下LWIP教程(一)-PHY硬件层搭建_第4张图片
关于PHY芯片的配置项不多,多数采用默认参数即可,需要更改的已用红线标示如来:
PHY Address Value:就是我们在之前设置的PHY芯片地址;
PHY Name:这个仅是一个标志符,可以随便设置,在这里我设置的是LAN8720;
PHY Special Control/Status Register Offset:可以根据芯片手册查到,如下:
STM32CubeMx下LWIP教程(一)-PHY硬件层搭建_第5张图片
注意:该寄存器的地址是十进制的31
同样的,关于PHY Speed mask和PHY Duplex mask寄存器的设置如下:
STM32CubeMx下LWIP教程(一)-PHY硬件层搭建_第6张图片
其中Bits4:2就包含了PHY Speed mask和PHY Duplex mask的掩码,
Bits2代表两种速度10MB/s和100MB/s;PHY Speed mask(0x0004)
Bits4代表两种工作方式半双工和全双工;PHY Duplex mask(0x0010)

然后开启ETH的中断即可,采用默认优先级即可;

LWIP配置如下:
STM32CubeMx下LWIP教程(一)-PHY硬件层搭建_第7张图片
其余保持默认即可

最后在生成的代码中,ETH硬件初始化部分加入对PHY硬件复位的代码:(注意:因为硬件设计,才在此处加入此代码,根据实际情况添加
STM32CubeMx下LWIP教程(一)-PHY硬件层搭建_第8张图片

添加如下代码:

/* 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的属性如下:
STM32CubeMx下LWIP教程(一)-PHY硬件层搭建_第9张图片
最后使用命令行ping目标板,如下:
STM32CubeMx下LWIP教程(一)-PHY硬件层搭建_第10张图片
至此就完成了PHY芯片的测试,LWIP正常工作;

写在后面的话,关于其他PHY芯片的配置于此类似,但需注意各个芯片寄存器地址的差异;

转载请注明原博客地址,翻版必究;

你可能感兴趣的:(stm32)