?? demo.c.bak
字號:
else
{
for(i=0;i<4;i++)
I2C_Write(IP_ADDR_EE+i,Temp_Buffer[5+i]);
set_data_ok(4);
}
break;
/* 端口0設置 */
case 0x10: /* 端口號 */
if(Temp_Buffer[2]!=4)
error_process();
else
{
I2C_Write(S0_PORT_EE,Temp_Buffer[5]);
I2C_Write(S0_PORT_EE+1,Temp_Buffer[6]);
set_data_ok(2);
}
break;
case 0x11: /* 目的IP地址 */
if(Temp_Buffer[2]!=6)
error_process();
else
{
for(i=0;i<4;i++)
I2C_Write(S0_DIP_EE+i,Temp_Buffer[5+i]);
set_data_ok(4);
}
break;
case 0x12: /* 目的端口號 */
if(Temp_Buffer[2]!=4)
error_process();
else
{
I2C_Write(S0_DPORT_EE,Temp_Buffer[5]);
I2C_Write(S0_DPORT_EE+1,Temp_Buffer[6]);
set_data_ok(2);
}
break;
case 0x13: /* 端口0的工作模式 */
if(Temp_Buffer[2]!=3)
error_process();
else
{
S0_Mode=Temp_Buffer[5];
I2C_Write(S0_MODE_EE,S0_Mode);
set_data_ok(1);
}
break;
/* 端口1設置 */
case 0x20: /* 端口號 */
if(Temp_Buffer[2]!=4)
error_process();
else
{
I2C_Write(S1_PORT_EE,Temp_Buffer[5]);
I2C_Write(S1_PORT_EE+1,Temp_Buffer[6]);
set_data_ok(2);
}
break;
case 0x21: /* 目的IP地址 */
if(Temp_Buffer[2]!=6)
error_process();
else
{
for(i=0;i<4;i++)
I2C_Write(S1_DIP_EE+i,Temp_Buffer[5+i]);
set_data_ok(4);
}
break;
case 0x22: /* 目的端口號 */
if(Temp_Buffer[2]!=4)
error_process();
else
{
I2C_Write(S1_DPORT_EE,Temp_Buffer[5]);
I2C_Write(S1_DPORT_EE+1,Temp_Buffer[6]);
set_data_ok(2);
}
break;
case 0x23: /* 端口1的工作模式 */
if(Temp_Buffer[2]!=3)
error_process();
else
{
S1_Mode=Temp_Buffer[5];
I2C_Write(S1_MODE_EE,S1_Mode);
set_data_ok(1);
}
break;
/* 端口2設置 */
case 0x30: /* 端口號 */
if(Temp_Buffer[2]!=4)
error_process();
else
{
I2C_Write(S2_PORT_EE,Temp_Buffer[5]);
I2C_Write(S2_PORT_EE+1,Temp_Buffer[6]);
set_data_ok(2);
}
break;
case 0x31: /* 目的IP地址 */
if(Temp_Buffer[2]!=6)
error_process();
else
{
for(i=0;i<4;i++)
I2C_Write(S2_DIP_EE+i,Temp_Buffer[5+i]);
set_data_ok(4);
}
break;
case 0x32: /* 目的端口號 */
if(Temp_Buffer[2]!=4)
error_process();
else
{
I2C_Write(S2_DPORT_EE,Temp_Buffer[5]);
I2C_Write(S2_DPORT_EE+1,Temp_Buffer[6]);
set_data_ok(2);
}
break;
case 0x33: /* 端口2的工作模式 */
if(Temp_Buffer[2]!=3)
error_process();
else
{
S2_Mode=Temp_Buffer[5];
I2C_Write(S2_MODE_EE,S2_Mode);
set_data_ok(1);
}
break;
/* 端口3設置 */
case 0x40: /* 端口號 */
if(Temp_Buffer[2]!=4)
error_process();
else
{
I2C_Write(S3_PORT_EE,Temp_Buffer[5]);
I2C_Write(S3_PORT_EE+1,Temp_Buffer[6]);
set_data_ok(2);
}
break;
case 0x41: /* 目的IP地址 */
if(Temp_Buffer[2]!=6)
error_process();
else
{
for(i=0;i<4;i++)
I2C_Write(S3_DIP_EE+i,Temp_Buffer[5+i]);
set_data_ok(4);
}
break;
case 0x42: /* 目的端口號 */
if(Temp_Buffer[2]!=4)
error_process();
else
{
I2C_Write(S3_DPORT_EE,Temp_Buffer[5]);
I2C_Write(S3_DPORT_EE+1,Temp_Buffer[6]);
set_data_ok(2);
}
break;
case 0x43: /* 端口3的工作模式 */
if(Temp_Buffer[2]!=3)
error_process();
else
{
S3_Mode=Temp_Buffer[5];
I2C_Write(S3_MODE_EE,S3_Mode);
set_data_ok(1);
}
break;
case 0x82:
if(Temp_Buffer[2]!=3)
error_process();
else
{
if(Temp_Buffer[5]==1)
{
GPIO_SetBits(GPIOB, LED_DRIVE); /* 開啟LED指示燈 */
set_data_ok(1);
}
else if(Temp_Buffer[5]==0)
{
GPIO_ResetBits(GPIOB, LED_DRIVE); /* 關閉LED指示燈 */
set_data_ok(1);
}
else
error_process();
}
break;
default:
error_process();
break;
}
}
else /* 讀取對象參數 */
{
if(Temp_Buffer[2]!=2)
error_process();
else
{
Temp_Buffer[2]=6;
switch(i)
{
case 0: /* 網關 */
for(i=0;i<4;i++)
Temp_Buffer[5+i]=I2C_Read(GATEWAY_IP_EE+i);
break;
case 1: /* 子網掩碼 */
for(i=0;i<4;i++)
Temp_Buffer[5+i]=I2C_Read(SUBNET_MASK_EE+i);
break;
case 2: /* 物理地址 */
for(i=0;i<6;i++)
Temp_Buffer[5+i]=I2C_Read(PHY_ADDR_EE+i);
Temp_Buffer[2]+=2;
break;
case 3: /* 本機IP地址 */
for(i=0;i<4;i++)
Temp_Buffer[5+i]=I2C_Read(IP_ADDR_EE+i);
break;
/* 讀取端口0的配置參數 */
case 0x10: /* 端口0的端口號 */
for(i=0;i<2;i++)
Temp_Buffer[5+i]=I2C_Read(S0_PORT_EE+i);
Temp_Buffer[2]-=2;
break;
case 0x11: /* 端口0的目的IP地址 */
for(i=0;i<4;i++)
Temp_Buffer[5+i]=I2C_Read(S0_DIP_EE+i);
break;
case 0x12: /* 端口0的目的端口號 */
for(i=0;i<2;i++)
Temp_Buffer[5+i]=I2C_Read(S0_DPORT_EE+i);
Temp_Buffer[2]-=2;
break;
case 0x13: /* 端口0的工作模式 */
Temp_Buffer[5]=S0_Mode;
Temp_Buffer[2]-=3;
break;
/* 讀取端口1的配置參數 */
case 0x20: /* 端口1的端口號 */
for(i=0;i<2;i++)
Temp_Buffer[5+i]=I2C_Read(S1_PORT_EE+i);
Temp_Buffer[2]-=2;
break;
case 0x21: /* 端口1的目的IP地址 */
for(i=0;i<4;i++)
Temp_Buffer[5+i]=I2C_Read(S1_DIP_EE+i);
break;
case 0x22: /* 端口1的目的端口號 */
for(i=0;i<2;i++)
Temp_Buffer[5+i]=I2C_Read(S1_DPORT_EE+i);
Temp_Buffer[2]-=2;
break;
case 0x23: /* 端口1的工作模式 */
Temp_Buffer[5]=S1_Mode;
Temp_Buffer[2]-=3;
break;
/* 讀取端口2的配置參數 */
case 0x30: /* 端口2的端口號 */
for(i=0;i<2;i++)
Temp_Buffer[5+i]=I2C_Read(S2_PORT_EE+i);
Temp_Buffer[2]-=2;
break;
case 0x31: /* 端口2的目的IP地址 */
for(i=0;i<4;i++)
Temp_Buffer[5+i]=I2C_Read(S2_DIP_EE+i);
break;
case 0x32: /* 端口2的目的端口號 */
for(i=0;i<2;i++)
Temp_Buffer[5+i]=I2C_Read(S2_DPORT_EE+i);
Temp_Buffer[2]-=2;
break;
case 0x33: /* 端口2的工作模式 */
Temp_Buffer[5]=S2_Mode;
Temp_Buffer[2]-=3;
break;
/* 讀取端口3的配置參數 */
case 0x40: /* 端口3的端口號 */
for(i=0;i<2;i++)
Temp_Buffer[5+i]=I2C_Read(S3_PORT_EE+i);
Temp_Buffer[2]-=2;
break;
case 0x41: /* 端口3的目的IP地址 */
for(i=0;i<4;i++)
Temp_Buffer[5+i]=I2C_Read(S3_DIP_EE+i);
break;
case 0x42: /* 端口3的目的端口號 */
for(i=0;i<2;i++)
Temp_Buffer[5+i]=I2C_Read(S3_DPORT_EE+i);
Temp_Buffer[2]-=2;
break;
case 0x43: /* 端口3的工作模式 */
Temp_Buffer[5]=S3_Mode;
Temp_Buffer[2]-=3;
break;
case 0x80: /* 讀取溫度值 */
Temp_Buffer[5]=Temperature>>8;
Temp_Buffer[6]=Temperature;
Temp_Buffer[2]-=2;
break;
case 0x81: /* 讀取電位器的電壓值 */
Temp_Buffer[5]=Pot>>8;
Temp_Buffer[6]=Pot;
Temp_Buffer[2]-=2;
break;
case 0x82: /* 讀取LED的狀態 */
if(GPIO_ReadOutputDataBit(GPIOB, LED_DRIVE))
Temp_Buffer[5]=1;
else
Temp_Buffer[5]=0;
Temp_Buffer[2]-=3;
break;
default:
error_process();
break;
}
}
}
}
/*********************************************************************
程序名: Process_Socket_Data
輸入: 端口號
輸出: 無
返回:
說明:本過程先調用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(Temp_Buffer, Rx_Buffer, size);
Rx_Data_Process(size);
size=Temp_Buffer[2]+3;
memcpy(Tx_Buffer, Temp_Buffer, size);
S_tx_process(s, size);
}
/*********************************************************************
程序名: Process_UART_Data
輸入: 無
輸出: 無
返回:
說明:本過程先將UART的數據從UART_Rx_Buffer拷貝到Temp_Buffer緩沖區進行處理。
處理完畢,將數據從Temp_Buffer拷貝到UART_Tx_Buffer緩沖區等待發送數據。
*********************************************************************/
void Process_UART_Data(void)
{
memcpy(Temp_Buffer, UART_Rx_Buffer, RxCounter);
Rx_Data_Process(RxCounter);
TxCounter=Temp_Buffer[2]+3;
memcpy(UART_Tx_Buffer, Temp_Buffer, TxCounter);
USART_SendData(USART1, UART_Tx_Buffer[0]);
TxIndex=1;
RxCounter=0;
UART_DataReceive=0;
}
/*********************************************************************
程序名: ADC_Value_Conv
輸入: 無
輸出: 溫度值和模擬電壓值
返回:
說明:分別采集8個數據進行算術平均
計算溫度時,不僅采集溫度值,還采集參考電壓值,溫度值通過計算獲得
*********************************************************************/
void ADC_Value_Conv(void)
{
unsigned char i;
if(ADC_Complete==1)
{
ADC_Complete=0;
if(ADC_state==0) /* 完成3個參數的8次采集 */
{
Temperature=temperature[0]; /* 8次溫度值平均 */
for(i=1; i<8 ;i++)
Temperature+=temperature[i];
Temperature/=8;
Vref=vref[0]; /* 8次參考電壓值平均 */
for(i=1; i<8; i++)
Vref+=vref[i];
Vref/=8;
Temperature=3376-2680*Temperature/Vref; /* 計算溫度值 */
Pot=pot[0]; /* 8次模擬電壓值平均 */
for(i=1; i<8; i++)
Pot+=pot[i];
Pot=Pot/99; /* Pot*330/8/4096 */
}
ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* 啟動新的一次ADC */
}
}
/*****************************************************************
主程序
*****************************************************************/
int main(void)
{
/* 初始化STM32F101 */
System_Initialization();
/* 檢查是否進入默認參數設置狀態,然后從24LC01 EEPROM中獲取網絡參數 */
Load_Net_Parameters();
/* 初始化W5100 */
W5100_Initialization();
do
{
/* 設置W5100端口 */
W5100_Socket_Set();
/* 處理W5100中斷 */
if(W5100_Interrupt)
W5100_Interrupt_Process();
/* 如果Socket0接收到數據 */
if((S0_Data & S_RECEIVE) == S_RECEIVE)
{
S0_Data&=~S_RECEIVE;
Process_Socket_Data(0);
}
/* 如果Socket1接收到數據 */
if((S1_Data & S_RECEIVE) == S_RECEIVE)
{
S1_Data&=~S_RECEIVE;
Process_Socket_Data(1);
}
/* 如果Socket2接收到數據 */
if((S2_Data & S_RECEIVE) == S_RECEIVE)
{
S2_Data&=~S_RECEIVE;
Process_Socket_Data(2);
}
/* 如果Socket3接收到數據 */
if((S3_Data & S_RECEIVE) == S_RECEIVE)
{
S3_Data&=~S_RECEIVE;
Process_Socket_Data(3);
}
/* 如果UART接收到完整的數據包 */
if(UART_DataReceive==1)
{
UART_DataReceive=0;
Process_UART_Data();
}
/* 處理AD轉換的數據 */
ADC_Value_Conv();
}while(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -