1.首先,在github上下载W5500官方驱动数据包,点击下载ioLibrary_Driver 文件

2.将解压文件夹中的此六个文件放入工程路径,添加工程路径的方法见本人之前博客

添加好的工程目录如下所示

3.进行GPIO SPI初始化等操作,此处选用硬件SPI1接口,可根据自己的需求修改,头文件代码如下:

#ifndef __SPI_H
#define __SPI_H	 
#include "sys.h"

#define W5500_CS_1()              GPIO_SetBits(GPIOA,GPIO_Pin_4) //将CS引脚设置为高电平
#define W5500_CS_0()              GPIO_ResetBits(GPIOA,GPIO_Pin_4) //将CS引脚设置为低电平

#define W5500_RST_1()             GPIO_SetBits(GPIOC,GPIO_Pin_4) 
#define W5500_RST_0()             GPIO_ResetBits(GPIOC,GPIO_Pin_4) 

#define W5500_SCK_1()             GPIO_SetBits(GPIOA,GPIO_Pin_5) 
#define W5500_SCK_0()             GPIO_ResetBits(GPIOA,GPIO_Pin_5) 
#define W5500_MISO_1()            GPIO_SetBits(GPIOA,GPIO_Pin_6) 
#define W5500_MISO_0()            GPIO_ResetBits(GPIOA,GPIO_Pin_6) 
#define W5500_MOSI_1()            GPIO_SetBits(GPIOA,GPIO_Pin_7) 
#define W5500_MOSI_0()            GPIO_ResetBits(GPIOA,GPIO_Pin_7)

void W5500_SPI_Init(void);	//初始化SPI1口
void SPI_WriteByte(uint8_t TxData); //写1个字节数据到SPI总线
uint8_t SPI_ReadByte(void); //从SPI总线读取1个字节数据
void SPI_CrisEnter(void); //进入临界区
void SPI_CrisExit(void);
void SPI_CS_Select(void); //CS片选信号
void SPI_CS_Deselect(void);
void W5500_Register(void); //回调注册函数
void W5500_Reset(void);
void W5500_Network_Init(void); //配置网络参数

int W5500_Init(void); 
int W5500_Chip_Init(void);
void W5500_Phy_Init(void);

#endif

.c文件如下

#include "stm32f10x.h"
#include "spi.h"
#include "wizchip_conf.h"

//spi初始化
void W5500_SPI_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
	SPI_InitTypeDef SPI_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1|RCC_APB2Periph_AFIO,ENABLE); 
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	W5500_CS_1(); 
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	W5500_RST_1(); 
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	W5500_SCK_1();
	W5500_MISO_1();
	W5500_MOSI_1();
	
	/*配置SPI1*/
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
	SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI1,&SPI_InitStructure);
	
	SPI_Cmd(SPI1,ENABLE); 
}

void SPI_WriteByte(uint8_t TxData)
{
    while ( ( SPI1->SR & SPI_I2S_FLAG_TXE ) == 0 );
	SPI1->DR = TxData; 
}

uint8_t SPI_ReadByte(void)
{
    while ( ( SPI1->SR & SPI_I2S_FLAG_TXE ) == 0 ); 
    SPI1->DR = 0xFF; 
    while ( ( SPI1->SR & SPI_I2S_FLAG_RXNE ) == 0 ); 
    return SPI1->DR;
}


void SPI_CrisEnter(void)
{
    __set_PRIMASK(1);
}

void SPI_CrisExit(void)
{
    __set_PRIMASK(0);
}

void SPI_CS_Select(void)
{
    W5500_CS_0();
}

void SPI_CS_Deselect(void)
{
    W5500_CS_1();
}

void W5500_Register(void)
{
    reg_wizchip_cris_cbfunc(SPI_CrisEnter,SPI_CrisExit);
	reg_wizchip_cs_cbfunc(SPI_CS_Select,SPI_CS_Deselect);
	reg_wizchip_spi_cbfunc(SPI_ReadByte,SPI_WriteByte);
}

void W5500_Reset(void)
{
    W5500_RST_0();
	delay_ms(50);
	W5500_RST_1();
	delay_ms(10);
}

void W5500_Network_Init(void)
{
   uint8_t chipid[6];
   wiz_NetInfo gWIZNETINFO; //Network Information for WIZCHIP
   wiz_NetTimeout w_NetTimeout;
	
   uint8_t mac[6] = {0x00, 0x08, 0xdc, 0x11, 0x11, 0x11}; 
   uint8_t ip[4] = {192, 168, 86, 150}; 
   uint8_t sn[4] = {255, 255, 255, 0}; 
   uint8_t gw[4] = {192, 168, 86, 1}; 
   uint8_t dns[4] = {8, 8, 8, 8}; /
   
   memcpy(gWIZNETINFO.mac,mac,6); 
   memcpy(gWIZNETINFO.ip,ip,4);
   memcpy(gWIZNETINFO.sn,sn,4);
   memcpy(gWIZNETINFO.gw,gw,4);
   memcpy(gWIZNETINFO.dns,dns,4);
   gWIZNETINFO.dhcp = NETINFO_STATIC; 
   
   ctlnetwork(CN_SET_NETINFO,(void*)&gWIZNETINFO);
   ctlnetwork(CN_GET_NETINFO,(void*)&gWIZNETINFO);
   
   
   ctlwizchip(CW_GET_ID,(void*)chipid); 
   printf("\r\n=== %s NET CONF ===\r\n",(char*)chipid);
   printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2],
           gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]);
   printf("IP: %d.%d.%d.%d\r\n", gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);
   printf("GW: %d.%d.%d.%d\r\n", gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);
   printf("SN: %d.%d.%d.%d\r\n", gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);
   printf("DNS: %d.%d.%d.%d\r\n",gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);
   printf("--------------------\r\n");
   
   w_NetTimeout.retry_cnt = 50;
   w_NetTimeout.time_100us = 1000;
   wizchip_settimeout(&w_NetTimeout);
}

int W5500_Chip_Init(void)
{
     return wizchip_init(0, 0);
}

void W5500_Phy_Init(void)
{
    wiz_PhyConf phyconf; 
	phyconf.by = PHY_CONFBY_SW;
    phyconf.duplex = PHY_DUPLEX_FULL;
    phyconf.mode = PHY_MODE_AUTONEGO;
    phyconf.speed = PHY_SPEED_10;
    ctlwizchip(CW_SET_PHYCONF,(void*)&phyconf);
}

int W5500_Init(void)
{
	W5500_SPI_Init();
    W5500_Reset(); 
	
	W5500_Register();
	
	if(W5500_Chip_Init()!= 0)
	{
        return -1;
    }
	W5500_Phy_Init();
	W5500_Network_Init();
	return 0;
}

4.在main主函数中进行调用

int main(void)
{   
    int ret;
	uint8_t dest_ip[4] = {192, 168, 86, 99};
    uint16_t dest_port = 8080;
	uint8_t dataBuffer[DATA_BUF_SIZE] = {0x0};
    delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2 
    位响应优先级
	uart_init(115200);	 	//串口初始化为 115200
    ret = W5500_Init();
	if(ret!=0)
	{
	    printf("W5500 init fail,ret is %d\r\n",ret);
	}
	else
	{
		printf("W5500 init success!\r\n");
	}
    while(1)
    {
       loopback_tcpc(0x0, dataBuffer, dest_ip, dest_port);
       LED0 = 0;
       delay_ms(50);
       LED0 = 1;
       delay_ms(50);
    }	
}

5.打开cmd,输入 ping +IP地址,回车,PING通,完成驱动移植

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐