0.相关资料

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

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

6 ENC28J60初始化操作

ENC28J60初始化操作内容较多。
第一,进行CS端口的相关配置,即把该端口设置为输出状态,该部分代码可以出现在任何硬件初始化代码中,例如可以把所有的IO操作放入gpio_config中;

第二,进行软件复位,并通过查询ESTAT的ESTAT_CLKRDY标志位确定是否复位完成,初始化NextPacketPtr变量,该变量的初值为发送缓冲区的起始地址;

第三,配置发送和接收缓冲区的区间第四,若干参数配置,特别说明ENC28J60具有自动填充0 的功能,即发送报文长度低于以太网最小报文长度时可以填充0至最小长度;第五,写入MAC地址,由于ENC28J60内部没有全球唯一的MAC地址,所以该地址需要软件填写。但是这种软件填写方式存在缺陷,实际应用中可以含有全球唯一的MAC地址的EEPROM,从EERPOM读取MAC地址并用该地址初始化ENC28J60;第六,初始化中断,并使能接收,ENC28J60含有多个中断,本例只打开全局中断和数据包接收中断。

void enc28j60Init(unsigned char* macaddr)
{/* CS端口为输出 */DDRB |= (1<<4);/* 禁止ENC28J60 */ENC28J60_CSH();/* ENC28J60软件复位 该函数可以改进*/enc28j60WriteOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET); /*查询ESTAT.CLKRDY位*/while(!(enc28j60Read(ESTAT) & ESTAT_CLKRDY));/* 设置接收缓冲区起始地址 该变量用于每次读取缓冲区时保留下一个包的首地址 */NextPacketPtr = RXSTART_INIT;/* 设置接收缓冲区 起始指针*/enc28j60Write(ERXSTL, RXSTART_INIT & 0xFF);enc28j60Write(ERXSTH, RXSTART_INIT >> 8);/* 设置接收缓冲区 读指针*/ enc28j60Write(ERXRDPTL, RXSTART_INIT&0xFF);enc28j60Write(ERXRDPTH, RXSTART_INIT>>8);/* 设置接收缓冲区 结束指针 */enc28j60Write(ERXNDL, RXSTOP_INIT&0xFF);enc28j60Write(ERXNDH, RXSTOP_INIT>>8);/* 设置发送缓冲区 起始指针 */enc28j60Write(ETXSTL, TXSTART_INIT&0xFF);enc28j60Write(ETXSTH, TXSTART_INIT>>8);/* 设置发送缓冲区 结束指针 */enc28j60Write(ETXNDL, TXSTOP_INIT&0xFF);enc28j60Write(ETXNDH, TXSTOP_INIT>>8);/* 使能单播过滤 使能CRC校验 使能 格式匹配自动过滤*/enc28j60Write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN);enc28j60Write(EPMM0, 0x3f);enc28j60Write(EPMM1, 0x30);enc28j60Write(EPMCSL, 0xf9);enc28j60Write(EPMCSH, 0xf7);/* 使能MAC接收 允许MAC发送暂停控制帧 当接收到暂停控制帧时停止发送*//* 数据手册34页 */enc28j60Write(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);/* 退出复位状态 */enc28j60Write(MACON2, 0x00);/* 用0填充所有短帧至60字节长 并追加一个CRC 发送CRC使能 帧长度校验使能 MAC全双工使能*//* 提示 由于ENC28J60不支持802.3的自动协商机制, 所以对端的网络卡需要强制设置为全双工 */enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN|MACON3_FULDPX);/* 填入默认值 */enc28j60Write(MAIPGL, 0x12);/* 填入默认值 */enc28j60Write(MAIPGH, 0x0C);/* 填入默认值 */enc28j60Write(MABBIPG, 0x15);/* 最大帧长度 */enc28j60Write(MAMXFLL, MAX_FRAMELEN & 0xFF);   enc28j60Write(MAMXFLH, MAX_FRAMELEN >> 8);/* 写入MAC地址 */enc28j60Write(MAADR5, macaddr[0]); enc28j60Write(MAADR4, macaddr[1]);enc28j60Write(MAADR3, macaddr[2]);enc28j60Write(MAADR2, macaddr[3]);enc28j60Write(MAADR1, macaddr[4]);enc28j60Write(MAADR0, macaddr[5]);/* 配置PHY为全双工  LEDB为拉电流 */enc28j60PhyWrite(PHCON1, PHCON1_PDPXMD);/* LED状态 */enc28j60PhyWrite(PHLCON,0x0476);  /* 半双工回环禁止 */enc28j60PhyWrite(PHCON2, PHCON2_HDLDIS);/* 返回BANK0 */  enc28j60SetBank(ECON1);/* 使能中断 全局中断 接收中断 接收错误中断 */enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE|EIE_RXERIE);/* 接收使能位 */enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);
}

7 总结

ENC28J60的驱动编写算是比较复杂的。但是回过头来看看,其他的以太网驱动芯片的操作和ENC28J60的操作类似,其操作的核心便是4KB的硬件缓冲区。本例不能给出合适的运行范例,因为以太网驱动芯片要配合以太网协议栈来实现,而以太网协议栈内容很多涉及非常多的基础知识。ENC28J60的驱动是以太网协议栈实现的基础,通过ENC28J60还将会分析uIP协议栈,lwIP协议栈的应用等。

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

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

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

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

    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. Go 知识点(06)— for range 切片并对切片进行 append 不会造成死循环
  2. n皇后问题,使用位运算解决
  3. CAN总线-位时序、波特率、采样点
  4. 贪吃蛇游戏(附源码)
  5. VTK:图像高斯平滑用法实战
  6. 计算机网络马宏伟应用层作业,马宏伟《计算机网络A》Chapter3-作业.doc
  7. 设置linux拨号服务端,CentOS Linux上搭建PPPoE服务器及拨号设置
  8. 百度Android开发面试题
  9. Backdooring a OS VM
  10. spool.exe 出错 无法打印
  11. 让WordPress主题支持语言本地化(使用poedit软件实现中文翻译功能)
  12. JAVA文件上传限制
  13. 2021牛客多校第十场补题 F-Train Wreck
  14. linux征途架设教程,Linux下征途私服架设详细教程
  15. 斯坦福大学自然语言处理第一课“引言(Introduction)”
  16. 路由器接口管理 控制端口 辅助端口 物理端口 逻辑端口 局域网
  17. 各种Java加密算法-非对称加密
  18. 一起学爬虫(Python) — 10
  19. linuxci‘pang磁盘管理的实验报告
  20. Pytorch笔记-6

热门文章

  1. 亚马逊宣布与大自然保护协会合作,投资巴西基于自然的碳移除解决方案
  2. 【每日一题】(D0731)锦囊 区间
  3. otherwise 的用法
  4. 最通俗易懂的解释hbase热点问题rowkey设计原则region分区及解决方案
  5. 推荐系统入门(二):协同过滤(附代码)
  6. 期望 UVA - 11427 - 独立重复事件-全期望公式
  7. php select只有一条_读取数据库如何只取出一条数据????请赐教!
  8. nodejs微信支付小微商户申请入驻时,如何实现图片上传接口
  9. 使用Android Studio 日常小问题
  10. 25000 字详解 23 种设计模式(多图 + 代码)