使用uIP堆栈将MAXQ微控制器联网

描述

本应用笔记介绍如何使用uIP TCP/IP网络堆栈将MAXQ®微控制器联网。常用的SPI™转以太网IC用作此应用的MAC/PHY。MAXQ2000作为微控制器示例。

介绍

系统的远程监测和控制可能是任何微控制器应用中最有价值的功能之一。想象一下,一个高尔夫球场的大型草坪喷水灭火系统,其中系统应向主计算机报告故障。这样的系统几乎消除了人工观察系统正常运行的需要。

许多通信方法,如RS-232串行或红外,可用于实现该系统内远程设备的控制和监控。但是,所有这些方法都绑定到涉及不兼容传输介质和协议的特定接口,并且距离有限。

以太网互联网协议 (IP)

互联网协议为上述挑战提供了解决方案。所有现代操作系统都实现了 IP 堆栈。虽然IP可以在各种传输介质上运行,但以太网是迄今为止最普遍的。此外,由于采用交换和路由网络拓扑结构,以太网不受距离限制。

随着带有板载缓冲器的先进MAC/PHY集成电路的出现,我们可以使用微控制器和以太网IP来控制和收集来自几乎任何远程系统的数据。在本应用笔记中,我们将演示如何使用免费的uIP堆栈和SPI转以太网IC将MAXQ2000微控制器联网。

uIP 简介

uIP(发音为“micro IP”)提供了一个最小的IP堆栈,其中包括TCP,UDP和ICMP协议。uIP由Adam Dunkels开发,并在BSD风格的许可证下发布。

当然,对于大多数应用程序来说,完全实现 TCP/IP 既没有必要,也不是谨慎的。uIP 提供了一组功能,可满足全功能主机的最低要求,并且不需要像其他一些轻量级 IP 堆栈那样的“特殊情况”例外。

编译器环境

用于C的Rowley CrossWorks 1.1 build 1编译器用于编译,汇编和链接该项目。为了便于调试,禁用了所有代码优化功能。最终代码大小仅为MAXQ2000可用程序闪存的一小部分。

MAXQ2000具有2kB的可用数据存储器。我们必须明智地使用此数据存储器,因为必须为处理IP数据包内容分配缓冲区。为了优化数据存储器的使用,所有常量字符串都存储在代码空间中,并根据需要复制到固定大小的RAM缓冲区。

使用 uIP 堆栈

uIP 堆栈可以看作是一个事件循环,其超时基于特定于体系结构的时钟代码。在主循环中,MAC/PHY 接收的任何数据包都将由 uip_arp_ipin() 和 uip_input() 处理。这些调用可能会生成输出数据包,该数据包必须由 MAC/PHY 驱动程序代码传输。

然后检查计时器以清理一段时间未看到的已关闭连接和 ARP 表条目,并调用应用程序回调以进行重新传输。主事件循环是样板代码,对于大多数应用程序不需要更改。

请务必注意,uIP 实现的 TCP 窗口大小非常小,因此一次只有一个未完成(未确认)数据包可供处理,并可能重新传输。

真正的应用程序处理发生在为UIP_APPCALL定义的函数中。调用时,应用程序回调可能会检查返回 uIP 当前状态的多个函数。这些状态中最重要的是:uip_connected()、uip_closed()、uip_aborted()、uip_timedout()、uip_newdata()和uip_rexmit()。前四个函数管理传入连接的打开和关闭;后两个函数处理传入和传出数据。

当新数据到达套接字供应用程序处理时,uip_newdata() 将返回非零结果。然后,应用程序应处理数据(这些数据保存在 uip_appdata 指向的缓冲区中),并选择性地返回响应。所有数据(包括以太网链路层和 IP 报头)都存储在uip_appdata中。

如果网络丢弃返回给对等方的任何部分数据,则应用程序回调将通过计时器超时调用,uip_rexmit() 将返回非零结果。

正是在这一点上,uIP 与其他 IP 堆栈不同。通常,TCP 数据包重新传输由 IP 堆栈处理。uIP 通过要求应用程序在显示 uip_rexmit() 标志时重新传输丢失的数据来节省内存。这种重新传输可以通过重新生成数据来完成,或者通过将先前生成的数据保存在缓冲区中以进行重新传输来实现。

MAC/PHY 驱动程序

要通过以太网传输和接收 IP 数据报,我们必须向 uIP 提供 MAC/PHY 驱动程序代码。API 相当简单:驱动程序必须发出信号,表明传入的以太网帧已准备好进行处理;必须有调用才能接收数据包并在网络上传输数据包。这些调用在 macphy.c 中实现,并从主事件循环调用。

对于此应用,我们选择了Microchip ENC28J60 SPI转以太网芯片。此集成 MAC/PHY 可通过 SPI 访问,并具有 8kB 的数据包缓冲存储器。图1所示为MAXQ2000与ENC28J60之间的连接。

以太网


图1.原理图示出了MAXQ2000微控制器与SPI转以太网IC之间的连接。

当前实现的 uIP 堆栈假定整个 IP 数据报驻留在内存中。MAXQ2000具有2kB的数据RAM,可能需要用于其他任务,因此将数据包从以太网复制到1500字节的MTU是不明智的。相反,我们使用最大段大小的 TCP 功能来指定我们不接受超过 500 字节的段,包括以太网链路层和 IP 标头。此段大小为大多数应用程序提供了足够的吞吐量。此外,我们指示 MAC/PHY 以静默方式丢弃任何超过 500 字节的数据包。

此项目的示例源代码包括文件 macphy.c 中的 MAC/PHY 驱动程序代码以及关联的包含文件 macphy.h 和 macphy_priv.h。

示例应用程序

我们的示例应用程序实现了在 TCP 端口 23 上侦听的修改后的回显服务器。首先,启动MAXQ2000的实时时钟(RTC)进行事件定时。然后,我们初始化 SPI 硬件并使用默认设置加载 MAC/PHY。

然后,应用从PCB上的1-Wire® DS2502-E48中检索唯一的以太网硬件地址。必须将此硬件地址通知 MAC/PHY 驱动程序和 uIP 堆栈。进行两次调用 macphy_init() 和 uip_setethaddr() 来设置此信息。

uIP 堆栈通过调用 uip_init() 进行初始化,并设置编译的默认 IP 地址、网络掩码和网关。

传入连接完成后,将向对等方打印问候语。客户端发送的任何文本都以“回显”方式发回,除了所有单词都是逐个字母颠倒的。

仍然有充足的计算资源来执行微控制器系统的主要功能。在我们的高尔夫球场洒水器示例中,我们可以使用 RTC 上可用的中断系统在适当的时间打开和关闭喷水灭火阀。

网络接口没有实时限制,因为 TCP/IP 可以无缝处理超时和重新传输。TCP 连接通常需要几分钟到几小时才能因超时而断开连接。因此,微控制器代码可以将网络连接作为后台任务进行管理。

结论

MAXQ2000的联网使用免费的uIP堆栈很容易实现。uIP的事件驱动特性有助于远程监视和控制微控制器系统。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分