以太网PHY芯片SR8201的GD32F450驱动
一 :标题采用RMII模式,接线方式为:
SR8201F | 引脚号 | GD32F450 |
---|---|---|
RXD0 | 9 | PC4 |
RXD1 | 10 | PC5 |
TXC | 15 | PA1 |
TXD0 | 16 | PB12 |
TXD1 | 17 | PB13 |
TXEN | 20 | PB11 |
MDC | 22 | PC1 |
MDIO | 23 | PA2 |
CRS | 26 | PA7 |
二 :TXC时钟信号
TXC引脚需要接入一个50M晶振提供时钟信号:
如果不想用这个晶振可以通过单片机输出时钟信号。需要以下改动
单片机的晶振换成25M。
使用单片机PA8输出时钟信号,接到PA1和TXC上。
在给出历程的"gd32f4xx_enet_eval.c"137行已经屏蔽。
gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_8);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ,GPIO_PIN_8);
/* enable SYSCFG clock */
rcu_periph_clock_enable(RCU_SYSCFG);
三 :IP和端口号设置
IP在“main.h”中定义:
#define IP_ADDR0 192
#define IP_ADDR1 168
#define IP_ADDR2 1
#define IP_ADDR3 30
#define IP_S_ADDR0 192
#define IP_S_ADDR1 168
#define IP_S_ADDR2 1
#define IP_S_ADDR3 35
/* net mask */
#define NETMASK_ADDR0 255
#define NETMASK_ADDR1 255
#define NETMASK_ADDR2 255
#define NETMASK_ADDR3 0
/* gateway address */
#define GW_ADDR0 192
#define GW_ADDR1 168
#define GW_ADDR2 1
#define GW_ADDR3 1
端口号在“tcp_client_init”函数中设置:
void tcp_client_init(void)
{
struct tcp_pcb *pcb;
struct ip_addr ipaddr;
IP4_ADDR(&ipaddr, IP_S_ADDR0, IP_S_ADDR1, IP_S_ADDR2, IP_S_ADDR3);
/* create a new TCP control block */
pcb = tcp_new();
pcb_Free = pcb;
/* assign to the new pcb a local IP address and a port number */
/* using IP_ADDR_ANY allow the pcb to be used by any local interface */
if(ERR_USE != tcp_bind(pcb, IP_ADDR_ANY, 8087)){
/* Specify the function to be called when a connection is established */
tcp_connect(pcb, &ipaddr, 8087, tcp_client_connected);
}else{
printf("connect is still alive \r\n ");
memp_free(MEMP_TCP_PCB, pcb);
}
}
四 :程序和原理图
上传的程序和原理图需要审核,过两天贴出来。
原理图下载链接
源代码下载链接
来源:oschina
链接:https://my.oschina.net/u/4278795/blog/4329795