STM32开发板+W5100以太网模块示例比ENC28J60更好
- UID
- 852722
|
STM32开发板+W5100以太网模块示例比ENC28J60更好
w5100模块,学习了一下。这个芯片真的不错,集成了硬件tcp/ip协议栈。操作很简单,主要是通过spi接口(当然也支持并口总线操作)配置网络的相关ip 掩码 物理地址 之类的值。
参数配置好后,就是读写通讯的内容,w5100有个中断引脚来指示通讯的完成,我们通过在中断到来之后读取状态值,就会知道是那个端口的中断,以此来进行相关数据解析。
w5100初始化程序:
Write_W5100(W5100_MODE,MODE_RST); /*软复位W5100*/
Delay(100); /*延时100ms,自己定义该函数*/
/*设置网关(Gateway)的IP地址,4字节 */
/*使用网关可以使通信突破子网的局限,通过网关可以访问到其它子网或进入Internet*/
for(i=0;i<4;i++)
Write_W5100(W5100_GAR+i,Gateway_IP); /*Gateway_IP为4字节unsigned char数组,自己定义*/
/*设置子网掩码(MASK)值,4字节。子网掩码用于子网运算*/
for(i=0;i<4;i++)
Write_W5100(W5100_SUBR+i,Sub_Mask); /*SUB_MASK为4字节unsigned char数组,自己定义*/
/*设置物理地址,6字节,用于唯一标识网络设备的物理地址值
该地址值需要到IEEE申请,按照OUI的规定,前3个字节为厂商代码,后三个字节为产品序号
如果自己定义物理地址,注意第一个字节必须为偶数*/
for(i=0;i<6;i++)
Write_W5100(W5100_SHAR+i,Phy_Addr); /*PHY_ADDR6字节unsigned char数组,自己定义*/
/*设置本机的IP地址,4个字节
注意,网关IP必须与本机IP属于同一个子网,否则本机将无法找到网关*/
for(i=0;i<4;i++)
Write_W5100(W5100_SIPR+i,IP_Addr); /*IP_ADDR为4字节unsigned char数组,自己定义*/
/*设置发送缓冲区和接收缓冲区的大小,参考W5100数据手册*/
Write_W5100(W5100_RMSR,0x55); /*Socket Rx memory size=2k*/
Write_W5100(W5100_TMSR,0x55); /*Socket Tx mempry size=2k*/
/* 设置重试时间,默认为2000(200ms) */
Write_W5100(W5100_RTR,0x07);
Write_W5100(W5100_RTR+1,0xd0);
/* 设置重试次数,默认为8次 */
Write_W5100(W5100_RCR,8);
/* 启动中断,参考W5100数据手册确定自己需要的中断类型
IMR_CONFLICT是IP地址冲突异常中断
IMR_UNREACH是UDP通信时,地址无法到达的异常中断
其它是Socket事件中断,根据需要添加 */
Write_W5100(W5100_IMR,(IMR_CONFLICT|IMR_UNREACH|IMR_S0_INT|IMR_S1_INT|IMR_S2_INT|IMR_S3_INT));
主程序:
do
{
/* 设置W5100端口 */
W5100_Socket_Set();
Socket_Listen(0);
/* 处理W5100中断 */
if(W5100_Interrupt)
W5100_Interrupt_Process();
/* 如果Socket0接收到数据 */
if((S0_Data & S_RECEIVE) == S_RECEIVE)
{ GPIO_SetBits(GPIOB, LED_DRIVE);
S0_Data&=~S_RECEIVE;
Process_Socket_Data(0);
}
/* 如果Socket1接收到数据 */
if((S1_Data & S_RECEIVE) == S_RECEIVE)
{ GPIO_SetBits(GPIOB, LED_DRIVE);
S1_Data&=~S_RECEIVE;
Process_Socket_Data(1);
}
/* 如果Socket2接收到数据 */
if((S2_Data & S_RECEIVE) == S_RECEIVE)
{ GPIO_SetBits(GPIOB, LED_DRIVE);
S2_Data&=~S_RECEIVE;
Process_Socket_Data(2);
}
/* 如果Socket3接收到数据 */
if((S3_Data & S_RECEIVE) == S_RECEIVE)
{ GPIO_SetBits(GPIOB, LED_DRIVE);
S3_Data&=~S_RECEIVE;
Process_Socket_Data(3); |
|
|
|
|
|