W5500 Stuck at OPEN command, CR not retrun to zero.

I am using the FPGA(x7a200t) to config W5500, the target is to using w5500 send UDP packet.
now I am using the Microblaze to config W5500, at present, i have successfully config the mac, local ip, subnet, gateway. And polling the PHYCFGR untill it shows the link status is “LINK UP”.(it proves the SPI interface works well).and then I set the 16 RX\TX memory. The General Register is set done.(keep other reg default).
the flow above is show as below

int W5500Init()
{
	u8 v = 0;
	// hardware reset
	XGpio_DiscreteWrite(&gpioInst, 1, ~RST_N_W5500_PIN); // rst_n is active low
	sleep(1);											 // wait for 1ms (should greater than 500us as the datasheet show)
	XGpio_DiscreteWrite(&gpioInst, 1, RST_N_W5500_PIN);

	// software reset
	W5500WriteByte(MR_ADDR, GENERAL_REG, 0x80); // reset the reg

	// config the w5500.
	W5500Transfer(SHAR_ADDR, GENERAL_REG, RWB_W, OM_VDM, mac, sizeof(mac));		   // {0x00, 0x08, 0xdc, 0x01, 0x02, 0x03};
	W5500Transfer(SUBR_ADDR, GENERAL_REG, RWB_W, OM_VDM, subnet, sizeof(subnet));  //{192, 168, 1, 30};
	W5500Transfer(GAR_ADDR, GENERAL_REG, RWB_W, OM_VDM, gateway, sizeof(gateway)); // {255, 255, 255, 0};
	W5500Transfer(SIPR_ADDR, GENERAL_REG, RWB_W, OM_VDM, lip, sizeof(lip));		   //{192, 168, 1, 1};
	sleep(1); // sleep 1 second
	v = W5500ReadByte(PHYCFGR_ADDR, GENERAL_REG); // polling phycfgr
	while ((v & 0x01) == 0) // it will break the loop if link up
	{
		v = W5500ReadByte(PHYCFGR_ADDR, GENERAL_REG); // phycfgr
	}

	// Init memory, i want to use socket 0 only
	W5500WriteByte(SN_RXBUF_SIZE_ADDR, SOCKET1_REG, 0);	 // rx buf size
	W5500WriteByte(SN_TXBUF_SIZE_ADDR, SOCKET1_REG, 0);	 // tx buf size
	W5500WriteByte(SN_RXBUF_SIZE_ADDR, SOCKET2_REG, 0);	 // rx buf size
	W5500WriteByte(SN_TXBUF_SIZE_ADDR, SOCKET2_REG, 0);	 // tx buf size
	W5500WriteByte(SN_RXBUF_SIZE_ADDR, SOCKET3_REG, 0);	 // rx buf size
	W5500WriteByte(SN_TXBUF_SIZE_ADDR, SOCKET3_REG, 0);	 // tx buf size
	W5500WriteByte(SN_RXBUF_SIZE_ADDR, SOCKET4_REG, 0);	 // rx buf size
	W5500WriteByte(SN_TXBUF_SIZE_ADDR, SOCKET4_REG, 0);	 // tx buf size
	W5500WriteByte(SN_RXBUF_SIZE_ADDR, SOCKET5_REG, 0);	 // rx buf size
	W5500WriteByte(SN_TXBUF_SIZE_ADDR, SOCKET5_REG, 0);	 // tx buf size
	W5500WriteByte(SN_RXBUF_SIZE_ADDR, SOCKET6_REG, 0);	 // rx buf size
	W5500WriteByte(SN_TXBUF_SIZE_ADDR, SOCKET6_REG, 0);	 // tx buf size
	W5500WriteByte(SN_RXBUF_SIZE_ADDR, SOCKET7_REG, 0);	 // rx buf size
	W5500WriteByte(SN_TXBUF_SIZE_ADDR, SOCKET7_REG, 0);	 // tx buf size
	W5500WriteByte(SN_RXBUF_SIZE_ADDR, SOCKET0_REG, 16); // rx buf size
	W5500WriteByte(SN_TXBUF_SIZE_ADDR, SOCKET0_REG, 16); // tx buf size

	return 0;
}

I want only use the socket0 , here is the code

void W5500ConfigSocket(u8 socketBsb)
{
	u8 v = 0;
	v = W5500ReadByte(SN_SR_ADDR, socketBsb); // v == 0x75 weird value
	W5500WriteByte(SN_CR_ADDR, socketBsb, CLOSE); // set CR to close

	v = W5500ReadByte(SN_CR_ADDR, socketBsb);	
	while (v != 0) // polling the CR untill it return to zeros. here it stucks
	{
		v = W5500ReadByte(SN_CR_ADDR, socketBsb);
	}
	W5500WriteByte(SN_IR_ADDR, socketBsb, 0xFF); // clear interupt
	W5500WriteByte(SN_MR_ADDR, socketBsb, MR_UDP); // set udp mode

	u8 destIp[] = {192, 168, 1, 124};
	W5500Write2BytesSwapEndian(SN_PORT_ADDR, socketBsb, 8090);
	W5500WriteByte(SN_CR_ADDR, socketBsb, OPEN);// if I do not set the CR to close first, rather to set OPEN first, it also stucks, not return to zeros
	sleep(1);
	v = W5500ReadByte(SN_CR_ADDR, socketBsb); 
	while (v != 0)
	{
		v = W5500ReadByte(SN_CR_ADDR, socketBsb);
	}
	while ( v == 0)
	{
		v = W5500ReadByte(SN_SR_ADDR, socketBsb);
	}
	W5500WriteBuffer(SN_DIPR_ADDR, socketBsb, destIp);
	W5500Write2BytesSwapEndian(SN_DPORT_ADDR, socketBsb, 8888);
	W5500Write2BytesSwapEndian(SN_MSSR_ADDR, socketBsb, 1470);
	W5500WriteByte(SN_TTL_ADDR, socketBsb, 0x80);
	return;
}

Is there any flow wrong?
why the CR not return to zero, i have search others topic also refer to this. Is it a hardware error?

The first issue is you must wait until software reset is complete by polling bit 7 of MR.