W5500以太网模块官方驱动移植
W5500驱动移植
·
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通,完成驱动移植
更多推荐
所有评论(0)