LWIP移植说明书及程序分析报告

上传人:鲁** 文档编号:493913955 上传时间:2023-07-17 格式:DOC 页数:10 大小:129.50KB
返回 下载 相关 举报
LWIP移植说明书及程序分析报告_第1页
第1页 / 共10页
LWIP移植说明书及程序分析报告_第2页
第2页 / 共10页
LWIP移植说明书及程序分析报告_第3页
第3页 / 共10页
LWIP移植说明书及程序分析报告_第4页
第4页 / 共10页
LWIP移植说明书及程序分析报告_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《LWIP移植说明书及程序分析报告》由会员分享,可在线阅读,更多相关《LWIP移植说明书及程序分析报告(10页珍藏版)》请在金锄头文库上搜索。

1、LWIP移植说明及程序分析2015新哥NUAA(技术交流 279141909)说在前面LWIP,这个轻量级的TCP/IP协议,说来惭愧,把我虐得够惨的,今天算是第三次接触Iwip 了,第一次是认真看了别人移植可以ping通的程序,后来我也参照野火的以太网文档一步步的移植了一次,但不管怎么调都有bug! bug ! bug ! 一气之下就不想再碰了!这两天想想又很不甘心,于是乎,我又开始移植起来移植要点这次也首先是基于无操作系统的移植,在后期再移植基于 ucou2的网络协议。那么在这里我就首先带领那些炙热于lwip协议但又因网上的移植资料残缺不全而苦无移植良策的同志们来一次彻底的lwip移植吧(

2、好长,说的我好累)!本文档是基于 Stm32f103+ENC28J06的移植(如果是stm32f107就不是这种方法了,107处理器自带MA(控制器,只需要外接一个PHY控制器和以太网变压器就可以实现以太网功能。)我发现上一次移植是照葫芦画瓢,完全没有理解移植的要点,在这里我简单的总结一下移植要点和出现bug的原因吧。移植要点1:复制opt.h文件到新建的Iwipopt.h 文件,并按照处理器资源与实际需求 修改。(虽然lwipopt.h 是有opt.h文件修改得到的,但 opt.h文件仍然有用,里面涉及到 的条件编译在协议的正常运行中是必要的,在keil4中要同样包含在路径中。换句话说,只要

3、在其他文件里没有对opt.h中条件编译的对象进行重定义,那么就要以opt.h中的条件编译为准,如果读者删掉opt.h后可以看到很多 bug)。移植要点二:编写enc28j60的驱动文件(含头文件)。(函数模块包括读控制寄存器、向以太网控制器写入命令、读取buff的数据、向buffer写入数据、选定将要操作的bank、读取控制寄存器的内容、写入数据到控制寄存器、向PHY写入控制参数、初始化以太网控制 器、发送数据包函数、接收数据包函数)。以上括号中的函数可以查看enc28j60的datasheet自己写,也可以网上下载借鉴别人写好的。移植要点三:编写网络处理函数netconfig.c(与对应的n

4、etconfig.h)。主要是初始化lwip协议栈、以及做一些系统时钟中断等处理。这一句将enc28j6与lwip 连接起来:netif_add(&en c28j60,& paddr,&n etmask,&gw, NULL,& ethernetif_i nit,ðer net_in put);ethernetif_init, ethernet_input是 lwip 协议中 neif 与外设接口的函数。移植要点四:修改路径为 中 ethernetif.c文件。原协议栈中ethernetif.c只提供了一些子函数的模板,要实现通信功能还要根据网卡(enc28j60 )进一步修改。需修改的子

5、函数有:网卡初始化函数(low_level_init)、底层发送数据函数(low_level_output )、底层接收数据函数(low_level_input)、数据输入处理函数(ethernetif_input )。对以上四个要点进行正确的配置后,就完成了移植步骤的一大半了。但移植的最大问题往往不是出在这儿。往往是读者对keil的不熟悉,比方说头文件路径是不是正确的包含了, 这往往是出现bug的根本原因所在。那接下来我们就真正手把手去移植 lwip 吧,在移植的过程中呢, 带读者简要分析一下程序, 就当做学习一下嵌入式及编程咯。Step1 :在移植的时候,我们也常常需要利用 中的文件。解压

6、后,在 目录下有一些针对特定平台移植时使用的文件, 选择进入 其中一个目录,如 。我们需要用到的是 cc.h 、 perf.h (不需修改)和 sys_arch.h (可以暂不移植,根据操 作系统而定)文件,通常把它复制出来存放到自己工程中的arch文件夹中。cc.h包含了 LwlP对于基本数据类型的定义。 perf.h 文件是和系统统计和测量有关的头文件, sys_arch.h 定 义了与系统有关的信号量、 邮箱及线程(这里是基于无操作系统的移植暂时不需要对其进行 更改)。其中 cc.h 要根据编译器平台与处理器平台等进行修改。 还有一个 lwipopt.h 文件也要 根据 中的 opt.h

7、 文件进行修改。(其实 lwiopts.h 起名无所谓, 只要将 opt.h 中包含的头文件 lwipopts.h 改为你新建的 .h 文件 一致就可以了, 但里面的内容配置包含用户对协议栈内核的参数配置,要根据实际情况进行更改,有时候严格按照文档对应来更改也会出错,可能要删除 opt.t 中的条件编译,尽量简 洁明朗一点,其中#define NO_SYS 1 #define LWlP_NETCONN 0 这两个是很重要的!定义错了或不定义都会导致bug!)Step2 :在完成以上的三个文件的移植后, 就已经完成一小部分工作量, 虽然很简单, 但一定要 细心哦亲! 接下来看一下 enc28j6

8、0 的驱动文件吧。 这部分文件批量购买的话芯片公司会提供 源代码,也可以通过论坛等途径下载到的,需要考验读者的信息搜索能力啦!/* 函数名:main.c* 描述 :main* 输入 :无* 输出 :无*#include include.h_lO uint32_t LocalTimeint main(void) uart_init(9600); ENC_SPl_lnit();SysTick_lnit(); /* 初始化完成之后,= 0;/ 串口初始化为 9600延时函数初始化 通过下面的心跳函数进行对函数的访问了直接通过结构体 neif-input(ethernet_input()说明:ethe

9、rnet_i nput()和ethernetif_i nput这两个函数是有区别的,ethernetif_input 是调用 ethernet_input 函数的,但是初始化 neif_add 结构体 的时候还是 ethernet_input 这个函数。 */LwIP_Init();httpd_init();while ( 1 )/* 轮询 */LwIP_Periodic_Handle(LocalTime);在以上程序 LwIP_Init() 中有一句程序语句为:netif_add(&enc28j60, &ipaddr, &netmask, &gw, NULL, ðernetif_ini

10、t, ðernet_input);其中ethernetif_init, ethernet_input将LWIP协议与enc28j60结合起来了,实现了网卡的网络功能。ethernetif_init中的low_level_init( netif )是网卡初始化函数(包括ma(地址写入网卡及网卡的初始化。ma(地址结构为00:00:00:00:00:00:00,48位,其中前三个为芯片生产商定义的, 后面三个可以认为定义, 如果前面的数据随意改动了再编译的话, 结果 一想而知:有 bug!)下面就结合enc28j60的datasheet分析一下以太网的初始化程序:/* 函数名:enc28j6

11、0Init* 描述 :初始化以太网控制器* 输入 :MA地址* 输出 :无*/void enc28j60Init(u8 * macaddr)/* CS 端口为输出 */01 / ENC28J60_RSTH();/* 禁止 ENC28J60 */02 ENC28J60_CSH();/* ENC28J60 软件复位 该函数可以改进 */03 enc28j60WriteOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET);/* 设置接收缓冲区起始地址 该变量用于每次读取缓冲区时保留下一个包的首地址 */ 04 NextPacketPtr = RXSTART_

12、INIT;/* 设置接收缓冲区 起始指针 */05 enc28j60Write(ERXSTL, RXSTART_INIT & 0xFF);06 enc28j60Write(ERXSTH, RXSTART_INIT 8);/* 设置接收缓冲区 读指针 */07 enc28j60Write(ERXRDPTL, RXSTART_INIT & 0xFF);08 enc28j60Write(ERXRDPTH, RXSTART_INIT 8);/* 设置接收缓冲区 结束指针 */09 enc28j60Write(ERXNDL, RXSTOP_INIT & 0xFF);10 enc28j60Write(ER

13、XNDH, RXSTOP_INIT 8);/* 设置发送缓冲区 起始指针 */11 enc28j60Write(ETXSTL, TXSTART_INIT & 0xFF);12 enc28j60Write(ETXSTH, TXSTART_INIT 8); /* 设置发送缓冲区 结束指针 */13 enc28j60Write(ETXNDL, TXSTOP_INIT & 0xFF);14 enc28j60Write(ETXNDH, TXSTOP_INIT 8);/* 使能单播过滤 使能CR(校验 使能 格式匹配自动过滤*/ 格式匹配字节 / 格式匹配字节 / 格式匹配字节 / 格式匹配字节15 en

14、c28j60Write(ERXFCON, ERXFCON_UCEN | ERXFCON_CRCEN | ERXFCON_PMEN);16 enc28j60Write(EPMM0, 0x3f);17 enc28j60Write(EPMM1, 0x30);18 enc28j60Write(EPM(SL, 0xf9);19 enc28j60Write(EPM(SH, 0xf7);/*使能MA(接收 允许MA发送暂停控制帧 当接收到暂停控制帧时停止发送*/20 enc28j60Write(MA(ON1, MA(ON1_MARXEN | MA(ON1_TXPAUS | MA(ON1_RXPAUS);/* 退出复位状态 */21 enc28j60Write(MA(ON2, 0x00);/*用0填充所有短帧至60字节长 并追加一个CRC发送CR(使能 帧长度校验使能 MAC全双工使能 */* 提示 由于ENC28J6(不支持802.3的自动协商机制,所以对端的网络卡需要强制设置为全双工 */22 enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0 |MACON3_TXCRCEN | MACON3_FRML

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号