⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo.c

📁 韩国Wiznet公司W5100在keil c环境下的通讯例程
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -