首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32开发板+W5100以太网模块示例比ENC28J60更好

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);
返回列表