📄 demo.c
字号:
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 + -