使用STM32CubeMX+keil实现
STM32CubeMX配置
- 使用SPI4进行全双工通讯,对SPI4进行设置
- 对使用到的引脚进行重命名
- 对其他几个IO引脚进行配置
- 点击GENERATE CODE生成keil工程
keil代码
- 在工程中添加socket.c,w5500.c,wizchip_conf.c并把对应的头文件加入到包含路径中
- wizchip_conf.c中修改这一部分可以改变板卡端的ip,gw等网络配置
wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc,0x11, 0x11, 0x11},
.ip = {192,168,72,10},
.sn = {255,255,255,0},
.gw = {192, 168, 72, 1},
.dns = {8,8,8,8},
.dhcp = NETINFO_DHCP };
- 初始化芯片参数这部分代码会检测网线的物理连接,如果初始化进行到这一步的时候还没把网线插进网口程序会跑进死循环
//初始化芯片参数
void ChipParametersConfiguration(void)
{
uint8_t tmp;
uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};
if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1)
{
while(1);
}
//注销到后面的代码不对物理连接进行检测
do{
if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1)
{
while(1);
}
}while(tmp == PHY_LINK_OFF);
}
- 初始化函数,在完成对SPI外设的初始化之后调用
void W5500_ChipInit(void)
{
W5500_RESET();
reg_wizchip_cris_cbfunc(wizchip_cris_enter, wizchip_cris_exit); //注册临界函数
reg_wizchip_cs_cbfunc(wizchip_cs_select, wizchip_cs_deselect); //注册SPI片选函数
reg_wizchip_spi_cbfunc(wizchip_spi_readbyte, wizchip_spi_writebyte); //注册SPI读写函数
ChipParametersConfiguration();//初始化芯片
NetworkParameterConfiguration();//初始化网络参数配置 MAC IP等
}
- 编写代码时,在进入while(1)循环之前,调用W5500_ChipInit()完成对网口的初始化。
- 在while(1)循环中,获取套接字不同的状态编写状态机
switch (getSn_SR(0))//获取套接字状态
{
case SOCK_CLOSED: //socket处于关闭状态
socket(0,Sn_MR_TCP,5500,Sn_MR_ND);/*打开socket*/ /**< No Delayed Ack(TCP) flag */
break; //socket关闭状态
case SOCK_INIT: //socket处于初始化完成(打开)状态
listen(0); //socket建立监听
break; //监听本地端口,等待客户端连接
case SOCK_LISTEN:
LED1_TOGGLE;//监听时指示灯闪烁
HAL_Delay(500);
break;
case SOCK_ESTABLISHED: //socket处于连接建立状态
if (getSn_IR(0) & Sn_IR_CON)
{
setSn_IR(0, Sn_IR_CON); //Sn_IR的CON位置1,通知W5500连接已建立 清除接收中断标志位
}
uint8_t len = getSn_RX_RSR(0); //定义len为已接收数据的长度
if(len>0)
{
recv(0, (uint8_t *)rxbuf, len); //获取上位机发送指
HAL_Delay(10);
send(0,rxbuf,len);//将收到的消息返回客户端
}
break;
case SOCK_CLOSE_WAIT: //当socket处于等待关闭的状态时
disconnect(0); //socket处于等待关闭状态
break;