


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、En c28j60以太网芯片驱动程序简介本介绍可分为三块内容:1.以太网数据帧结构符合IEEE802.3标准的以太网帧的长度是介于 64-1516字节之间。主要由目 标MAC地址、源MAC地址、类型/长度字段、数据有效负载、可选填充字段和 循环冗余校验组成,另外在通过以太网介质发送数据包时,一个 7 字节的前导 字段和一字节的帧起始定界符被附加到以太网数据包的开头。以太网数据包的 结构如图 1 所示。图 1 以太网数据帧结构图ENC28J6C在发送或接收数据包时由以下几点值得关注:首先,ENC28J6C具有一个接收过滤器可以丢弃或接收具有组播、广播或单 播目标地址的数据包。其次,在数据字段处:
2、以太网数据字段的长度可以在 0-1500字节之间变换,超过这一范围的数据 包是违反以太网标准的,这些包将会被大多数以太网节点丢弃。若设置 ENC28J60勺巨大帧使能位为1,可以发送和接收超大规格数据包。在数据域中的填充字段是在数据字段小于 46字节时起填充作用。 ENC28J60 在发送数据包时,会自动填充 0。ENC28J6(在接收时自动拒绝小于18字节的数 据包。数据填充亦可由主控芯片来配置。最后,在CRC处:ENC28J6C在接收数据包时将检查每个传入数据包的 CRC通过检测 ERXFCON.CRCE位来判断输入数据包的 CRC是否正确。ENC28J6C在发送数据包 时,将自动生成一个
3、有效的 CRC并发送它。发送数据包的CRC亦可由主控芯片 来提供。2驱动程序介绍(1) ENC28J6(的寄存器读写规则由于ENC28J6C芯片采用的是SPI串行接口模式,其对内部寄存器读写的规 则是先发操作码 <前3bit>+寄存器地址 <后5bit>,再发送欲操作数据。通过不同 操作码来判别操作时读寄存器 (缓存区)还是写寄存器 (缓冲区 )或是其它。(2) ENC28J6(芯片初始化程序ENC28J6C发送和接收数据包前必须对内进行初始化设置,通常在复位后完 成,不需再更改。void enc28j6(_init(void)*Ba门“区相关寄存器配置SPI操作块数据
4、块/ 初始化程序一开始先进行软件复位,111<操作码 >+11111<参数>, N/A/ ENC28J6(_SOFT_RESET=(xFF enc28j6(WriteOp(ENC28J6(_SOFT_RESET, (, ENC28J6(_SOFT_RESET);delay_ms(5);/ 初始化接收缓冲区,设置接收起始地址NextPacketPtr = RXSTART_INIT;/ 读下一数据包指针enc28j6(Write(ERXSTL, RXSTART_INIT&(xFF);enc28j6(Write(ERXSTH, RXSTART_INIT>>
5、8);/ 设置接收读指针指向地址enc28j6(Write(ERXRDPTL, RXSTART_INIT&(xFF); enc28j6(Write(ERXRDPTH, RXSTART_INIT>>8);/ 设置接收缓冲区的末尾地址/ ERXND 寄存器默认指向整个缓冲区的最后一个单元enc28j60Write(ERXNDL, RXSTOP_INIT&0xFF);enc28j60Write(ERXNDH, RXSTOP_INIT>>8);/ 设置发送缓冲区的起始地址/ETXST寄存器默认地址是整个缓冲区的第一个单元enc28j60Write(ETXSTL,
6、 TXSTART_INIT&0xFF);enc28j60Write(ETXSTH, TXSTART_INIT>>8);/*Bank2 区相关寄存器配置/MAC 初始化配置/MAC接收使能,下行程序段表示使能 MAC接收,使能IEEE流量控制enc28j60Write(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);/MACON2清零,让 MAC退出复位状态enc28j60Write(MACON2, 0x00);/下行程序段表示使能自动填充和自动 CRC添加enc28j60WriteOp(ENC28J60_BIT_FIEL
7、D_SET,MACON3,MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN);/enc28j60Write(MACON3, MACON3_PADCFGO|MACON3_TXCRCEN|MACON3_FRMLNE 配置非背对背包之 间的间隔enc28j60Write(MAIPGL, 0x12);enc28j60Write(MAIPGH, 0x0C);/ 配置背对背包之间的间隔enc28j60Write(MABBIPG, 0x12);/ 设置允许接收或发送的最大帧长度编程enc28j60Write(MAMXFLL, MAX_FRAMELEN&0xFF
8、); enc28j60Write(MAMXFLH, MAX_FRAMELEN>>8);/*Bank3 区相关寄存器配置/将MAC地址写入MAADR0-MAADR5寄存器中/ NOTE: MAC address in ENC28J60 is byte-backward enc28j60Write(MAADR5, UIP_ETHADDR0); enc28j60Write(MAADR4, UIP_ETHADDR1); enc28j60Write(MAADR3, UIP_ETHADDR2); enc28j60Write(MAADR2, UIP_ETHADDR3); enc28j60Writ
9、e(MAADR1, UIP_ETHADDR4); enc28j60Write(MAADR0, UIP_ETHADDR5);/ 阻止发送回路的自动环回 enc28j60PhyWrite(PHCON2, PHCON2_HDLDIS);/*Bank0 区相关寄存器配置en c28j60SetBa nk(ECONI);设置寄存器区/ 中断使能enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE);/ 包接收使能enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);
10、说明:enc28j60Write函数内部包含了 SetBank设置寄存器区 >子程序,而 enc28j60WriteOp直接根据spi操作码 <前3bit>+寄存器地址 <后5bit>进行操作 的。(3) ENC28J6(发送数据包程序ENC28J60内的MAC在发送数据包时会自动生成前导符合帧起始定界符。此 外,也会根据用户配置以及数据具体情况自动生成数据填充和CRC字段。主控器必须把所有其它要发送的帧数据写入ENC28J6C缓冲存储器中。另外在待发送数据包前要添加一个包控制字节。包控制字节包括内容有:包超大帧使能位(PHUGEEN)包填充使能位(PPADEN、
11、包CRC使能位(PCRCEr和包改写位 (POVERRID四个内容。如图2所示。void enc28j60PacketSend(u16_t len, u8_t* packet)/ 配置发送缓冲区写指针起始地址enc28j60Write(EWRPTL, TXSTART_INIT); enc28j60Write(EWRPTH, TXSTART_INIT>>8);/ 根据给定数据域的大小配置发送缓冲区的末尾地址enc28j60Write(ETXNDL, (TXSTART_INIT+len); enc28j60Write(ETXNDH, (TXSTART_INIT+len)>>
12、8);/ 给每个数据包的包控制字节预留一个单元enc28j60WriteOp(ENC28J60_WRITE_BUF_MEM, 0, 0x00);/ TO DO, fix this upif( uip_len <= TOTAL_HEADER_LENGTH )/ 将数据包复制到缓冲区中 enc28j60WriteBuffer(len, packet);elselen -= TOTAL_HEADER_LENGTH; enc28j60WriteBuffer(TOTAL_HEADER_LENGTH, packet); enc28j60WriteBuffer(len, (unsigned char
13、*)uip_appdata);/将以太网控制寄存器ECON1所有位置1,以发送缓冲区数据enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_TXRTS); 图 2 发送数据包结构(4) ENC28J60接收数据包程序u16_t enc28j60PacketReceive(u16_t maxlen, u8_t* packet)u16_t rxstat;u16_t len;/ 检测缓冲区是否收到一个数据包if( !(enc28j60Read(EIR) & EIR_PKTIF)检测 EIR.PKTI是否为 1/通过查看EPKTCN寄存器再
14、次检查是否收到包if (enc28j60Read(EPKTCNT) = 0)/EPKTCNT0 表示没有包接收 /或包已被处 理 return 0;/ 配置接收缓冲器读指针指向地址enc28j60Write(ERDPTL, (NextPacketPtr);enc28j60Write(ERDPTH, (NextPacketPtr)>>8);/ 下一个数据包的读指针 <详情可查看接收数据包结构图图 3>NextPacketPtr = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);NextPacketPtr |= enc28j60ReadO
15、p(ENC28J60_READ_BUF_MEM, 0)<<8;/ 读数据包字节长度 <详情可查看接收数据包结构图图 3,status15.0>len = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);len |= enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0)<<8;/ 读接收数据包的状态 <status31.16>rxstat = enc28j60ReadOp(ENC28J60_READ_BUF_MEM, 0);rxstat |= enc28j60ReadOp(ENC28J6
16、0_READ_BUF_MEM, 0)<<8;/ 计算实际数据长度/移除CRC字段的长度来减少MAC所报告长度len = MIN(len, maxlen);/ 从缓冲区中将数据包复制到 packet 中enc28j60ReadBuffer(len, packet);/ERXRDPT卖缓冲器指针/ENC28J60将一直写到该指针之前的一单元为止u16_t rs,re;rs = en c28j60Read(ERXSTH);/ERX接收缓冲区的起始地址rs <<= 8;rs |= enc28j60Read(ERXSTL);re = en c28j60Read(ERXNDH);/ERXN接 收缓冲区的末尾地址re <<= 8;re |= enc28j60Read(ERXNDL);if (NextPacketPtr - 1 < rs | NextPacketPtr - 1 > re)en c28j60Write(ERXRDPT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 口腔助理年度工作总结
- 药物临床试验相关缩写
- 2025年一建《机电工程管理与实务》考试质量控制与验收真题演练题库试题
- 节能减排知识
- 2025年统计学期末考试题库:深度解析统计预测与决策策略
- 2025年养老护理员专业知识测试卷(护理护理)
- 2025年安全生产标准化建设应急处理试题库
- 2025年大学统计学期末考试:统计调查误差控制与数据质量保证试题
- 公共服务满意度调查的基准
- 创新创业部部门总结
- 物联网安全漏洞挖掘与修复-洞察分析
- 2024年北京高考英语试题及答案详解
- DB45T 2153-2020 大型活动气象服务规范
- GA/T 2144-2024法庭科学涉火案件常见助燃剂及其残留物检验技术导则
- 特殊教育学校教导处2024第一学期工作计划
- 2025年政府预算支出经济分类科目说明表
- 手术室剖宫产护理教学查房范文
- 【MOOC】机器学习-北京理工大学 中国大学慕课MOOC答案
- 《森林防火安全教育》主题班会 课件
- 《类风湿专病数据集技术规范》 编制说明
- 麻醉机故障应急预案演练
评论
0/150
提交评论