***************************************************************************************/
/*例程網絡參數*/
//網關:192.168.1.1
//掩碼: 255.255.255.0
//物理地址:0C 29 AB 7C 00 01
//本機IP地址:192.168.1.199
//端口0的端口號:5000
//端口0的目的IP地址:192.168.1.190
//端口0的目的端口號:6000
#include <pic.h>
#include "W5100.h"
#include <string.h>
#include "rx.h"
void Delay(unsigned int d); //延時函數(ms)
void delay_us(unsigned char n);
/*******************************************************************************
* 函數名 : W5100_Initialization
* 描述 : W5100初始貨配置
* 輸入 : 無
* 輸出 : 無
* 返回值 : 無
* 說明 : 無
*******************************************************************************/
void W5100_Initialization(void)
{
W5100_Init(); //初始化W5100寄存器函數
Detect_Gateway(); //檢查網關服務器
Socket_Init(0); //指定Socket(0~3)初始化,初始化端口0
}
/*******************************************************************************
* 函數名 : Load_Net_Parameters
* 描述 : 裝載網絡參數
* 輸入 : 無
* 輸出 : 無
* 返回值 : 無
* 說明 : 網關、掩碼、物理地址、本機IP地址、端口號、目的IP地址、目的端口號、端口工作模式
*******************************************************************************/
void Load_Net_Parameters(void)
{
Gateway_IP[0] = 192;//加載網關參數
Gateway_IP[1] = 168;
Gateway_IP[2] = 1;
Gateway_IP[3] = 1;
Sub_Mask[0]=255;//加載子網掩碼
Sub_Mask[1]=255;
Sub_Mask[2]=255;
Sub_Mask[3]=0;
Phy_Addr[0]=0x0c;//加載物理地址
Phy_Addr[1]=0x29;
Phy_Addr[2]=0xab;
Phy_Addr[3]=0x7c;
Phy_Addr[4]=0x00;
Phy_Addr[5]=0x01;
IP_Addr[0]=192;//加載本機IP地址
IP_Addr[1]=168;
IP_Addr[2]=1;
IP_Addr[3]=199;
S0_Port[0] = 0x13;//加載端口0的端口號5000
S0_Port[1] = 0x88;
S0_DIP[0]=192;//加載端口0的目的IP地址
S0_DIP[1]=168;
S0_DIP[2]=1;
S0_DIP[3]=190;
S0_DPort[0] = 0x17;//加載端口0的目的端口號6000
S0_DPort[1] = 0x70;
S0_Mode=TCP_CLIENT;//加載端口0的工作模式,TCP客戶端模式
}
/*******************************************************************************
* 函數名 : W5100_Socket_Set
* 描述 : W5100端口初始化配置
* 輸入 : 無
* 輸出 : 無
* 返回值 : 無
* 說明 : 分別設置4個端口,根據端口工作模式,將端口置于TCP服務器、TCP客戶端或UDP模式.
* 從端口狀態字節Socket_State可以判斷端口的工作情況
*******************************************************************************/
void W5100_Socket_Set(void)
{
if(S0_State==0)//端口0初始化配置
{
if(S0_Mode==TCP_SERVER)//TCP服務器模式
{
if(Socket_Listen(0)==TRUE)
S0_State=S_INIT;
else
S0_State=0;
}
else if(S0_Mode==TCP_CLIENT)//TCP客戶端模式
{
if(Socket_Connect(0)==TRUE)
S0_State=S_INIT;
else
S0_State=0;
}
else//UDP模式
{
if(Socket_UDP(0)==TRUE)
S0_State=S_INIT|S_CONN;
else
S0_State=0;
}
}
}
/*******************************************************************************
* 函數名 : Process_Socket_Data
* 描述 : W5100接收并發送接收到的數據
* 輸入 : s:端口號
* 輸出 : 無
* 返回值 : 無
* 說明 : 本過程先調用S_rx_process()從W5100的端口接收數據緩沖區讀取數據,
* 然后將讀取的數據從Rx_Buffer拷貝到Temp_Buffer緩沖區進行處理。
* 處理完畢,將數據從Temp_Buffer拷貝到Tx_Buffer緩沖區。調用S_tx_process()
* 發送數據。
*******************************************************************************/
void Process_Socket_Data(SOCKET s)
{
unsigned short size;
size=S_rx_process(s);
memcpy(Tx_Buffer, Rx_Buffer, size);
S_tx_process(s, size);
}
/*******************************************************************************
* 函數名 : main
* 描述 : 主函數,用戶程序從main函數開始運行
* 輸入 : 無
* 輸出 : 無
* 返回值 : int:返回值為一個16位整形數
* 說明 : 無
*******************************************************************************/
void init_io()
{
TRISC=0;
//TRISA=0;
TRISB=0x66;
OPTION_REG=0x7f;//端口b加上拉電阻
TRISD=0;
PORTD=0Xff;
}
int main(void)
{
unsigned int W5100_Send_Delay_Counter =0;
init_io();
Load_Net_Parameters(); //裝載網絡參數
W5100_Hardware_Reset(); //硬件復位W5100
W5100_Initialization(); //W5100初始貨配置
while (1)
{
W5100_Socket_Set();//W5100端口初始化配置
if(W5100_INT == 0)//處理W5100中斷
{
W5100_Interrupt_Process();//W5100中斷處理程序框架
}
if((S0_Data & S_RECEIVE) == S_RECEIVE)//如果Socket0接收到數據
{
S0_Data&=~S_RECEIVE;
Process_Socket_Data(0);//W5100接收并發送接收到的數據
}
else if(W5100_Send_Delay_Counter >= 40000)//定時發送字符串
{
if(S0_State != 0)
{
S0_Data&=~S_TRANSMITOK;
//memcpy(Tx_Buffer, "\r\n my name is cuizhen \r\n", 23);
if(flag_24l01()==1)
{
memcpy(Tx_Buffer, "\r\n 1 \r\n", 23);
S_tx_process(0, 23);//指定Socket(0~3)發送數據處理,端口0發送23字節數據
}
else
{
memcpy(Tx_Buffer, "\r\n 0 \r\n", 23);
S_tx_process(0, 23);//指定Socket(0~3)發送數據處理,端口0發送23字節數據
}
}
W5100_Send_Delay_Counter=0;
}
W5100_Send_Delay_Counter++;
}
}
/*******************************************************************************
* 函數名 : Delay
* 描述 : 延時函數(ms)
* 輸入 : d:延時系數,單位為毫秒
* 輸出 : 無
* 返回 : 無
* 說明 : 延時是利用Timer2定時器產生的1毫秒的計數來實現的
*******************************************************************************/
void Delay(unsigned int x)
{
unsigned int i,j;
for(j=0;j<5;j++)
for(i=0;i<x;i++);
}
|