打印
[应用相关]

基于W5100的网络芯片UDP传输模式的实现【转】

[复制链接]
4707|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
figo20042005|  楼主 | 2012-7-17 14:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前段时间写了相关在stm32移植w5100网络的相关代码,现在简单介绍一下 比较常用的大数量传输模式udp模式。
     相关步骤:
      1)使用UDP模式,首先需要配置IP地址和socket的端口号。
     2)接收到数据后,前8个字节包括远程主机的IP地址(1-4字节),端口号(5-6字节),数据长度(7-8)字节。
     3)发数据前必须配置目标主机IP地址和端口号,也就是接收到数据的前1-6字节。
模式设置:
  设置Socket为UDP模式
如果Socket工作在UDP模式,引用该程序。在UDP模式下,Socket通信不需要建立连接
如果设置成功则返回true, 否则返回false
该程序只调用一次,就使W5100设置为UDP模式
-----------------------------------------------------------------------------*/
unsigned char Socket_UDP(SOCKET s)
{
Write_W5100((W5100_S0_MR+s*0x100), S_MR_UDP);  /*设置Socket为UDP模式*/
Write_W5100((W5100_S0_CR+s*0x100), S_CR_OPEN);  /*打开Socket*/
if(Read_W5100(W5100_S0_SSR+s*0x100)!=S_SSR_UDP)
{
  Write_W5100((W5100_S0_CR+s*0x100), S_CR_CLOSE); /*打开不成功,关闭Socket,然后返回*/
  return FALSE;
}
else
  return TRUE;
/*至此完成了Socket的打开和UDP模式设置,在这种模式下它不需要与远程主机建立连接
因为Socket不需要建立连接,所以在发送数据前都可以设置目的主机IP和目的Socket的端口号
如果目的主机IP和目的Socket的端口号是固定的,在运行过程中没有改变,那么也可以在这里设置*/
}
数据处理:
  /******************************************************************************
                              处理Socket接收和发送的数据
******************************************************************************/
/*-----------------------------------------------------------------------------
如果Socket产生接收数据的中断,则引用该程序进行处理
该程序将Socket的接收到的数据缓存到Rx_buffer数组中,并返回接收的数据字节数
-----------------------------------------------------------------------------*/
unsigned short S_rx_process(SOCKET s)
{
unsigned short i,j;
unsigned short rx_size,rx_offset;
SPI_InitTypeDef    SPI_InitStructure;
/*读取接收数据的字节数*/
rx_size=Read_W5100(W5100_S0_RX_RSR+s*0x100);
rx_size*=256;
rx_size+=Read_W5100(W5100_S0_RX_RSR+s*0x100+1);
/*读取接收缓冲区的偏移量*/
rx_offset=Read_W5100(W5100_S0_RX_RR+s*0x100);
rx_offset*=256;
rx_offset+=Read_W5100(W5100_S0_RX_RR+s*0x100+1);
i=rx_offset/S_RX_SIZE;    /*计算实际的物理偏移量,S0_RX_SIZE需要在前面#define中定义*/
        /*注意S_RX_SIZE的值在W5100_Init()函数的W5100_RMSR中确定*/
rx_offset=rx_offset-i*S_RX_SIZE;
j=W5100_RX+s*S_RX_SIZE+rx_offset;  /*实际物理地址为W5100_RX+rx_offset*/

//SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;
    //SPI_Init(SPI1,&SPI_InitStructure);
//SPI_Cmd(SPI1,ENABLE);
for(i=0;i
{
  if(rx_offset>=S_RX_SIZE)
  {
   j=W5100_RX+s*S_RX_SIZE;
   rx_offset=0;
  }
  Rx_Buffer=Read_W5100(j);  /*将数据缓存到Rx_buffer数组中*/
  j++;
  rx_offset++;
}
//SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;
   // SPI_Init(SPI1,&SPI_InitStructure);
//SPI_Cmd(SPI1,ENABLE);
/*计算下一次偏移量*/
rx_offset=Read_W5100(W5100_S0_RX_RR+s*0x100);
rx_offset*=256;
rx_offset+=Read_W5100(W5100_S0_RX_RR+s*0x100+1);
rx_offset+=rx_size;
Write_W5100((W5100_S0_RX_RR+s*0x100), (rx_offset/256));
Write_W5100((W5100_S0_RX_RR+s*0x100+1), rx_offset);
Write_W5100((W5100_S0_CR+s*0x100), S_CR_RECV);   /*设置RECV命令,等等下一次接收*/
     //   while(!W5100_Interrupt);
   //     W5100_Interrupt = 0;
return rx_size;        /*返回接收的数据字节数*/
}
这里简单说一下流程  详情 请看w5100数据手册
沙发
337zhang| | 2012-7-18 23:13 | 只看该作者
此贴竟然没人顶,太可惜了,过段时间准备买个W5100模块学习,顶了:lol

使用特权

评论回复
板凳
玉蓝田i| | 2012-11-12 11:17 | 只看该作者
楼主有遇到过,有的寄存器能正常读写,有的寄存器不能正常读写的情况吗

使用特权

评论回复
地板
信子1993| | 2013-12-4 00:31 | 只看该作者
可不可以要你的联系方式啊,求帮助啊:(

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:need to study

16

主题

1576

帖子

3

粉丝