应用笔记 4205

用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方式授权。完整的源代码可从https://github.com/adamdunkels/uip下载。

当然,对于大多数应用,没有必要完全运行TCP/IP,过于浪费。uIP具有一整套功能,符合全功能主机的最低需求,并且可以避免其它简单IP堆栈存在的"特殊情况"。

编译环境

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

MAXQ2000有2kB的数据存储器。使用这种数据存储器时必须谨慎,因为缓冲器必须用来处理IP数据包的内容。为了最大限度地利用数据存储器,所有常数都存储在代码空间内,并根据需要复制到一个固定大小的RMA缓存区。

uIP堆栈的使用

uIP堆栈可以看成一个事件循环,超时基于结构时钟设定。在主循环中,MAC/PHY接收到的数据包由uip_arp_ipin()uip_input()处理。这些调用会产生一个输出数据包,必须由MAC/PHY驱动程序传输。

然后检查计时器,清理已关闭连接及一段时间未出现的ARP表项,并调用应用程序回调函数以进行重发。主要事件循环为样板代码,大多数应用中无需改变。

注意:uIP实现了非常小的TCP窗口尺寸,这一点非常重要,只能有一个重要的(un-ACKed)数据包等候处理,有时可能需要重发。

实际应用处理由函数UIP_APPCALL完成。调用时,应用程序回调功能会检查几个功能并返回uIP当前状态。其中最重要的状态是:uip_connected()uip_closed()uip_aborted()uip_timedout()uip_newdata()and uip_rexmit()。前四个函数管理输入连接的打开和关闭;后两个函数管理数据的输入和输出。

当新数据到达套接字等待应用程序处理时,uip_newdata()将返回一个非零的结果。然后应用程序进行数据处理,这些数据保存在uip_appdata指向的缓冲区中,也可以返回响应。所有数据,包括以太网链路层和IP头储存在uip_appdata

如果网络丢掉返回至peer的数据的任何部分,应用将通过计时器超时调用应用程序回调功能并且uip_rexmit()返回一个非零的结果。

在这个点上uIP与其他IP堆栈不同。通常情况下,TCP数据包的转发由IP协议栈处理。当uip_rexmit()标记出现时uIP需要应用程序转发丢失的数据,可以节省存储空间。转发可以通过重新生成数据来实现,或将先前产生的数据保存在缓冲区以供转发。

MAC/PHY驱动器

发送和接收以太网IP数据包时,必须向uIP提供MAC/PHY驱动程序代码。API相当简单:驱动器必须发出信号表明输入以太网的帧准备就绪等待处理; 在线接收和传送数据包时必须调用函数。这些调用由macphy.c实现,从主事件循环调用。

本文中我们选择了Microchip ENC28J60 SPI-Ethernet芯片。该集成MAC/PHY通过SPI和8kB的数据缓冲存储器访问。图1为MAXQ2000和ENC28J60的连接电路。

图1. MAXQ2000微控制器和SPI至以太网转换之间的电路连接原理图
图1. MAXQ2000微控制器和SPI至以太网转换之间的电路连接原理图

实施uIP堆栈时,假设整个IP数据报驻留在存储器中。MAXQ2000有2kB的数据RAM,可能会用于其他任务,所以从以太网复制多达1500字节MTU数据包是不明智的。相反,可以用最大段长度的TCP特性来规定不接受超过500字节的字段,包括以太网链路层和IP头。段的大小对于大多数应用来说可以满足大吞吐量的要求。此外,规定MAC/PHY放弃超过500字节的数据包。

项目示例源代码包括位于文件macphy.c中的MAC/PHY驱动程序代码,相关文件包括macphy.hmacphy_priv.h

示例应用

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

然后应用程序从PCB上的1-Wire® DS2502-E48检索一个唯一的以太网硬件地址。必须将该硬件地址告知MAC/PHY驱动器和uIP堆栈。执行两次调用即macphy_init()uip_setethaddr()来设置这方面的信息。

调用uip_init()进行uIP堆栈初始化,同时设置在编译默认IP地址、网络掩码、网关设置。

当输入连接完成后,向peer打印问候语。客户端发送的文字以"回声"的形式被送回,除了那些已经逐字母转换过的字。

单片机系统具有充足的资源执行系统的主要功能。例如,在高尔夫球场洒水系统中,可以用中断系统提供的实时时钟在适当的时间打开和关闭喷洒阀门。

由于TCP/IP可以无缝处理超时和转发,因此网络接口无实时限制。因超时而导致连接被删除之前,TCP连接通常会花费数分钟至数小时,因此,微控制器代码可以管理网络连接将其作为后台任务。

结论

用免费uIP堆栈很容易实现MAXQ2000联网。uIP本身的事件驱动性质使其适合单片机系统的远程监控和控制。

本应用笔记描述了一个简单的应用程序执行过程,该程序可以扩展以创建更复杂的系统。示例应用程序的源代码包括MAC/PHY驱动程序,可点击下载(ZIP, 112 kB)。