`
hulianwang2014
  • 浏览: 733161 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

ENC28J60学习笔记——第1部分

 
阅读更多

0.相关资料

相关资料中包括其他精彩博文和代码仓库
嵌入式 TCP IP 资料汇总
【ENC28J60学习笔记——索引】 【第1部分】【第2部分】【第3部分】【第4部分

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项目网址链接

虽然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位才是寄存器的地址。通过这种方式就可以区分所有的寄存器了。列举了几行代码。由于头文件很长,所以不全部列出。

// bank0 寄存器
#define ERDPTL            (0x00|0x00)
#define ERDPTH            (0x01|0x00)
#define EWRPTL            (0x02|0x00)
// bank1 寄存器
#define EHT0              (0x00|0x20)
#define EHT1              (0x01|0x20)
#define EHT2              (0x02|0x20)
// bank2 寄存器
#define MACON1           (0x00|0x40|0x80)
#define MACON2           (0x01|0x40|0x80)
#define MACON3           (0x02|0x40|0x80)
//bank3 寄存器
#define MAADR1           (0x00|0x60|0x80)
#define MAADR0           (0x01|0x60|0x80)
#define MAADR3           (0x02|0x60|0x80)


例如ERDPTH为位于BANK0的以太网寄存器,第一个数字0x01代表BANKx中的具体地址,该地址为0x01,第二个数字0x00代表BANK编号,该BANK地址为0EHT1为位于BANK1中的控制寄存器,第一个0x01代表BANKx中的具体地址,该地址为0x01,第二个0x20代表BANK编号,此处BANK编号为1。请注意由于BANK编号被保存在BIT6BIT5,所以此处为0x20而不是0x10MACON2为位于BANK2的以太网寄存器,第一个数字0x01代表在该BANKx中的寄存器地址,第二个数字0x40代表BANK编号,此处BANK编号为2,而第三个数字0x80代表该寄存器为以太网寄存器或是PHY寄存器,该寄存器的操作比较特殊。

为了方便寄存器操作,头文件中还定义了寄存器地址操作的掩码,简单而言就是需要查看哪些位,不需要查看哪些位。

/* 寄存器地址掩码 */
#defineADDR_MASK        0x1F
/* 存储区域掩码 */
#defineBANK_MASK        0x60
/* MAC和MII寄存器掩码*/
#defineSPRD_MASK         0x80

另外还有比较特殊的5个控制寄存器,EIE,EIR,ESTAT,ECON2和ECON1

/* 关键寄存器 */
#defineEIE                     0x1B
#defineEIR                     0x1C
#defineESTAT                   0x1D
#defineECON2                  0x1E
#defineECON1                  0x1F


2.2 寄存器操作命令

寄存器操作命令也可称为寄存器操作码。为了实现寄存器的操作,ENC28J60定义了6+1个寄存器操作命令(操作码)。操作相关寄存器至少有读寄存器命令,写寄存器命令;发送或接收以太网数据则必有写缓冲区命令或读缓冲区命令;为了加快操作,对于某些控制寄存器而言还可以有置位或者清零某位的命令;最后加上一个软件复位命令,锦上添花。

/* 读控制寄存器 */
#define ENC28J60_READ_CTRL_REG         0x00
/* 读缓冲区 */
#define ENC28J60_READ_BUF_MEM          0x3A
/* 写控制寄存器 */
#define ENC28J60_WRITE_CTRL_REG        0x40
/* 写缓冲区 */
#define ENC28J60_WRITE_BUF_MEM         0x7A
/* 位域置位 */
#define ENC28J60_BIT_FIELD_SET         0x80
/* 位域清零 */
#define ENC28J60_BIT_FIELD_CLR         0xA0
/* 系统复位 */
#define ENC28J60_SOFT_RESET            0xFF


2.3 接收和发送缓冲区分配

以太网数据的接收和发送离不开驱动芯片内部的RAM,也可称之为硬件缓冲区。ENC28J60包括8K 的硬件缓冲区,该硬件缓冲区一部分被接收缓冲区使用,另一部分为发送缓冲区使用。控制ENC28J60的最终目的为操作该硬件缓冲区。执行以太网发送命令时,向发送缓冲区中填充数据,并触发相关寄存器发送以太网数据;执行以太网接收命令时,通过查询相关寄存器或者外部中断的方式获得以太网数据输入事件,接着从接收缓冲区中读取相关数据。

(1) 把缓冲区划分为两个部分。把8K的硬件缓冲区划分为两个部分至少需要四个参数,接收缓冲区需要一个起始地址和一个结束地址加以描述,发送缓冲区也需要一个起始地址和一个结束地址加以描述。最理想的方式,两个缓冲区完全占据了8K的硬件缓冲区,完美地利用这一空间。由于ENC28J60的寄存器长度为8位,而硬件缓冲区的大小为8K,所以前面提到的4个地址需要8个寄存器才可以完全描述,需要把单个地址分为高8位和低8位。在AVRNET项目中,接收缓冲区较大,而发送缓冲区较小。在以太网协议中,最大的报文长度为1518字节,而最小报文长度为60字节。发送缓冲区等于或略大于1518字节,剩余的部分全部分配给接收缓冲区。接收缓冲区较大也是考虑到AVR的处理能力有限,若某个时间点收到多个以太网报文,可以先把报文闲置与硬件缓冲区中,待MCU空闲时再从缓冲区中取出。

/* 接收缓冲区起始地址 */
#define RXSTART_INIT                0x00
/* 接收缓冲区停止地址 */
#define RXSTOP_INIT                 (0x1FFF - 0x0600 - 1)
/* 发送缓冲区起始地址 发送缓冲区大小约1500字节*/
#define TXSTART_INIT                (0x1FFF - 0x0600)
/* 发送缓冲区停止地址 */
#define TXSTOP_INIT                 0x1FFF

图2.1 硬件缓冲区结构

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


图2.2 接收数据包结构

分享到:
评论

相关推荐

    ENC28J60_AT89S52.rar_ C51 ENC28J60_AT89S52_ENC28J60_enc28j60 C

    ENC28J60_AT89S52 驱动程序

    ENC28J60驱动

    ENC28J60是一款由Microchip Technology制造的以太网控制器,常用于嵌入式系统,如Arduino或Raspberry Pi等。驱动程序是连接硬件设备与操作系统之间的桥梁,使得操作系统能够识别并控制ENC28J60进行网络通信。在本...

    ENC28J60_ENC28J60_zip_

    ENC28J60是一款由Microchip Technology公司生产的高性能、低成本的以太网控制器,主要应用于嵌入式系统。在本文中,我们将深入探讨这款芯片的主要特性、功能、工作原理以及如何在实际项目中进行应用。 ENC28J60是...

    STM32 ENC28J60

    ENC28J60的核心是其内置的MAC(Media Access Controller)和PHY(Physical Layer)模块,这两个部分分别负责数据链路层和物理层的通信。SPI(Serial Peripheral Interface)接口使得ENC28J60能与MCU通过四线串行通信...

    ENC28J60模块原理图

    标题“ENC28J60模块原理图”指的是一个基于ENC28J60以太网控制器芯片的模块的原理图,它为嵌入式系统或单片机提供了以太网连接功能。ENC28J60是Microchip公司生产的一款独立的以太网控制器,支持SPI接口,常用于各种...

    C51 Uip Web用proteus 仿真器仿真ENC28J60

    在本文中,我们将深入探讨如何使用Proteus仿真器来模拟ENC28J60以太网控制器,并结合uIP TCP/IP协议栈在C51微控制器上进行仿真。这是一项非常实用的技术,对于理解嵌入式系统网络通信以及开发基于8位微控制器的网络...

    ENC28J60以太网模块资料_ENC28J60_

    ENC28J60以太网模块是一款广泛应用在嵌入式系统中的网络接口控制器,它由Microchip Technology公司设计生产。这款芯片具有独立的SPI(串行外围接口)通信能力,使得它能与各种微处理器或微控制器进行高效的数据交换...

    ENC28J60资料

    ENC28J60以太网控制器数据手册.pdf, ENC28J60网络控制器原理图.pdf, ENC28J60驱动程序代码示例.zip, Microchip Ethernet Library_v3.00.05.zip, ENC28J60应用笔记.pdf ENC28J60是一款由Microchip Technology公司...

    网卡控制器ENC28J60的AVR单片机ATmega16程序源代码c,实现232toUDP功能,有非常详细的注释

    ENC28J60是一款高性能、低功耗的以太网控制器,广泛应用于嵌入式系统中,而ATmega16是一款微控制器,具有丰富的I/O资源和处理能力,非常适合此类应用。 首先,我们需要了解ENC28J60的工作原理。这款控制器集成了SPI...

    RT-Thread Studio环境下lwip+ENC28J60的使用与调试(完整代码).rar

    lwIP是一个轻量级的TCP/IP协议栈,适用于资源有限的嵌入式系统,而ENC28J60是一款经济高效的独立SPI接口的以太网控制器,广泛用于嵌入式项目。 首先,让我们了解lwIP协议栈。lwIP是由瑞典埃里克松公司开发的一个...

    enc28j60原理图PCB和驱动代码

    ENC28J60是一款广泛应用在嵌入式系统中的以太网控制器,由Microchip Technology公司生产。这款芯片以其小巧的封装、低功耗以及强大的网络功能,深受电子工程师喜爱。本文将围绕ENC28J60的原理图、PCB设计以及针对51...

    ENC28J60程序代码

    - 压缩包中的"网络模块EN28J60_CODE"可能包含实现了ENC28J60功能的源代码、头文件、示例程序和编译脚本,开发者可以通过这些代码学习如何与ENC28J60交互。 7. **实际应用** - ENC28J60常用于智能家居、工业自动化...

    驱动源码 enc28j60

    1. 寄存器操作:ENC28J60的所有操作都是通过对一系列控制寄存器进行读写来完成的。源码中会定义这些寄存器的地址,通过SPI接口进行访问。例如,`ECON1`寄存器控制发送和接收过程,`ERXST`和`ERXND`寄存器定义了接收...

    ENC28J60 源码

    标题 "ENC28J60 源码" 指的是针对 Arduino 平台的 ENC28J60 网络控制器的源代码库。ENC28J60 是一款高性能、低功耗的以太网控制器,常用于嵌入式系统,特别是 Arduino 这样的微控制器平台,它提供了连接到 Ethernet ...

    ENC28J60连接图

    ENC28J60是一款基于SPI接口的以太网控制器,常用于嵌入式系统,如Arduino、Raspberry Pi等平台,提供网络连接功能。在本文中,我们将深入探讨ENC28J60的连接图及其与DSP(数字信号处理器)芯片的配合使用。 首先,...

    enc28j60 enc28j60源代码

    ENC28J60是一款由Microchip Technology制造的以太网控制器,专为嵌入式系统设计。这个芯片集成了MAC(媒体访问控制)和PHY(物理层)功能,允许微控制器通过SPI(串行外围接口)与其进行通信,从而实现设备与以太网...

    enc28j60协定代码

    ENC28J60是一种流行的以太网控制器芯片,常用于嵌入式系统和物联网设备。这个标题"enc28j60协定代码"指的是与ENC28J60芯片相关的网络通信协议实现的源代码。在描述中提到的"工数,英文,电磁学,电子学,电子档"可能是指...

    ENC28J60网络模块常见问题汇总

    ENC28J60网络模块常见问题汇总,解决ENC28J60网络模块的方法

    ENC28J60用户手册

    ENC28J60是一款高效、低成本的独立以太网控制器,特别适合那些需要通过SPI接口与主控制器进行通信的应用。这款芯片由Microchip Technology公司制造,旨在为微控制器提供以太网连接能力,而无需额外的MAC(媒体访问...

Global site tag (gtag.js) - Google Analytics