CURRENT ISSUE

Contests

bottom corner

Feature Article



Issue #208 November 2007
Analog Techniques
iEthernet Bootcamp
Get Started with the W5100

by Fred Eady

Start | WIZnet W5100 | Build A Development Board | WIZnet 5100 Garage Code| Congratulations! | Sources & PDF

BUILD A DEVELOPMENT BOARD

Listing 3—Think about it. All you ever do with any communications device is receive and transmit. I pulled the logic behind this code from the pseudocode flow in the W5100’s datasheet.

//SOCKET INTI******************************************************
do{
wr_wiz_reg(Sn_MR_UDP,Sn_MR(0));	//protocol = UDP
wr_wiz_reg(0x00,Sn_PORT0(0));	//well-known ECHO port
wr_wiz_reg(0x07,Sn_PORT1(0));
wr_wiz_reg(Sn_CR_OPEN,Sn_CR(0));	//give the open command
if(rd_wiz_reg(Sn_SR(0)) != SOCK_UDP)	//wait for the socket to come online
	wr_wiz_reg(Sn_CR_CLOSE,Sn_CR(0));
}while(rd_wiz_reg(Sn_SR(0)) != SOCK_UDP);

//RECEIVE**********************************************************
do{
//look for incoming UDP datagrams
i16 = rd_wiz_reg(Sn_IR(0));
}while(i16 == 0);
wr_wiz_reg(0x04,Sn_IR(0));
//get the datagram size
hi_byte = rd_wiz_reg(Sn_RX_RSR0(0));
lo_byte = rd_wiz_reg(Sn_RX_RSR1(0));
get_size = make16(hi_byte,lo_byte);
//get the datagram's buffer offset 
hi_byte = rd_wiz_reg(Sn_RX_RD0(0));
lo_byte = rd_wiz_reg(Sn_RX_RD1(0));
get_offset = make16(hi_byte,lo_byte) & gS0_RX_MASK;
//calculate the datagram's starting buffer address
get_start_address = gS0_RX_BASE + get_offset;
//UDP header size
header_size = 8;
//store the UDP header information
addri = get_start_address;
for(i8=0;i8<header_size;++i8)
{
	packet[ip_destaddr+i8] = rd_wiz_reg(addri++);
	++get_offset;
}
//store the UDP data
get_start_address = gS0_RX_BASE + get_offset;
udp_data_size = get_size - header_size;
addri = get_start_address;
for(i8=0;i8<udp_data_size;++i8)
{
	packet[UDP_data+i8] = rd_wiz_reg(addri++);
	++get_offset;
}
//update the receive buffer pointers
wr_wiz_reg(Sn_CR_RECV,Sn_CR(0));

//TRANSMIT*********************************************************
//load destination IP address
addri = Sn_DIPR0(0);
for(i8=0;i8<4;++i8)
	wr_wiz_reg(packet[ip_destaddr+i8],addri++);
//load destination port address
addri = Sn_DPORT0(0);
for(i8=0;i8<2;++i8)
	wr_wiz_reg(packet[UDP_srcport+i8],addri++);
//get transmit buffer offset
hi_byte = rd_wiz_reg(Sn_TX_WR0(0));
lo_byte = rd_wiz_reg(Sn_TX_WR1(0));
get_offset = make16(hi_byte,lo_byte) & gS0_TX_MASK;   
//calculate transmit data buffer start address
get_start_address = gS0_TX_BASE + get_offset;     
//load data into transmit buffer
addri = get_start_address;
for(i8=0;i8<udp_data_size;++i8)
{
	wr_wiz_reg(packet[UDP_data+i8],addri++);
	++get_offset;
}
//update transmit buffer pointer
wr_wiz_reg((make8(get_offset,1)),Sn_TX_WR0(0));
wr_wiz_reg((make8(get_offset,0)),Sn_TX_WR1(0));
//send data
wr_wiz_reg(Sn_CR_SEND,Sn_CR(0));
while(rd_wiz_reg(Sn_CR(0)));
 


bottom corner