查看: 659|回复: 0
打印 上一主题 下一主题

寄存器定义

[复制链接]
跳转到指定楼层
沙发
发表于 2015-10-8 08:07:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
寄存器定义
首先分析一下ENC28J60头文件。阅读数据手册之后,会发现ENC28J60寄存器数量较多,通过分析和整理,操作ENC28J60的寄存器需要注意以下3点。
(1)   共有三种不同形式的寄存器——控制寄存器,以太网寄存器 和PHY寄存器,不同的寄存器以不同的字母开头,以E、 MA和MI加以区分。操作这三种不同的寄存器需要不同的组合命令。
(2)   寄存器被分布在4个不同的bank中,也就是说存在地址相同的寄存器,但是这些寄存器却位于不同的分区中,在操作寄存器之前必须选中正确的bank。
(3)  虽然存在4个bank,但是有5个寄存器在4个bank的位置相同,它们是EIE、 EIR、ESTAT、ECON1、ECON2。不言而喻,这5个寄存器将会非常重要。
AVRNET项目中,寄存器被定义成8位长度,而这8位长度包含了三个部分,地址bit7(最高位)用以区分PHY和MAC寄存器;地址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代表BANK0中的地址,该地址为0x01,第二个数字0x00代表BANK编号,该编号为0,意味第0个BANK;EHT1为位于BANK1中的控制寄存器,第二个0x20代表BANK地址为1,请注意由于BANK编号被保存在bit6和bit5,所以此处为0x20,绝不是0x10;MACON2为位于bank2的以太网寄存器,第一个数字0x01代表在该BANK中的寄存器地址,第二个数字0x40代表BANK编号,而第三个数字0x80代表该寄存器为以太网寄存器或是PHY寄存器,这些寄存器的操作和控制寄存器有区别。
       为了方便寄存器操作,h文件中还定义了寄存器地址操作的掩码,简单而言就是需要查看哪些位,不需要查看哪些位。
/* 寄存器地址掩码 */
#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转载自

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表