0.相关资料

    相关资料中包括其他精彩博文和代码仓库
    【嵌入式 TCP IP 资料汇总】

    【ENC28J60学习笔记——索引】 【第1部分】【第2部分】【第3部分】【第4部分】
    【STM32NET学习笔记——索引】
    【uIP学习笔记】
    【LwIP学习笔记——STM32 ENC28J60移植与入门】

3 寄存器操作实现

ENC28j60的寄存器操作分为2+2+2部分,分别为写寄存器和读寄存器部分,读缓冲区和写缓冲区部分,写PHY寄存器和读PHY寄存器部分。

3.1 读写寄存器

读或写寄存器的函数如下:

unsigned char enc28j60Read(unsigned char address)
{/* 设定寄存器地址区域 */enc28j60SetBank(address);/* 读取寄存器值 发送读寄存器命令和地址 */return enc28j60ReadOp(ENC28J60_READ_CTRL_REG, address);
}
void enc28j60Write(unsigned char address, unsigned char data)
{/* 设定寄存器地址区域 */enc28j60SetBank(address);/* 写寄存器值 发送写寄存器命令和地址 */enc28j60WriteOp(ENC28J60_WRITE_CTRL_REG, address, data);
}

读写寄存器的分为两步,第一步为选定寄存器的BANK编号,第二步使用写命令或读命令,操作指定地址的寄存器。在ENC28J60中,由ECON1中的低两位(BIT1-BIT1)保存BANK编号,ECON1是比较特殊的控制寄存器, 4个BANK均具有该寄存器且该寄存器的地址相同。Enc28j60Bank为全局变量,用于保存当前的BANK编号,如果两次操作控制寄存器在同一个BANK时,该变量保持不变,若两次操作的控制寄存器位于不同的BANK,那么BANK的值会变为新的BANK编号。

void enc28j60SetBank(unsigned char address)
{/* 计算本次寄存器地址在存取区域的位置 */if((address & BANK_MASK) != Enc28j60Bank){/* 清除ECON1的BSEL1 BSEL0 详见数据手册15页 */enc28j60WriteOp(ENC28J60_BIT_FIELD_CLR, ECON1, (ECON1_BSEL1|ECON1_BSEL0));/* 请注意寄存器地址的宏定义,bit6 bit5代码寄存器存储区域位置 */enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, (address & BANK_MASK)>>5);/* 重新确定当前寄存器存储区域 */Enc28j60Bank = (address & BANK_MASK);}
}unsigned char enc28j60ReadOp(unsigned char op, unsigned char address)
{unsigned char dat = 0;/* CS拉低 使能ENC28J60 */ENC28J60_CSL();/* 操作码和地址 */dat = op | (address & ADDR_MASK);/* 通过SPI写数据*/spi_sendbyte(dat);/* 通过SPI读出数据 */dat = spi_sendbyte(0xFF);/* 如果是MAC和MII寄存器,第一个读取的字节无效,该信息包含在地址的最高位 */if(address & 0x80){/* 再次通过SPI读取数据 */dat = spi_sendbyte(0xFF);}/* CS拉高 禁止ENC28J60 */ENC28J60_CSH();/* 返回数据 */return dat;
}

读控制寄存器实际上就是严格遵守数据手册的操作要求。由于读MAC和MII寄存器时,第一个接收到的字节为无效字节,第二个字节才为有效字节。程序通过寄存器地址的最高位来判断是否为MAC或MII寄存器。写寄存器函数较为简单,第一次字节包括操作码和寄存器地址,第二个字节为数据。在这两个函数中参数op为ENC28J60的指令,或称之为操作码,该指令占据SPI首字节的前3位,参数address为寄存器地址,参数data为寄存器的具体值。
ENC28J60_CSL()和ENC28J60_CSH()为操作CS端口的操作宏,而spi_sendbyte()可通过SPI发送一个字节。修改这些函数即可在其他平台上操作ENC28J60。不过请特别注意,在使用其他开发板时由于SPI总线上可能挂载多个设备,单独使用ENC28J60时需要把其他设备的CS端口拉高,或安装一个上拉电阻。

unsigned char enc28j60ReadOp(unsigned char op, unsigned char address)
{unsigned char dat = 0;/* CS拉低 使能ENC28J60 */ENC28J60_CSL();/* 操作码和地址 */dat = op | (address & ADDR_MASK);/* 通过SPI写数据*/spi_sendbyte(dat);/* 通过SPI读出数据 */dat = spi_sendbyte(0xFF);/* 如果是MAC和MII寄存器,第一个读取的字节无效,该信息包含在地址的最高位 */if(address & 0x80){/* 再次通过SPI读取数据 */dat = spi_sendbyte(0xFF);}/* CS拉高 禁止ENC28J60 */ENC28J60_CSH();/* 返回数据 */return dat;
}
void enc28j60WriteOp(unsigned char op, unsigned char address, unsigned char data)
{unsigned char dat = 0;/* 使能ENC28J60 */                                  ENC28J60_CSL();        /* 通过SPI发送 操作码和寄存器地址 */                        dat = op | (address & ADDR_MASK);/* 通过SPI1发送数据 */spi_sendbyte(dat);/* 准备寄存器数值 */                 dat = data;/* 通过SPI发送数据 */spi_sendbyte(dat);/* 禁止ENC28J60 */              ENC28J60_CSH();
}


3.2 读写缓冲区

读写缓冲区的操作也易于理解的。需要说明的是,两个函数具有相同的输入参数,参数len代表被操作数据的长度,pdata为被操作数据的指针。和寄存器读写函数相似,发送或接收数据之前需要发送特定的操作码。

void enc28j60ReadBuffer(unsigned int len, unsigned char* pdata)
{/* 使能ENC28J60 */ENC28J60_CSL();/* 通过SPI发送读取缓冲区命令*/spi_sendbyte(ENC28J60_READ_BUF_MEM);/* 循环读取 */while(len){len--;/* 读取数据 */*pdata = (unsigned char)spi_sendbyte(0);/* 地址指针累加 */pdata++;}/* 禁止ENC28J60 */ENC28J60_CSH();
}
void enc28j60WriteBuffer(unsigned int len, unsigned char* pdata)
{/* 使能ENC28J60 */ENC28J60_CSL();/* 通过SPI发送写取缓冲区命令*/spi_sendbyte(ENC28J60_WRITE_BUF_MEM);/* 循环发送 */while(len){len--;/* 发送数据 */spi_sendbyte(*pdata);/* 地址指针累加 */pdata++;}/* 禁止ENC28J60 */ENC28J60_CSH();
}

3.3 读写PHY寄存器

PHY寄存器和被ENC28J60控制的LED指示灯有关,控制该寄存器可以控制LED驱动方式和发生相应事件时LED显示方式。一般情况下,一个LED指示灯用于指示网络状态(常亮可理解为网络接通),另一个LED指示灯显示接收活动,有数据输入时产生一个点亮脉冲。PHY是比较特殊的寄存器,先要想一个控制寄存器写入PHY寄存器的地址,再向两个控制寄存器依次写入PHY寄存器的具体数据的高8位和低8位,最后等待PHY寄存器操作完成。

void enc28j60PhyWrite(unsigned char address, unsigned int data)
{/* 向MIREGADR写入地址 详见数据手册19页*/enc28j60Write(MIREGADR, address);/* 写入低8位数据 */enc28j60Write(MIWRL, data);/* 写入高8位数据 */enc28j60Write(MIWRH, data>>8);/* 等待PHY寄存器写入完成 */while(enc28j60Read(MISTAT) & MISTAT_BUSY);
}

ENC28J60学习笔记——第2部分相关推荐

  1. ENC28J60学习笔记——第1部分

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

  2. ENC28J60学习笔记——第4部分

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

  3. ENC28J60学习笔记——第3部分

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

  4. LwIP学习笔记——STM32 ENC28J60移植与入门

    0.前言 去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一详解个别 ...

  5. PHP学习笔记——索引博文

    特别之处     虽然由于个人PHP水平有限,但是PHP学习笔记还是有些特别之处.本人专注于IoT领域,所以本学习笔记试图把设备和互联网联系起来,而服务器侧使用的脚本语言正是PHP.PHP学习笔记有以 ...

  6. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  7. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  8. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  9. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

最新文章

  1. 如何使用netwokx进行复杂网络的中心性分析?
  2. PyAlgoTrade Hello World 第一个程序(一)
  3. Akka并发编程——第六节:Actor模型(五)
  4. 计算机硬盘应该什么格式化,怎么把电脑硬盘全部格式化?计算机硬盘格式,需要使用diskgenius分区工具删除所有分区...
  5. 同时获取同一等级下多个class值的节点的方法
  6. Acwing1086. 恨7不成妻(未解决)
  7. opengl 如何加阴影_零基础如何2个月上岗C++工程师(内附资料)
  8. Ubuntu 下 libev编译安装
  9. mysql 创建十万测试表_用MYSQL的存储过程创建百万级测试数据表
  10. mysql的主要指标_mysql 主要性能指标
  11. Centos和Ubuntu下定制普通用户访问权限
  12. android 手机关机代码非root,Android手机获取root权限并实现关机重启功能的方法
  13. 互联网发展的成功经验,以及面临的挑战
  14. (适合小白)利用百度AI开放平台实现人脸检测,对比和搜索。
  15. python histogram函数_Python numpy.histogram_bin_edges函数方法的使用
  16. element遮罩_如何实现全屏遮罩(附Vue.extend和el-message源码学习)
  17. 有一个棋盘,有64个方格,在第一个方格里面放1粒芝麻重量为0.00001,第二个里面放2粒,第三个里面放4,第四个8 ,以此类推,棋盘上放的所有芝麻的重量?
  18. 【转载】Android App应用启动分析与优化
  19. python 个例程序
  20. win10家庭版远程桌面控制解决

热门文章

  1. 玩转 Postman:基础篇
  2. 讲真,java学习是有些困难,但迎难而上正是男儿本色(附学习资料) !
  3. 云米科技2018全年财报:全年营收25.612亿元 同比增193.3%
  4. 80GB医学影像数据集发布!OCTA-500公开下载
  5. vs code 如何在服务器打开文件,本地VSCode编辑远程服务器文件
  6. 宜收藏!65个考研预报名问题汇总!
  7. uniapp ios手机端获取时间戳出现NAN
  8. 完美解决安装MySQL Install/Remove of the Service Denied!错误解决办法
  9. 哪款软件可以测试刘海,测试自己适合什么刘海 按照脸型来选一测便知
  10. java算斜率_[Java教程]js用斜率判断鼠标进入div的四个方向