ENC28J60符合IEEE802.3的全部规范,采用了一系列包过滤机制以对传入数据包进行限制,内部有一个NMA模块,与主控制器通过两个中断脚和SPI实现通信。
寄存器:
共有三种不同形式的寄存器——控制寄存器,以太网寄存器 和PHY寄存器。主控制器通过SPI口对ENC芯片控制寄存器进行读写。以太网寄存器包含一个供以太网控制器发送和接收存储空间,主控制器使用SPI接口对该存储的空间的容量进行编程。只能通过读缓冲器和写缓冲器的SPI指令来访问以太网缓冲器。PHY寄存器用于对PHY模块配置、控制和状态获取,不能通过SPI接口直接访问,只可通过MAC中的MII访问。
控制寄存器:
控制寄存器一共分配在四个bank中,所以有些寄存器地址相同但是分区不同,使用时要先选择分区。
所有bank的最后五个单元1Bh-1Fh都指向同一组寄存器:EIE、EIR、ESTAT、ECON2、ECON1。它们是控制和监事器件工作的关键寄存器,所以可以不切换bank的情况下访问它们。
寄存器被定义成8位长度,而这8位长度包含了三个部分,地址bit7(最高位)用以区分PHY和MAC寄存器,PHY寄存器的操作最为特殊;地址bit6和bit5用以区分BANK,2位空间正好区分4个BANK;地址的最后5位才是寄存器的地址。通过这种方式就可以区分所有的寄存器了。ENC28J60的控制寄存器通常被分为ETH(E开头),MAC(MA),MII(MI)三种.
比较特殊的5个寄存器器:
ECON1:控制ENC的主要功能,包含接收使能,发送请求DMA控制和存储区选择。

BSEL1和BSEL0是对bank的选择。
ECON2:也是控制ENC28J60的其他主要功能

AUTOINC:自动缓冲器指针递增使能:1=自动递增ERDPT和EWPRT。PKTDEC:数据包递减位:1=EPKTCNT寄存器减1.
PWRSV:节能使能位,VRPS:稳压器节能使能位。
以太网缓冲器:
包含以太网使用的发送和接收存储器。缓冲器大小为8K。
接收缓冲器由衣蛾硬件管理的循环FIFO缓冲器构成,寄存器对
ERXSTH:ERXSTL和ERXNDH:ERXNDL作为指针,定义缓冲器的容量和在存储器的位置。ERXST和REXND指向的字节均包含在FIFO缓冲器中。接收数据写入缓冲时当写入ERXND指向的存储单元后,硬件会自动将接收的字节写入由ERXST指向的存储单元。因此接收硬件将不会写入FIFO以外的单元(所以数据接收肯定是在这个区域循环)。编辑ERXST和ERXND时要先禁止接收逻辑,不然不能修改。
ERXWRPTH:ERXWRPTL寄存器定义硬件向FIFO中的那个位置写入接收到的字节。指针可以用于判断FIFO剩余大小。
ERXRDPT:定义禁止写入FIFO中的某个位置,正常操作中数据顺序写入直到ERXRDPT所指位置。
如果FIFO满了数据不会覆盖。而是丢弃新收的数据。每次读取时必须明确该次操作时的读指针位置。ENC28J60读缓冲区时,被读取的内容并不全是以太网负载,在以太网负载之前还有下一个数据包的地址指针(占两个字节),接收状态向量(占4个字节),之后才是包括目标MAC地址,源MAC地址,数据包类型等等
发送缓冲区
出去接收的空间,剩余的都可设为发送。主控制器决定发送数据时,ETXST和ETXND指针将被编程指向发送缓冲内待发送数据包的地址。写发送缓冲器是有EWRPT来完成,使用写命令时EWRPT会不断增长遇到结束地址会返回到七尺地址。
总结这个缓冲区其实主要4个参数就是ERXST、ERXND、ETXST和ETXND,由于ENC28J60的寄存器是8位,而缓冲区为8K,所以要把单个地址分为高8位和低8位。
、
PHY寄存器:
提供PHY模块的配置和控制功能,以及操作的状态信息,所有PHY寄存器都是16位,共32个地址但只能用9个PHY不能用SPI操作是通过一组MIIM的特殊MAC控制寄存器来访问的。称为MII寄存器。
读PHY:1.将要读的地址写入MIREGADR寄存器,2.将MICMD.MIIRD置位,开始读操作,同时MISTAT.BUSY自动置位。3.等待至少10.24us,查询MISTAT.BUSY确定操作是否完成,当BUSY时不应该做任务MIISCAN或写MIWRH操作,4.完成后清零MICMD.MIIRD,然后可以从MIRDL和MIRDH中读取所需数据。
写PHY:写PYH时一次写入全部16位数据,1.将数据写入MIREGADR寄存器2.将数据低8位写入MIWRL,高8位写入MIWRH,这个操作完后会自动启动MII事务,BUSY位置1。4.查BUSY位看完成没
SPI操作指令集:
读写寄存分两步:1选定寄存器的BANK编号,2发送读写命令
所以操作就是片选CS拉低,然后发送相应的命令,如果读取控制寄存器是ETH寄存器,数据马上回从SO脚返回,如果是MAC或MII寄存器,SO会先移出一个无效数据字节,随后再引出数据,片选拉高结束。
读取缓冲寄存器命令运行主控制器从8K发送和缓冲储存器(整个缓冲区)中读取字节。设置ECON2中的AUTOINC为1则每次读完后,ERDPT指针将会自动地递增到下一个地址。要注意如果读取了接收缓冲器中最后的衣蛾字节ERDPT = ERXND,ERDPT会指向起始单元。
在拉低CS脚,然后发送命令后,数据马上出SO引脚移出。高位先出。写缓冲存储器与读相似只是命令不同。
以太网数据包发送操作:
1.设置发送缓冲区的大小(就是起始地址和结束地址),结束地址与长度有关2.开始向缓冲区写数据,发送ENC28J60_WRITE_BUF_MEM命令,3开始向缓冲写要发送的数据 4.启动ECON1_TXRTS位开始网卡发送。
以太网卡读操作:
1先通过寄存器查看是否存在以太网数据包 2若存在以太网数据包则设定读指针的地址(在读缓冲区的位置)3执行缓冲区读取操作。以太网数据包中前两个字节为下一个数据包的起始地址(16位),先读出来要马上保存,紧接的两个字节是数据包的长度,读出来后然后减掉最后4为的CRC校验结构 4读取数据到某个数组。5.通过操作ECON2的ECON2_PKTDEC位递减了以太网数据包个数 6.移动接收缓冲区 读指针将ERXRDPT设为下一个数据包的地址(正常操作中数据顺序写入直到ERXRDPT所指位置也就是到尾部结束返回头部)