0.相关资料

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

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

4.ENC28J60写操作

通过ENC28J60发送以太网数据包,操作ENC28J60硬件缓冲区的发送部分即可。每次发送时总是从发送缓冲区的起始地址开始填充数据,数据填充的结束地址和数据包长度有关。设置发送缓冲区大小之后可向发送缓冲区填充数据,即调用ENC28J60_WRITE_BUF_MEM操作命令,接着置位ECON1中的 ECON1_TXRTS位启动发送,并使用等待法不断查询是否发送完毕。基本的思路还是和SPI或UART发送数据相似,即填充数据,启动发送,查询发送完成。写操作的输入参数为数据包的长度len和数据包指针packet,该参数正好和uIP的网络层操作函数相对应。

void enc28j60PacketSend(unsigned int len, unsigned char* packet)
{/* 查询发送逻辑复位位 */while((enc28j60Read(ECON1) & ECON1_TXRTS)!= 0);/* 设置发送缓冲区起始地址 */    enc28j60Write(EWRPTL, TXSTART_INIT & 0xFF);enc28j60Write(EWRPTH, TXSTART_INIT >> 8);/* 设置发送缓冲区结束地址 该值对应发送数据包长度 */   enc28j60Write(ETXNDL, (TXSTART_INIT + len) & 0xFF);enc28j60Write(ETXNDH, (TXSTART_INIT + len) >>8);/* 发送之前发送控制包格式字 */enc28j60WriteOp(ENC28J60_WRITE_BUF_MEM, 0, 0x00);/* 通过ENC28J60发送数据包 */enc28j60WriteBuffer(len, packet);/* 开始发送 */enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_TXRTS);/* 复位发送逻辑的问题 */if( (enc28j60Read(EIR) & EIR_TXERIF) ){enc28j60SetBank(ECON1);enc28j60WriteOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_TXRTS);}
}

5 ENC28J60读操作

读操作要比写操作复杂一些。写操作时每次总是从硬件发送缓冲区的起始地址开始操作,而读操作时需要不断修改接收缓冲区的读指针地址,该参数需要通过NextPacketPtr完成,该变量为uint16_t类型的全局变量。读操作时,先通过寄存器查看是否存在以太网数据包,读EPKTCNT寄存器便可返回以太网数据包的个数;若存在以太网数据包则设定读指针的地址,执行读缓冲区操作,ENC28J60的以太网接收数据包中前两个字节为下一个以太网数据包的起始地址,立即保存该参数至NextPacketPtr全局变量;以太网数据包中的后两个字节为该数据包的长度,该长度指从目标MAC地址开始的数据包的长度,进行处理时还需要舍弃最后的4字节CRC校验结果;通过读缓冲区操作码把长度为Len的以太网接收数据包保存至RAM中的某个位置,例如rxtx_buf全局数组。最后根据NextPacketPtr移动读指针以便下次操作,并通过操作ECON2的ECON2_PKTDEC位递减了以太网数据包个数。

unsigned int enc28j60PacketReceive(unsigned int maxlen, unsigned char* packet)
{unsigned int rxstat;unsigned int len;/* 是否收到以太网数据包 */if( enc28j60Read(EPKTCNT) == 0 ){return(0);}/* 设置接收缓冲器读指针 */enc28j60Write(ERDPTL, (NextPacketPtr));enc28j60Write(ERDPTH, (NextPacketPtr)>>8);/* 接收数据包结构示例 数据手册43页 *//* 读下一个包的指针 */NextPacketPtr  = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);NextPacketPtr |= enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)<<8;/* 读包的长度 */len  = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);len |= enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)<<8;/* 去除CRC校验部分 */len-= 4;   /* 读取接收状态 */rxstat  = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);rxstat |= enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0) << 8;/* 限制检索的长度   */  if (len > maxlen-1){len = maxlen-1;}/* 检查CRC和符号错误 *//* ERXFCON.CRCEN是默认设置。通常我们不需要检查 */if ((rxstat & 0x80)==0){//无效的len = 0;}else{/* 从接收缓冲器中复制数据包 */enc28j60ReadBuffer(len, packet);}/* 移动接收缓冲区 读指针*/enc28j60Write(ERXRDPTL, (NextPacketPtr));enc28j60Write(ERXRDPTH, (NextPacketPtr)>>8);/* 数据包递减 */enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PKTDEC);/* 返回长度 */return(len);
}

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

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

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

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

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

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

    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. shaderlab学习一
  2. Python Numpy 教程(使用 Jupyter 和 Colab)
  3. LeetCode 1690. 石子游戏 VII(博弈DP)
  4. 低碳数据中心,因何而来?一文读懂如何利用超融合降碳
  5. ios 如何获得系统时间和日期
  6. CentOs基础操作指令(vim、关机)
  7. snmp有android代理端吗,Android实现snmp协议(1)
  8. (17)Zynq FPGA 全局定时器介绍
  9. MySQL聚集索引详解_MySQL innodb 聚集索引的概念与使用教程
  10. grep 多条件并行满足_grep多个条件
  11. 简单易懂的现代魔法——Play Framework攻略1
  12. #35 insert
  13. killer queen ctf
  14. 中通开放平台简介——连锁门店解决方案
  15. 【狂神说】 mysql 自学总结 4~6章
  16. 从源码角度分析Android中的Binder机制的前因后果
  17. 我的2013年总结--北京 深圳
  18. 把图片修改为单色图片
  19. HOOK api readprocessmemory and writeprocessmemory
  20. 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之5---移动增值服务走进生活

热门文章

  1. 冬天这么冷,到底要不要坚持送孩子入托?
  2. java.io.IOException: unexpected end of stream on https://xxx.xxx.xxx.xxx:84/
  3. Win10删除或移动文件进度卡在99%->系统资源管理器cpu占用率及电源使用情况非常高的解决方法
  4. 植发搞笑图片_植发失败案例实录!历时几个月却迎来头发尽毁,后果太可怕了...
  5. 如何把一个程序封装成一个系统?(1)
  6. Windows环境下视频文件转成RTSP视频流和RTMP流
  7. 游戏服务器中多人交互逻辑业务的思考
  8. 417. 太平洋大西洋水流问题(medium) -力扣(leetCode)逆流而上,JS图的深度优先遍历算法
  9. 吴恩达 深度学习 编程作业(2-2)- Optimization Methods
  10. 六年前开始的等待——写在潘爱民译《深入解析Windows 操作系统,第4版》出版之际