1、 毕业 设计(论文) 题 目 : 基于 AVR+ENC28J60的互联网基本协议栈实现 专业名称: 通信工程 摘 要 物联网是新一代信息技术的重要组成部分。其英文名称是“ The Internet of things”。由此,顾名思义,“物联网就是物物相连的互联网”。这有两层意思:第一,物联网的核心和基础仍然是互联网,是在互联网基础上的延伸和扩展的网络;第二,其用户端延伸和扩展到了任何物品与物品之间,进行信息交换和通信。物联网就是“物物相连的互联网”。物联网通过智能感知、识别技术与普适计算、泛在网络的融合应用,被称为继计算机、互联网之后世界信息产业发展的第三次浪潮。物联网是互联网的应用拓展,与
2、其说物联网是网络,不如说物联网是业务和应用。因此,应用创新是物联网发展的核心,以用户体验为核心的创新 2.0 是物联网发 展的灵魂。 因此,发展微控制下的联网方案非常必要,所以必须开发出一套基本协议,这起始包括物理层,电气规则决定了整个系统的其他部件的设计,直到传输层 TCP/UDP,高层协议预留开发接口,或使得互联网设备成为从机,方便更多的开发。 虽然网上有著名的 UIP 协议栈,但模块没有分离,使用 FS进行数据交换,不方便二次开发,所以,开发这个项目,就非常必要了。 这里将从基础开发到实际应用,完全解释物联网的应用和基础内核开发。 关键词: 物联网 , 内核开发 , 通信协议 目录 第一
3、章 平台选型 . 6 1.1 MCU 平台分析 . 6 1.1.1 MSP430 超低功耗微控制器 . 6 1.1.2 STC89C5x 系列 51 传统单片机 . 6 1.1.3 STC90L5x 低电压 51单片机 . 6 1.1.4 宽电压 PicPower 技术 AVR . 7 1.1.5 Tiva 新型 ARM 微控制器 . 7 1.1.6 Cypress 最容易开发的微控制器 . 7 1.2 为什么选择 ENC28J60 . 7 1.2.1 W5100 的优劣势分析 . 7 1.2.2 工业以太网现状分析 . 8 1.2.3 ENC28J60 价廉物美 . 8 1.2.4 总体成本
4、分析 . 8 1.3 调试 SPI 接口 . 9 1.3.1 串行外设接口基础 . 9 1.3.2 串行外设接口配置实践 . 10 1.3.3 串行外设 SS 引脚详解 . 12 1.3.4 串行外设接口寄存器 . 13 1.3.5 串行外设接口数据模式 . 14 1.4 电气设计 . 14 1.4.1 焊接测试 . 14 1.4.2 引脚参考 . 15 1.4.3 路由配置 . 17 第二章 硬件内核开发 . 19 2.1 实现基本初始化通信 . 19 2.1.1 SPI 调试 . 19 2.1.2 ENC28J60 的寄存器的详细配置 . 24 2.1.3 ENC28J60 寄存器汇总 .
5、 29 2.1.4 ENC28J60 基本上电初始化 . 31 2.2 实现基本数据包发送接收 . 33 2.2.1 发送数据包 . 33 2.2.1 接收数据包 . 34 2.3 IP 协议的实现 . 34 2.3.1 协议分析 . 35 2.3.2 代码实现 . 36 2.4 UDP 协议的实现 . 38 2.4.1 协议分析 . 39 2.4.2 代码实现 . 39 2.5 ARP 协议的实现 . 40 2.5.1 协议分析 . 40 2.5.2 代码实现 . 41 2.6 ICMP 协议的实现 . 44 2.6.1 协议分析 . 44 2.6.2 代码实现 . 45 2.7 DHCP
6、协议的实现 . 46 2.7.1 协议分析 . 46 2.7.2 过程实现 . 47 2.7.3 代码实现 . 49 2.8 其他功能 . 51 2.8.1 校验和计算 . 51 2.8.2 函数整合和文件分离 . 51 第三章 基于 Arduino 开源硬件的移植 . 54 3.1 从 AVR 到 Arduino 平台 . 54 3.1.1 为什么选用 Arduino . 54 3.1.2 从 C语言到 C+ . 54 3.1.3 从 C+ 到 Arduino . 55 3.1.4 从 Arduino 到 AVR . 56 3.1.5 附 加函数概览 . 57 3.2 从 Arduino 开
7、始实践 . 58 3.2.1 ICMP 回显 . 58 3.2.2 使用 DHCP . 59 3.2.3 作为 Web 客户端 . 60 3.2.4 WOL. 61 3.2.5 Web 服务器 . 62 3.2.6 DDNS. 63 3.2.7 LED 灯控制 . 63 3.2.8 LED 灯图片按钮控制 . 64 3.2.9 LED 灯大图片按钮控制 . 65 3.2.10 NTP 时间同步 . 66 3.2.11 开发方法总结 . 67 3.2.12 基于底层的二次开发 . 68 第四章 其他开发思想 . 69 4.1 低功耗开发思想 . 69 4.1.1 使用 MSP430 进行设备唤醒
8、 . 69 4.1.2 使用 RTC 进行设备唤醒 . 69 4.2 实际项目开 发思想 . 69 4.2.1 使用 WDT 保证程序稳定性 . 69 4.2.2 最迷你的硬件焊接与实际项目 . 69 第五章 总结 . 71 5.1 遇到的问题与解决 . 71 5.1.1 DNS 屏蔽 . 71 5.1.2 TCP 连接数过大 . 71 5.1.3 生成 HEX 文件批量生成 . 71 5.1.4 DHCP 无法使用 . 72 5.1.5 DNS 无法使用 . 72 5.1.6 Arduino + Visual Studio 开发 . 72 5.1.7 程序调试 . 72 5.1.8 程序烧写
9、到 AVR 上无法运行 . 73 5.1.9 ENC28J60 无法启动 . 73 5.1.10 SPI 无效 . 73 5.1.11 Timer 定时器计数 . 73 5.2 应用解决方案 . 74 5.2.1 串口转以太网 . 74 5.2.2 家用物联网 . 74 5.2.3 黑客设备 . 75 附录 参考文献 . 76 第一章 平台选型 1.1 MCU 平台分析 1.1.1 MSP430 超低功耗微控制器 德州仪器 的超低功耗 16 位 RISC 混合信号处理器的 MSP430 微处理器平台为各种低功耗 和便携式应用提供了最终解决方案。 TI 为 MSP430 微处理器提供了包括技术文
10、档、培训、工具和软件在内的功能强大的设计支持。 但 笔者 们接入有线网络,考虑的应该不是高度节能,一句话说, MSP430 是一个很省吃,但也干不了什么大活,是给一些便携的移动设备提供的。 既然是便携式设备 ,怎么不考虑接入无线网络呢 ?另外 F5/F6 系列会非常贵 ,大概普通售价 100 元人民币一颗 ,TQFP 封装 . 1.1.2 STC89C5x 系列 51 传统单片机 虽然 51 单片机价格很便宜,而且 STC 的 51 单片机也支持 IDLE 模式,但就算是 C58 也不能满足需要的空间支持,速度也很慢,在以前的项目中知道,十二分频,或者六分频,都是慢得足以让系统认为网络设备超时
11、,而且传统 51 单片 机的供电电压也不满足大多数芯片的 3.3V 逻辑,还不如多花几毛钱买 MSP430Gx 系列呢 ,当然 ,几百字节的 SRAM 远远不足 ,虽然可以跑外部的RAM,但是成本也就提上去了 . 1.1.3 STC90L5x 低电压 51 单片机 虽然 51 核心也有低压系列,但是速度就更加慢了,以至于 笔者 们无法忍受,而且功耗这个嘛 , 虽然 长期供电,但是价格竟然比 MSP430 还贵。这么说来好像 MSP430 真是个不错的平台,可是他的内存大小实在无法忍受 ,虽然模拟思绪也能读取外部 RAM,但是这毕竟性能和开发难度问题 ,也就只好用不选择了 . 1.1.4 宽电压
12、 PicPower 技术 AVR 宽电压 AVR 支持 1.8V 5.5V 逻辑,速度也能达到 25MIPS,实测超频时候可以到达 40MIPS, 如果轮询数据包,那是效率非常高,虽然被人抛弃,被 Cortex-M3 遗弃,但也不表明他什么用途都没有, AVR 虽然偏贵一点,但是对比 ARM 来说,那算什么呢?而且 AVR 是 Atmel 生产的,稳定性也非常不错的说。 1.1.5 Tiva 新型 ARM 微控制器 32 位 ARM,基于 Cortex-M4F,问题是, 笔者 不涉及浮点运算,是不是有点浪费呢?所以,这个 被忽略了,虽然你有专用定时器用于跑操作系统,但也不是 笔者 们想玩的。
13、如果做的是主机芯片,那么还是非常有可能的。 不过 ,笔者 们小项目 ,用这个可能会出现严重的性能浪费 . 1.1.6 Cypress 最容易开发的微控制器 不可否认,一行代码都不用写,就能写 Cypress 的程序,问题是, 笔者 们这里的程序逻辑这么 复杂,他能满足吗?而且出了 BUG 还不能让 笔者 自己来修补 ,怎么能放心选用呢 。 1.2 为什么选择 ENC28J60 1.2.1 W5100 的优劣势分析 W5100 这个产品是硬件 TCP/IP 协议栈 +MAC+PHY, 也就是 W5100 里面用硬件逻辑电路实现了TCP/IP 的协议栈结构,不需要向 ENC28J60 这样的网络控
14、制器那样还需要一个资源较大的 MCU跑软件协议栈。你直接把 W5100 当外部 RAM 使用, MCU 初始化一下 I/O,寄存器等就能使用了。是一种简易快速拓展 Ethernet 的方案,在稳定性及高效性方面表现也非常突出。” W5100 是 很多厂商 以太网扩展板的选择,各种库文件都很齐全规范,使用起来也很容易。 大多数人 选择 W5100的一个很大的原因在于 W5100 能有效释放主控单片机有限的内存资源,并且嵌入了经过市场验证的、成熟的硬件协议栈。关于价格的问题, 因为高度集成了以太网协议栈,所以价格会偏高,不是 笔者 们需要的价廉物美,而且,如果协议开发得妥当,结构合理,还是很简单的
15、说。 1.2.2 工业以太网现状分析 现在工业以太网一般是 10Mbps 左右,温度范围 -20 - 85 。只要 MCU和 以太网 控制芯片不结 露, 看门狗正常,一般不会出任何问题。 W5100 完全满足,只是价格太高,批量生产的话,划不过来, W5100 的价格是 ENC28J60 价格的 2 3 倍。 淘宝热销 W5100 标准板 如果选择 ENC28J60 虽然要自己设计电路,但其实便宜很多了。 淘宝热销 ENC28J60 SOP 封装芯片 1.2.3 ENC28J60 价廉物美 上面已经说明了 ENC28J60的廉价,因为他没有集成任何协议,所以可以开发出更多的东西,比如现在的 I
16、Pv6,本文会稍有说明的,虽然 ENC28J60 开发的失误随时能造成 网络风暴等很多不可预知的事件,不过,不用担心,本论文将一步一步说明协议的开发。另外 ENC28J60 一样 可以兼容 HR911105A 变压器 (带 RJ45 头 ), 还有内置的 MAC+PHY,一样省了不少元器件。 1.2.4 总体成本分析 笔者 们的微控制器是 Atmel AVR,虽然看起来很贵,但是稳定性很好,之前已经分析过了,计算式 Atmel MEGA2560 也就是 100 元以内,加上 ENC28J60 都很便宜,这里做的是伴随嘛,选的比较低配的 Atmel Mega8 或者低压的 Atmel Mega8
17、L,开发测试为了方便使用 Atmel Mega16嘛,编程器也可以自己制作,一点压力都没有。如果后期 笔者 还可以走 Atmel Mega328P,容量大体积小各种优势。而且可以封装 Arduino 库文件,这样就可以在 Atmel Mega328 上跑一些类似操作系统 的东西玩了,当然,那不是操作系统,但是这样将可以让 Arduino 使用 ENC28J60,此前,所有 Arduino 接入互联网都是使用 W5100 的。 虽然, Arduino 比较便宜,或者说不太适合底层开发,但是在底层做好库文件,然后 上层提高快速建模,也是非常方便的。 1.3 调试 SPI 接口 1.3.1 串行外设
18、接口基础 接口 SPI 允许 ATmega 和外设或其他 AVR 器件进行高速的同步数据传输。 他有很多常规的特性,如下: 全双工,三线同步。 主机或从机操作。 LSB/MSB 操作 可编程比特率 传输结束置位中断 写碰撞检测 可以进入 IDLE 模式 具有倍速模式 SPI 方框图 主机和从机之间的 SPI 连接如 SPI 主从互连逻辑 图 所示, 系统包括两个移位寄存器和一个主机时钟发生器。通过将需要的从机的 SS 引脚拉低,主机启动一次通讯过程。主机和从机将需要发送的数据放入相应的移位寄存器。主机在 SCK 引脚上产生时钟脉冲以交换数据。主机的数据从主机的 MOSI 移出,从从机的 MOS
19、I 移入;从机的数据从从机的 MISO 移出,从主机的 MISO 移入。主机通过将从机的 SS 拉高实现与从机的同步。配置为 SPI 主机时, SPI 接口不自动控制 SS 引脚,必须由用户软件来处理。 对 SPI 数据寄存器写入数据即启动 SPI 时钟,将 8 比特的数据移入从机。传输结束后 SPI 时钟停止,传输结束标志 SPIF 置位。如果此时 SPCR 寄存器的 SPI 中断使能位 SPIE 置位,中断就会发生。主机可以继续往 SPDR 写入数据以移位到从机中去,或者是将从机的 SS 拉高以说明数据包发送 完成。最后进来的数据将一直保存于缓冲寄存器里。配置为从机时,只要 SS 为高,
20、SPI 接口将一直保持睡眠状态,并保持 MISO 为三态。在这个状态下软件可以更新 SPI 数据寄存器 SPDR 的内容。即使此时 SCK 引脚有输入时钟, SPDR 的数据也不会移出,直至 SS 被拉低。一个字节完全移出之后,传输结束标志 SPIF 置位。如果此时 SPCR 寄存器的 SPI 中断使能位 SPIE 置位,就会产生中断请求。在读取移入的数据之前从机可以继续往 SPDR 写入数据。最后进来的数据将一直保存于缓冲寄存器里。 SPI 主从互连逻辑 SPI 系统的发送方向只有一个缓冲器,而在接收方向有两个缓冲器。也就是说,在发送时一定要等到移位过程全部结束后才能对 SPI 数据寄存器执
21、行写操作。而在接收数据时,需要在下一个字符移位过程结束之前通过访问 SPI 数据寄存器读取当前接收到的字符。否则第一个字节将丢失。 工作于 SPI 从机模式时,控制逻辑对 SCK 引脚的输入信号进行采样。为了保证对时钟信号的正确采样, SPI 时钟不能超过 fosc/4。 SPI 使能后, MOSI、 MISO、 SCK 和 SS 引脚的数据方向将按照 引脚映射表 所示自动进行配置。 引脚 SPI 主机 SPI 从机 MOSI 用户定义 输入 MISO 输入 用户定义 SCK 用户定义 输入 SS 用户定义 输入 1.3.2 串行外设接口 配置 实践 下面的例 程说明如何将 SPI 初始化为主机,以及如何进行简单的数据发送。例子中 DDR_SPI必须由实际的数据方向寄存器代替; DD_MOSI、 DD_MISO 和 DD_SCK 必须由实际的数据方向代替。比如说, MOSI 为 PB5 引脚,则 DD_MOSI 要用 DDB5 取代, DDR_SPI 则用 DDRB 取代。 汇编语言: SPI_MasterInit: ; 设置 MOSI 和 SCK 为输出,其他为输入 ldi r17,(1DD_MOSI)|(1DD_SCK)