?? demo.c
字號:
/*********************************************************************************
提供商:成都浩然電子
網 址:http://www.hschip.com
時 間: 2007-11-30
*********************************************************************************/
#include <stm32f10x_lib.h> /* STM32F10x庫定義 */
#include <string.h>
#include "Device.h"
#include "Net_Parameter.h" /* 24LC01 EEPROM存儲的網絡通信參數定義 */
#include "IO_define.h" /* 評估板硬件接口定義 */
#include "W5100.h" /* W5100定義 */
/**********************************************************************
程序名: Delay
輸入: 延時系數,單位為毫秒
輸出: 無
返回: 無
說明:延時是利用Timer2定時器產生的1毫秒的計數來實現的
**********************************************************************/
void Delay(unsigned int d)
{
unsigned int i,j;
i=Timer2_Counter;
do
{
if(Timer2_Counter>i)
j=Timer2_Counter-i;
else
j=0x100000000-i+Timer2_Counter;
}while(j<=d);
}
/**********************************************************************
程序名: I2C_Write
輸入: 地址值,數據字節
輸出: 無
返回:
說明:將一個字節的數據寫入24LC01B EEPROM的指定的地址
**********************************************************************/
void I2C_Write(unsigned char addr, unsigned char dat)
{
I2C_Cmd(I2C1, ENABLE);
/* 發送I2C的START信號 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 檢查I2C的EV5狀態并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* 發送24LC01B的設備地址 */
I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);
/* 檢查I2C的EV6狀態并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* 發送寫入到24LC01B地址 */
I2C_SendData(I2C1, addr);
/* 檢查I2C的EV8狀態并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* 發送數據 */
I2C_SendData(I2C1, dat);
/* 檢查I2C的EV8狀態并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* 發送I2C的STOP信號 */
I2C_GenerateSTOP(I2C1, ENABLE);
Delay(10);
}
/**********************************************************************
程序名: I2C_Read
輸入: 地址值
輸出: 無
返回: 數據字節
說明:從24LC01 EEPROM指定的地址讀取一個字節的數據
**********************************************************************/
unsigned char I2C_Read(unsigned char addr)
{
unsigned char i;
I2C_Cmd(I2C1, ENABLE);
/* 發送I2C的START信號 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 檢查I2C的EV5狀態并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* 發送24LC01B的地址 */
I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);
/* 檢查I2C的EV6狀態并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* 清除EV6狀態 */
I2C_Cmd(I2C1, ENABLE);
/* 發送讀取數據的地址 */
I2C_SendData(I2C1, addr);
/* 檢查I2C的EV8狀態并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* 發送I2C的START信號 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 檢查I2C的EV5狀態并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* 發送I2C讀命令 */
I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Receiver);
/* 檢查I2C的EV6狀態并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
/* 檢查I2C的EV7并清除 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
/* 發送I2C的STOP信號 */
I2C_GenerateSTOP(I2C1, ENABLE);
/* 讀取數據 */
i = I2C_ReceiveData(I2C1);
I2C_Cmd(I2C1, DISABLE);
Delay(2);
return i;
}
/**********************************************************************
程序名: Load_Net_Parameters
輸入: 無
輸出: 無
返回: 無
說明:從24LC01中讀取網絡通信參數,這些參數包括: 網關IP,子網掩碼, 物理地址,
本機IP地址。評估板開放了W5100的4個端口,因此還要分別讀取4個端口的端口
號、目的IP地址和目的端口號(只有在TCP客戶端和UDP時有效)。
端口工作模式控制:0:TCP服務器模式;1:TCP客戶端模式;2:UDP模式
在讀取參數之前,先檢查J1狀態。如果J1短路,那么評估板進入默認參數設置
狀態。默認參數寫入24LC01中。
**********************************************************************/
void Load_Net_Parameters(void)
{
unsigned short i;
/* 檢查Jumper 1跳線, 如果J1短路,設置EVB的網絡參數為默認值 */
if(GPIO_ReadInputDataBit(GPIOC, DIG_IN)==0)
{
/* 設置默認的網關為192.168.0.1 */
I2C_Write(GATEWAY_IP_EE,192);
I2C_Write(GATEWAY_IP_EE+1,168);
I2C_Write(GATEWAY_IP_EE+2,0);
I2C_Write(GATEWAY_IP_EE+3,1);
/* 設置默認的子網掩碼為255.255.255.0 */
I2C_Write(SUBNET_MASK_EE,255);
I2C_Write(SUBNET_MASK_EE+1,255);
I2C_Write(SUBNET_MASK_EE+2,255);
I2C_Write(SUBNET_MASK_EE+3,0);
/* 設置默認的物理地址為 00.08.DC.01.02.03 */
I2C_Write(PHY_ADDR_EE,0x00);
I2C_Write(PHY_ADDR_EE+1,0x08);
I2C_Write(PHY_ADDR_EE+2,0xdc);
I2C_Write(PHY_ADDR_EE+3,0x01);
I2C_Write(PHY_ADDR_EE+4,0x02);
I2C_Write(PHY_ADDR_EE+5,0x03);
/* 設置本機默認的IP地址為192.168.0.2 */
I2C_Write(IP_ADDR_EE,192);
I2C_Write(IP_ADDR_EE+1,168);
I2C_Write(IP_ADDR_EE+2,0);
I2C_Write(IP_ADDR_EE+3,2);
/* 設置端口0默認的端口號為50000 */
I2C_Write(S0_PORT_EE,0xc3);
I2C_Write(S0_PORT_EE+1,0x50);
/* 設置端口0默認的工作方式為TCP服務器 */
I2C_Write(S0_MODE_EE, 0x00);
/* 設置端口1默認的端口號為51000 */
I2C_Write(S1_PORT_EE,0xc7);
I2C_Write(S1_PORT_EE+1,0x38);
/* 設置端口1默認的工作方式為TCP服務器 */
I2C_Write(S1_MODE_EE, 0x00);
/* 設置端口2默認的端口號為52000 */
I2C_Write(S2_PORT_EE,0xcb);
I2C_Write(S2_PORT_EE+1,0x20);
/* 設置端口2默認的工作方式為TCP服務器 */
I2C_Write(S2_MODE_EE, 0x00);
/* 設置端口3默認的端口號為53000 */
I2C_Write(S3_PORT_EE,0xcf);
I2C_Write(S3_PORT_EE+1,0x08);
/* 設置端口3默認的工作方式為TCP服務器 */
I2C_Write(S3_MODE_EE, 0x00);
}
/* 加載網關參數 */
for(i=0; i<4; i++)
Gateway_IP[i] = I2C_Read(GATEWAY_IP_EE+i);
/* 加載子網掩碼 */
for(i=0; i<4; i++)
Sub_Mask[i] = I2C_Read(SUBNET_MASK_EE+i);
/* 加載物理地址 */
for(i=0; i<6; i++)
Phy_Addr[i]=I2C_Read(PHY_ADDR_EE+i);
/* 加載IP地址 */
for(i=0; i<4; i++)
IP_Addr[i]=I2C_Read(IP_ADDR_EE+i);
/* 加載端口0的端口號 */
S0_Port[0] = I2C_Read(S0_PORT_EE);
S0_Port[1] = I2C_Read(S0_PORT_EE+1);
/* 加載端口0的目的IP地址 */
for(i=0; i<4; i++)
S0_DIP[i]=I2C_Read(S0_DIP_EE+i);
/* 加載端口0的目的端口號 */
S0_DPort[0] = I2C_Read(S0_DPORT_EE);
S0_DPort[1] = I2C_Read(S0_DPORT_EE+1);
/* 加載端口0的工作模式 */
S0_Mode=I2C_Read(S0_MODE_EE);
/* 加載端口1的端口號 */
S1_Port[0] = I2C_Read(S1_PORT_EE);
S1_Port[1] = I2C_Read(S1_PORT_EE+1);
/* 加載端口1的目的IP地址 */
for(i=0; i<4; i++)
S1_DIP[i]=I2C_Read(S1_DIP_EE+i);
/* 加載端口1的目的端口號 */
S1_DPort[0] = I2C_Read(S1_DPORT_EE);
S1_DPort[1] = I2C_Read(S1_DPORT_EE+1);
/* 加載端口1的工作模式 */
S1_Mode=I2C_Read(S1_MODE_EE);
/* 加載端口2的端口號 */
S2_Port[0] = I2C_Read(S2_PORT_EE);
S2_Port[1] = I2C_Read(S2_PORT_EE+1);
/* 加載端口2的目的IP地址 */
for(i=0; i<4; i++)
S2_DIP[i]=I2C_Read(S2_DIP_EE+i);
/* 加載端口2的目的端口號 */
S2_DPort[0] = I2C_Read(S2_DPORT_EE);
S2_DPort[1] = I2C_Read(S2_DPORT_EE+1);
/* 加載端口2的工作模式 */
S2_Mode=I2C_Read(S2_MODE_EE);
/* 加載端口3的端口號 */
S3_Port[0] = I2C_Read(S3_PORT_EE);
S3_Port[1] = I2C_Read(S3_PORT_EE+1);
/* 加載端口3的目的IP地址 */
for(i=0; i<4; i++)
S3_DIP[i]=I2C_Read(S3_DIP_EE+i);
/* 加載端口3的目的端口號 */
S3_DPort[0] = I2C_Read(S3_DPORT_EE);
S3_DPort[1] = I2C_Read(S3_DPORT_EE+1);
/* 加載端口3的工作模式 */
S3_Mode=I2C_Read(S3_MODE_EE);
}
/*****************************************************************
程序名: W5100_Initialization
輸入: 無
輸出: 無
返回: 無
說明:先對W5100初始化,然后檢查網關,最后分別初始化4個端口
*****************************************************************/
void W5100_Initialization(void)
{
W5100_Init();
/* 檢查網關服務器 */
Detect_Gateway();
/* 端口0 */
Socket_Init(0);
/* 端口1 */
Socket_Init(1);
/* 端口2 */
Socket_Init(2);
/* 端口3 */
Socket_Init(3);
GPIO_ResetBits(GPIOB, LED_DRIVE); /* 開啟LED指示燈 */
}
/*****************************************************************
程序名: W5100_Socket_Set
輸入: 無
輸出: 端口狀態Socket_Statex
返回: 無
說明:分別設置4個端口,根據端口工作模式,將端口置于TCP服務器、TCP客戶端
或UDP模式。
從端口狀態字節Socket_Statex可以判斷端口的工作情況
*****************************************************************/
void W5100_Socket_Set(void)
{
/* 端口 0 */
if(S0_State==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;
}
}
/* 端口 1 */
if(S1_State==0)
{
if(S1_Mode==TCP_SERVER) /* TCP服務器模式 */
{
if(Socket_Listen(1)==TRUE)
S1_State=S_INIT;
else
S1_State=0;
}
else if(S1_Mode==TCP_CLIENT) /* TCP客戶端模式 */
{
if(Socket_Connect(1)==TRUE)
S1_State=S_INIT;
else
S1_State=0;
}
else /* UDP模式 */
{
if(Socket_UDP(1)==TRUE)
S1_State=S_INIT|S_CONN;
else
S1_State=0;
}
}
/* 端口 2 */
if(S2_State==0)
{
if(S2_Mode==TCP_SERVER) /* TCP服務器模式 */
{
if(Socket_Listen(2)==TRUE)
S2_State=S_INIT;
else
S2_State=0;
}
else if(S2_Mode==TCP_CLIENT) /* TCP客戶端模式 */
{
if(Socket_Connect(2)==TRUE)
S2_State=S_INIT;
else
S2_State=0;
}
else /* UDP模式 */
{
if(Socket_UDP(2)==TRUE)
S2_State=S_INIT|S_CONN;
else
S2_State=0;
}
}
/* 端口 3 */
if(S3_State==0)
{
if(S3_Mode==TCP_SERVER) /* TCP服務器模式 */
{
if(Socket_Listen(3)==TRUE)
S3_State=S_INIT;
else
S3_State=0;
}
else if(S3_Mode==TCP_CLIENT) /* TCP客戶端模式 */
{
if(Socket_Connect(3)==TRUE)
S3_State=S_INIT;
else
S3_State=0;
}
else /* UDP模式 */
{
if(Socket_UDP(3)==TRUE)
S3_State=S_INIT|S_CONN;
else
S3_State=0;
}
}
}
/*****************************************************************
程序名: Rx_Data_process
輸入: 數據字節長度
輸出: 返回的數據,存儲在Temp_Buffer中
返回:
說明:數據包的結構如下:
| 0xaa | 0x55 | Length | Command | Object | Data |
Length(1字節): 數據包字節長度,不包括數據包頭和本身字節
Command(1字節):為0時讀取對象數據,為1時設置對象參數
Object(1字節): 0x00: 網關IP
0x01: 子網掩碼
0x02: 物理地址
0x03: 本機IP地址
0x10/0x20/0x30/0x40: 分別為4個端口的端口號
0x11/0x21/0x31/0x41: 分別為4個端口的目的IP地址(只有在TCP客戶端和UDP模式下有效)
0x12/0x22/0x32/0x42: 分別為4個端口的目的端口號(只有在TCP客戶端和UDP模式下有效)
0x12/0x22/0x32/0x42: 分別為4個端口的工作模式
0x80: 溫度(只讀)
0x81: 模擬電壓信號(只讀)
0x82: LED的狀態
*****************************************************************/
void error_process(void)
{
Temp_Buffer[2] =2;
Temp_Buffer[3] |= 0x80;
}
void set_data_ok(unsigned char i)
{
Temp_Buffer[2]=3;
Temp_Buffer[5]=i;
}
void Rx_Data_Process(short l)
{
unsigned char i;
if((Temp_Buffer[0]!=0xaa)||(Temp_Buffer[1]!=0x55)) /* 數據包頭錯誤 */
return;
i=l-3;
if(i!=Temp_Buffer[2]) /* 數據包字節長度錯誤 */
return;
i=Temp_Buffer[4]; /* 指向對象 */
if(Temp_Buffer[3])
{ /* 設置對象參數 */
switch(i)
{
case 0: /* 網關 */
if(Temp_Buffer[2]!=6)
error_process();
else
{
for(i=0;i<4;i++)
I2C_Write(GATEWAY_IP_EE+i,Temp_Buffer[5+i]);
set_data_ok(4);
}
break;
case 1: /* 子網掩碼 */
if(Temp_Buffer[2]!=6)
error_process();
else
{
for(i=0;i<4;i++)
I2C_Write(SUBNET_MASK_EE+i,Temp_Buffer[5+i]);
set_data_ok(4);
}
break;
case 2: /* 物理地址 */
if(Temp_Buffer[2]!=8)
error_process();
else
{
for(i=0;i<6;i++)
I2C_Write(PHY_ADDR_EE+i,Temp_Buffer[5+i]);
set_data_ok(6);
}
break;
case 3: /* 本機IP地址 */
if(Temp_Buffer[2]!=6)
error_process();
else
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -