flonas
August 1, 2017, 1:37pm
1
Hello,
I have a W5500 configured as a server and the PC is the client. I am having some problems with sending data over tcp and I want to make sure that I compute the Write Pointer properly. Since the Datasheet for the W5500 isn’t so explicit, I took the W5200 Datasheet and tried to set the Write Poiner. The code is the following:
// Socket 0 is used
uint32_t ptr = getSn_TX_WR(socket_number);
uint32_t dst_mask = ptr & get_TxMASK(socket_number); // get_TxMASK(0) returns 0x1FFF
uint32_t dst_ptr = get_TxBASE(socket_number) + dst_mask;// get_TxBASE(0) returns 0x8000
Is this the right way to compute the destination pointer(dst_ptr ) or am I doing something wrong ?
Thank you !
hello, flonas
W5500 has different memory structure from W5200.
please refer the ioLibrary for W5xxx.
ioLibrary_Driver can be used for the application design of WIZnet TCP/IP chips as W5500, W5300, W5200, W5100 W5100S. - GitHub - Wiznet/ioLibrary_Driver: ioLibrary_Driver can be used for the applica...
You can check the W5500 memory access.
// refer W5500 memory map
#define WIZCHIP_TXBUF_BLOCK(n) (2+4*n)
// calculate physical memory address and 'addrsel' is for spi interface address and control phase
uint16_t ptr = (WIZCHIP_READ(Sn_TX_WR(n)) >> 8) + WIZCHIP_READ(Sn_TX_WR(n)+1) ;
uint32_t addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_TXBUF_BLOCK(n) << 3);
// copy data to tx memory
WIZCHIP_WRITE_BUF(addrsel, data, len);
// increase sn_tx_wr
ptr += len;
WIZCHIP_WRITE(Sn_TX_WR(n), ptr);
// send command
WIZCHIP_WRITE(Sn_CR(n), Sn_CR_SEND);
// send command done
while(WIZCHIP_READ(Sn_CR(n)));
Thank you
lawrence