Hi,
I am using the example given for pic18f45k22 to implement the server in the pic18f4520. i was not getting any error while, but server was not starting when controller was programmed.
Here is the code:
#include "Wizchip_Conf.h"
#include "W5500.h"
#include "Socket.h"
#include <stdio.h>
// ETH WIZ click connections
sbit Wizchip_Rst at LATE1_bit;
sbit Wizchip_CS at LATE0_bit;
sbit Wizchip_Rst_Direction at TRISE1_bit;
sbit Wizchip_CS_Direction at TRISE0_bit;
// end of ETH WIZ click connections
// Socket & Port number definition
#define SOCK_ID_TCP 0
#define SOCK_ID_UDP 1
#define PORT_TCP 5000
#define PORT_UDP 10001
#define DATA_BUF_SIZE 1024
uint8_t gDATABUF[DATA_BUF_SIZE];
int32_t WebServer(uint8_t sn, uint8_t* buf, uint16_t port);
char proc_http(uint8_t sn, char * buf);
void sendHeader(uint8_t sn);
void sendData(uint8_t sn);
uint16_t calcu_len(void);
volatile wiz_NetInfo gWIZNETINFO =
{
{0x00, 0x14, 0xA3, 0x72, 0x17, 0x3f}, // Source Mac Address
{192, 168, 0, 111 }, // Source IP Address
{255, 255, 255, 0}, // Subnet Mask
{192, 168, 0, 1}, // Gateway IP Address
{8, 8, 8, 8}, // DNS server IP Address
NETINFO_STATIC
};
uint8_t destip[4] = {192, 168, 0, 103};
uint16_t destport = 5000;
volatile wiz_PhyConf phyConf =
{
PHY_CONFBY_HW, // PHY_CONFBY_SW
PHY_MODE_MANUAL, // PHY_MODE_AUTONEGO
PHY_SPEED_10, // PHY_SPEED_100
PHY_DUPLEX_FULL, // PHY_DUPLEX_HALF
};
volatile wiz_NetInfo pnetinfo;
// brief Call back function for WIZCHIP select.
void CB_ChipSelect(void)
{
Wizchip_CS = 0;
}
// brief Call back function for WIZCHIP deselect.
void CB_ChipDeselect(void)
{
Wizchip_CS = 1;
}
// brief Callback function to read byte usig SPI.
uint8_t CB_SpiRead(void)
{
return SPI1_Read(0xAA);
}
// brief Callback function to write byte usig SPI.
void CB_SpiWrite(uint8_t wb)
{
SPI1_Write(wb);
}
// brief Handle TCP socket state.
void TCP_Server(void)
{
int32_t ret;
uint16_t size = 0, sentsize = 0;
// Get status of socket
switch(getSn_SR(SOCK_ID_TCP))
{
// Connection established
case SOCK_ESTABLISHED :
{
// Check interrupt: connection with peer is successful
if(getSn_IR(SOCK_ID_TCP) & Sn_IR_CON)
{
// Clear corresponding bit
setSn_IR(SOCK_ID_TCP,Sn_IR_CON);
}
// Get received data size
if((size = getSn_RX_RSR(SOCK_ID_TCP)) > 0)
{
// Cut data to size of data buffer
if(size > DATA_BUF_SIZE)
{
size = DATA_BUF_SIZE;
}
// Get received data
ret = recv(SOCK_ID_TCP, gDATABUF, size);
// Check for error
if(ret <= 0)
{
return;
}
proc_http(sn, (char *)buf);
}
break;
}
// Socket received the disconnect-request (FIN packet) from the connected peer
case SOCK_CLOSE_WAIT :
{
// Disconnect socket
if((ret = disconnect(SOCK_ID_TCP)) != SOCK_OK)
{
return;
}
break;
}
// Socket is opened with TCP mode
case SOCK_INIT :
{
// Listen to connection request
if( (ret = listen(SOCK_ID_TCP)) != SOCK_OK)
{
return;
}
break;
}
// Socket is released
case SOCK_CLOSED:
{
// Open TCP socket
if((ret = socket(SOCK_ID_TCP, Sn_MR_TCP, PORT_TCP, 0x00)) != SOCK_ID_TCP)
{
return;
}
break;
}
default:
{
break;
}
}
}
static void W5500_Init(void)
{
// Set Tx and Rx buffer size to 2KB
uint8_t buffsize[8] = { 2, 2, 2, 2, 2, 2, 2, 2 };
Wizchip_Rst_Direction = 0; // Set Rst pin to be output
Wizchip_CS_Direction = 0; // Set CS pin to be output
CB_ChipDeselect(); // Deselect module
// Reset module
Wizchip_Rst = 0;
Delay_ms(1);
Wizchip_Rst = 1;
Delay_ms(1);
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
// Wizchip initialize
wizchip_init(buffsize, buffsize, 0, 0, CB_ChipSelect, CB_ChipDeselect, 0, 0, CB_SpiRead, CB_SpiWrite);
// Wizchip netconf
ctlnetwork(CN_SET_NETINFO, (void*) &gWIZNETINFO);
ctlwizchip(CW_SET_PHYCONF, (void*) &phyConf);
}
void Move_Delay() {
Delay_ms(500);
}
void sendHeader(uint8_t sn)
{
uint8_t dat[128]={0,};
uint8_t dat_t[128]={0,};
uint8_t *dat_temp;
dat_temp = "HTTP/1.1 200 OK\r\n"; strcat(dat, dat_temp);
dat_temp = "Content-Type: text/html\r\n"; strcat(dat, dat_temp);
dat_temp = "Connection: close\r\n"; strcat(dat, dat_temp);
//sprintf(dat, "%sContent-Length: %d", dat, calcu_len());
dat_temp = "\r\n\r\n"; strcat(dat, dat_temp);
send(sn, (uint8_t *)dat, strlen(dat));
// printf("%s", dat);
}
uint8_t send_dat[1024]={0,};
uint16_t calcu_len(void)
{
uint8_t *dat_temp;
dat_temp = "\r\n"; strcat(send_dat, dat_temp);
dat_temp = "\r\n"; strcat(send_dat, dat_temp);
dat_temp = "\r\n"; strcat(send_dat, dat_temp);
dat_temp = "\r\n"; strcat(send_dat, dat_temp);
dat_temp = "\r\n"; strcat(send_dat, dat_temp);
dat_temp = "W5500 WebServer Test!!\r\n"; strcat(send_dat, dat_temp);
dat_temp = "\r\n"; strcat(send_dat, dat_temp);
dat_temp = "\r\n"; strcat(send_dat, dat_temp);
dat_temp = "\r\n"; strcat(send_dat, dat_temp);
dat_temp = "\r\n"; strcat(send_dat, dat_temp);
dat_temp = "W5500-EVB WebServer Test!!\r\n"; strcat(send_dat, dat_temp);
return strlen(send_dat);
}
void sendData(uint8_t sn)
{
uint16_t i;
send(sn, (uint8_t *)send_dat, strlen(send_dat));
//printf("%s", send_dat);
for(i=0;i<1024;i++){
send_dat[i]=0;
}
}
void main() {
ADCON0 = 0; // set PORTA as digital
ADCON1 = 0; // set PORTB as digital
ADCON2 = 0; // set PORTD as digital
W5500_Init();
wizchip_getnetinfo(&pnetinfo);
while(1)
{
TCP_Server();
}
Thanks much,
Dhanunjay