2.1 寄存器定义

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

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

【2】 寄存器被分布在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地址为0;EHT1为位于BANK1中的控制寄存器,第一个0x01代表BANKx中的具体地址,该地址为0x01,第二个0x20代表BANK编号,此处BANK编号为1。请注意由于BANK编号被保存在BIT6和BIT5,所以此处为0x20而不是0x10;MACON2为位于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 接收数据包结构标题

转自 https://blog.csdn.net/xukai871105/article/details/13931833

STM32(三) ENC28J60以太网(一)相关推荐

  1. 基于stm32之w5500以太网应用

    基于stm32之w5500以太网应用 强调一下前半段为基础知识普及(这段还是很重要的.不管用什么工具开发精通协议才是王道),后半段为实战代码干货. 如上图所示,最底下的一层叫做"物理层&qu ...

  2. STM32三条总线(AHB、APB1、APB2)的外设映射情况

    STM32三条总线(AHB.APB1.APB2)的外设映射情况 1.AHB (1)Flash储存器 (2)DMA (3)复位和时钟控制 (4)CRC (5)以太网 (6)SDIO 2.APB1总线(支 ...

  3. STM32三种启动模式 boot0 boot1

    STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存=芯片内置的Flash. 2)SRAM=芯片内置的RAM区,就是内存啦. 3)系统存储器=芯片内部一块特定的区域,芯片出厂时在 ...

  4. STM32三种BOOT模式

    探究STM32三种BOOT模式 简介 一.三种BOOT模式比较 二.开发BOOT模式选择 三.实验项目 (1)实验要求 (2)实验过程 a.STM32内置的Flash启动--最常用 b.从系统存储器启 ...

  5. PIC以太网开发板——基于微芯最新ENC28J60以太网控制器

    PIC以太网开发板--基于微芯最新ENC28J60以太网控制器                       PIC以太网开发板--基于微芯最新ENC28J60以太网控制器 导航栏 ENC28J60芯片 ...

  6. stm32三相逆变程序,pcb,以及板子。stm32输出三相spwm波驱动6个mos管实现三相逆变

    .逆变器本身可稳压,可任意设定输出电压,pid参数可用电脑通过串口调节.输入12-40 v,自动生成辅助电源供电.资料齐全,程序注释详细,稳定可靠,适合新手学习以及项目应用. stm32三相逆变开环驱 ...

  7. ENC28j60以太网芯片驱动程序简介

    转载: 本介绍可分为三块内容: 1.以太网数据帧结构 符合IEEE802.3标准的以太网帧的长度是介于64-1516字节之间.主要由目标MAC地址.源MAC地址.类型/长度字段.数据有效负载.可选填充 ...

  8. 嵌入式以太网第三部分——以太网协议实现

    目录: 1:概述 2:MAC地址设置 3:以太网协议 4:PING指令测试 1.概述 1.1:以太网是实现LAN的一种技术,它允许嵌入式系统连接到一个LAN中,并可通过使用网关经Internet连接到 ...

  9. 通过LWIP 的RAW API 进行与服务器的UDP通信(stm32 f103 -- enc28j60)

    LWIP的RAW API UDP通信详解(stm32f103-enc28j60) 项目整体托管到github上 实现任务 通过接收到上位机端发送来的数据来实现控制开发板做相应的操作. 代码实现 首先看 ...

最新文章

  1. weex css单位,weex 踩坑
  2. arduino串口监视器显示nan_使用Arduino开发板制作摩尔斯电码生成器
  3. Quartus11中新建工程
  4. 关于.NET中的Server push技术
  5. mpvue微信小程序动画_mpvue小程序以及微信直播踩坑总结
  6. /proc/sys/vm虚拟内存参数
  7. php target标签,为Typecho文章页url标签添加nofollow和target属性
  8. matlab 2018 ccs,Matlab2018a 与ccs7生成tms320F2812代码调试记录
  9. ES6+webpack实现Counter
  10. sysmon安装报错“error getting the evt dll (wevtapi.dll): 87”解决办法
  11. 超实用的工具、素材、学习网站分享
  12. 全国省市县oracle,最新行政区划 省市区三级 街道乡镇四级 社区/村五级 每月更新(2021年4月版)...
  13. 科学与财富杂志科学与财富杂志社科学与财富编辑部2022年第27期目录
  14. DNS解析出错导致网站在部分地区无法打开
  15. 套利进阶——简单易行的分级基金套利
  16. wordcloud:利用fontawesome字体绘制图标词云图
  17. 卷宗怎么做_卷宗怎么读
  18. 移动端安卓开发学习记录--Android Studio使用adb链接夜神模拟器常用指令
  19. C#转Java心路历程
  20. linux手机内存碎片整理软件,Linux不需要磁盘碎片整理

热门文章

  1. 被mysql虐待的一天
  2. Android应用商店上架技巧(企业版)
  3. 试述3种基本结构的特点,请另外设计两种基本结构
  4. Twitter整合营销的方法技巧
  5. WebSphere中com/env的资源影射设置
  6. android开发:Theme.Light.NoTitleBar和Theme.Light.NoTitleBar.Fullscreen的区别
  7. 基本风速或者震级选取—重现期与超越概率
  8. git提交错误 [remote rejected] HEAD -> refs/xxx 原因以及解决方法
  9. ADC中的SPS单位
  10. ts 的class和interface的区别