读书人

ENC28J60学习札记第1部分

发布时间: 2013-11-02 19:41:10 作者: rapoo

ENC28J60学习笔记——第1部分
1前言

嵌入式以太网开发,可以分为两个部分,一个是以太网收发芯片的使用,一个是嵌入式以太网协议栈的实现。以太网收发芯片的使用要比串口收发芯片的使用复杂的多,市面上流通比较广泛的以太网收发芯片种类还不少,有SPI接口的ENC28J60,也有并口形式的RTL8019S,CS8900A等。嵌入式以太网协议栈有著名的uIP协议栈,Lwip协议栈,还有其他嵌入式高手开发的协议栈。无论是硬件还是软件,都无法分出高低,适合项目需求的才是最好的。

1.1 写作理由

再说明一下我写作的理由。以前从淘宝上购买过ENC28J60,店家信誓旦旦地说能提供51AVR LPC STM32等多个平台的代码,可以实现一个网页控制LED。头脑一热买了回来,买回来才发现,店家提供的资料零零散散,不易弄懂。几经周转,发现原来这些ENC28J60的代码都出自一个地方——AVRNET,源自老外的一个开源项目。把最原始的代码拿来细细品味,以太网协议就不那么神秘了。在这里说一下ENC28J60的使用,熟悉了ENC28J60的驱动可以分几步走。第一步,通过ENC28J60移植uIP或者lwIP协议栈,实现TCP或是UDP通信,第二,顺着AVRNET项目走,实现一个简单的web服务器,运行静态或者动态网页。嵌入式以太网和计算机以太网开发不同,对于TCP通信而言没有socket套接字,对于网页编程而言也没有IIS或PHP,所示实现起来会相对麻烦,但是也非常有乐趣。

1.2 资料准备

嵌入式以太网开发是非常复杂的工作,在开始之前最好先大致浏览ENC28J60的使用手册。除此之外,需要认真阅读TCP IP相关知识,推荐一本图书《嵌入式Internet TCP/IP基础、实现和应用》。嵌入式开发是一个反复借鉴的过程。该部分代码参考了AVRNET项目和奋斗开发板的相关范例。

AVRNET项目网址链接:http://www.avrportal.com/?page=avrnet。

虽然AVRNET项目所使用的MCU为ATmega32,但是认真阅读源代码之后也可以方便的移植到其他的MCU平台,例如STM8、STM32和MSP430等。

2 寄存器和寄存器操作

ENC28J60的寄存器很多,操作这些寄存器需要一个良好的代码组织工作。在AVRNET项目中,把ENC28J60的驱动分解成ENC28J60.h文件和ENC28J60.c文件。H文件中主要描述ENC28J60寄存器的基本定义,而C文件主要实现了这些寄存器的操作。

2.1 寄存器定义

首先分析一下ENC28J60.h这个头文件。阅读数据手册之后,会发现ENC28J60寄存器数量较多,通过分析和整理,操作ENC28J60的寄存器需要注意以下3点。

(1) 共有三种不同形式的寄存器——控制寄存器以太网寄存器PHY寄存器,不同的寄存器以不同的字母开头,以E、 MA和MI加以区分。操作这三种不同的寄存器需要不同的组合命令。

(1) 寄存器被分布在4个不同的bank中,也就是说存在地址相同的寄存器,但是这些寄存器却位于不同的分区中,在操作寄存器之前必须选中正确的bank。

(3) 虽然存在4个bank,但是有5个寄存器在4个bank的位置相同,它们是EIE、 EIR、ESTAT、ECON1、ECON2。

AVRNET项目中,寄存器被定义成8位长度,而这8位长度包含了三个部分,地址bit7(最高位)用以区分PHY和MAC寄存器,PHY寄存器的操作最为特殊;地址bit6和bit5用以区分BANK,2位空间正好区分4个BANK;地址的最后5位才是寄存器的地址。通过这种方式就可以区分所有的寄存器了。列举了几行代码。由于头文件很长,所以不全部列出。

图2.1 硬件缓冲区结构

(2) 对于发送缓冲区而言,需要指定发送缓冲区写指针,使用写缓冲区命令操作该部分缓冲区,写指针的地址会不断增长,若遇到结束地址会重新返回起始地址。对于接收缓冲区而言就稍微复杂一点,每次读取之前必须明确该次操作时的读指针位置,根据前文的代码,缓冲区读指针的起始地址为0,在第一次读操作发生之后需要立即计算下次读操作的读指针地址。ENC28J60读缓冲区时,被读取的内容并不全是以太网负载,在以太网负载之前还有下一个数据包的地址指针(占两个字节),接收状态向量(占4个字节),之后才是“真实”以太网负载,该负载包括目标MAC地址,源MAC地址,数据包类型等等;最后为CRC校验字节。

ENC28J60学习札记——第1部分

图2.2 接收数据包结构

读书人网 >其他相关

热点推荐