打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
DIY_DE2之DM9000A网卡调试系列例程(三)——基于LWIP协议栈的TCP/IP实现

DIY_DE2之DM9000A网卡调试系列例程(三)——基于LWIP协议栈的TCP/IP实现

一、摘要

  Altera软件NIOS II低版本(7.2版本以下,本例程中使用的是6.0版本)中实现TCP/IP所用的协议栈为LWIP,常用的例程有2个,web_server和simple_socket_server,这篇文章将叙述这2个例程实现的过程。

 

二、实验平台

软件平台:Quartus II 6.0 + Nios II 6.0

硬件平台:DIY_DE2

 

三、实验内容1——>实现web_server

1、采用SOPC定制软核

定制软核的详细步骤不再赘述,以上为定制的软核。

cpu_0需要设置的地方:

Reset Vector:cfi_flash_0、

Exception Vector:sdram_0

必须要添加timer_0,供uC/OS系统所使用

第二个标签页:Data Master处,Data Cache设置为None

之后分配地址,分配中断号,生成即可。

2、硬件电路

采用原理图的形式,创建顶层文件。

(1)添加生成的软核;

(2)调用锁相环IP核;

(3)连线、分配管脚;

(4)编译、综合,生成配置文件。

最后原理图如下图所示。

需要注意的问题:

(1)软核程序在SDRAM里面运行,为了使软核的速度提升,因此SDRAM的频率和cpu的频率都设置为100M。cpu时钟clk_100和sdram操作时钟clk_50都接PLL的c0,100M,无相位偏移;SDRAM的时钟管脚SDRAM_CLK连接PLL的c1,100M,偏移-3ns。

(2)DM9000A的时钟管脚接50M,直接连接晶振的输入端即可。

(3)复位管脚接高电平VCC即可。

(4)CFI_FLASH的复位管脚FLASH_RESET接高电平VCC即可。

3、软件方面

(1)打开NIOS II,新建工程,调用web_server工程模板。

(2)添加DM9000A驱动:dm9000a.h和dm9000a.c,将上述两个文件复制到上步建立的工程文件夹下。

(3)打开文件network_utilities.c,赋予静态IP。

(4)编译、下载、运行,之前要先将.sof的配置文件下载到FPGA内。在DOS下输入ping命令:ping 192.168.2.1,如下图所示,则可以正常ping通。

  如果事先将网页数据烧录到FLASH中,在PC打开浏览器,则可以在浏览器上看到FLASH中的网页内容。这个实验之前在DE2板子上做过,这里就不再重复了。

4、工程文件解读

(1)http.c、http.h:网页相关文件;

(2)Dm9000a.h、dm9000a.c:DM9000A的驱动;

(3)User.h:任务调度优先级、缺省IP设置等等;

(4)network_utilities.c:设置IP,设置MAC;

(5)Web_server:主函数所在文件。

 

四、实验内容2——>实现simple_socket_server

1、建立工程及文件解读

  在上一步的基础上,直接在NIOS II中新建工程,调用simple_socket_server工程模板。添加DM9000A的驱动,将dm9000a.h、dm9000a.c添加到建立的工程文件夹下。工程文件主要包括以下几个:

(1)alt_error_handler.h、alt_error_handler.c:错误类型句柄文件;

(2)dm9000a.h、dm9000a.c:DM9000A的驱动;

(3)network_utilities.c:设置IP,设置MAC;

(4)simple_socket_server.h、simple_socket_server.c:工程的主体程序,包括任务调度优先级、缺省IP设置、套接字、各种任务调度等等工作;

(5)led.c:LED、七段数码管显示程序;

(6)lwip_init.c:程序主函数。

2、需要修改的地方

依照web_server例程,对simple_socket_server例程进行部分修改:

(1)simple_socket_server.h文件,

添加分配DHCP优先级:#define DHCP_TMR_PRIO 8

添加语句:void die_with_error(char err_msg[]);

添加DHCP超时任务函数:void dhcp_timeout_task();

添加语句:#define DIE_WITH_ERROR_BUFFER 256

(2)lwip_init.c文件

添加DM9000A驱动:#include "dm9000.h"

添加DM9000A接口语句:ALTERA_AVALON_DM9K_INSTANCE(DM9000A, dm9k);

添加语句:OS_EVENT *attained_ip_address_sem;

static void init_done_func(void *arg)添加以下语句:

  1.   //++sunev
  2.   ALTERA_AVALON_DM9K_INIT(dm9k);
  3.   /*
  4.    * At this point lwIP has been initialized, but the Ethernet interface has
  5.    * not; the lwip_devices_init() call does so, adding in MicroC-OS/II
  6.    * threads for low-level Ethernet MAC interface and TCP protocol timer.
  7.    */
  8. //++sunev  
  9.    attained_ip_address_sem = OSSemCreate(1);
  10.   
  11.    if (!lwip_devices_init(LWIP_RX_ETHER_TASK_PRIORITY))
  12.    {
  13.       alt_lwIPErrorHandler(EXPANDED_DIAGNOSIS_CODE,
  14. "[init_done_func] Fatal: lwip_devices_init failed, perhaps ethernet interface.");
  15.    }
  16. //++sunev
  17. #if LWIP_DHCP == 1
  18.   if(!(IORD(0, 0) & (1<<17))) sys_thread_new(dhcp_timeout_task, NULL, DHCP_TMR_PRIO);
  19.   /*
  20.    * If DHCP is enabled, activate a thread for the 120-second long time period
  21.    * that will set a static IP address if acquisistion via DHCP times out.
  22.    */
  23. //--sunev
  24. /*   if (!sys_thread_new(NETUTILSDHCPTimeoutTask, NULL,
  25.                        NETUTILS_DHCP_TIMEOUT_TASK_PRIORITY))
  26.    {
  27.       alt_lwIPErrorHandler(EXPANDED_DIAGNOSIS_CODE,
  28.                  "[init_done_func] Fatal: Can't add NETUTILSDHCPTimeoutTask!");
  29.    }*/

(3)将web_server中的network_utilities.c文件直接替换掉simple_socket_server中的network_utilities.c文件。

3、编译、下载、运行

之前要先将.sof的配置文件下载到FPGA内。在DOS下输入ping命令:ping 192.168.2.1,如下图所示,则可以正常ping通。

再输入telnet命令:telnet 192.168.2.1,则得到如下图所示:

在PC键盘输入0-7数字,则DIY_DE2上的8个LED就会相应的亮或者灭。至此,说明,telnet正常。

 

五、实验结果分析

  这个实验结果分析,对上述2个实验内容均为一致。

  解读上述程序,在network_utilities.c文件中,可以得知,设置IP的3种方法:第一种,程序设定静态IP;第二种,DHCP获得动态IP;第三种,缺省IP。其优先级及顺序如下:

  (1)当设定静态IP之后,DHCP能获得一个动态IP,但以设置的静态IP为有效IP。

  (2)当未设定静态IP之后,DHCP则不能获得一个动态IP,但过了设定的DHCP超时时间后(以上2个例程中的超时时间为120s),使用的是缺省IP,缺省IP为有效IP。

设定静态IP时,NIOS II 运行结果

未设定静态IP时,需等待2分钟(DHCP超时可在simple_socket_server.h中设定),NIOS II 运行结果

 

六、实验的几点说明

1、IP值设置:

  因为是采用局域网通信,所以要将PC和DIY_DE2的IP的前3位设置为相同,最后一位不同。

2、MAC值设置:

  直接采用程序设定即可,或者是将MAC值存储在FLASH中,上电读取即可。本例采用的是前一种方法。

3、端口设定:

  telnet的时候,需要侦听端口,当侦听的端口号和DIY_DE2中设定的相同的时候,才能正常通信。有2种方法:telnet 192.168.2.1时,会有一个专用的端口23,将DIY_DE2中设定的端口号改为23即可(在文件simple_socket_server.h中#define SSS_PORT 23)。

4、关于这个例程在NIOS II方面:

  关于Software Components这个按钮下Lightweight TCP/IP Stack下选项为灰色的原因,其实这个不必理他。这一点也得到了友晶科技的证实。如果用LAN91c111这个网卡,上述位置的选项则可以正常使用,这说明NIOS II软件只认SOPC中原装的器件。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
lwip 可以ping通,但是建立tcp-server不能连接
一步步移植uCOS-II and LwIP (三)
lwIP(TCP/IP)协议栈移植
DHCP-Server 设置(局域网自动获取IP地址)
XP,Win7 DHCP Server 服务器软件
小白也能学会的 NAS 路由器一体机 DIY 攻略 (二)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服