wandabing_论文(5)

2019-04-05 15:19

基于嵌入式系统网卡驱动的实现

储器中顺序读取字节而无需多余的SPI 命令。

拉高CS 引脚电平可以结束RBM 命令。

写缓冲器命令

写缓冲存储器(Write Buffer Memory, WBM)命令允许主控制器将字节写入 8KB 发送和接收缓冲存储器。如果ECON2 寄存器中的AUTOINC 位置1,那么在写完每个字节的最后一位之后,EWRPT 指针将会自动地递增指向下一个地址(当前地址加1)。 如果写入地址1FFF 且AUTOINC 置1,则写指针加1 指向0000h。具体的步骤如下:

1. 将CS 引脚拉为低电平启动WBM 命令;

2. 将WBM操作码及随后的5 位常量1Ah 送入ENC28J60;

3. 把要写进缓冲区的数据送到发送寄存器中;在发送WBM 命令和常量之后,EWRPT

指向的存储器中的数据将移入ENC28J60,首先移入最高位。 在接收到8个数据位后,如果AUTOINC 置1,写指针将自动递增。主控制器可以继续在SCK 引脚提供时种信号、在SI 引脚发送数据同时保持CS 为低电平,从而可以连续写入存储器。 当AUTOINC 被使能时,以该方式就可以连续地向缓冲存储器写入字节而无需多余的SPI 命令。

4. 拉高CS 引脚电平可以结束RBM 命令。

读控制寄存器的命令

读控制寄存器(Read Control Register,RCR)命令允许主控制器随意读取ETH、MAC 和MII 寄存器。通过特殊的MII 寄存器接口可以读取PHY 寄存器的内容:

1. 将CS 引脚拉为低电平启动RCR 命令。

2. 将RCR 操作码和随后的5 位寄存器地址(A4 到A0)发送给ENC28J60; 3. 读控制寄存器的内容; 5 位地址决定将使用当前存储区中32 个控制寄存器中的

哪一个。 如果5 位地址指向的是一个ETH寄存器,那么选定寄存器中的数据会立即开始从SO 引脚移出,最高位在前。如果地址指向了一个MAC 或MII 寄存器,则首先从SO引脚移出一个无效数据字节,随后从SO引脚移出数据,最高位在前。 4. 通过拉高CS 引脚的电平可结束RCR 操作。

写控制寄存器的命令

写控制寄存器(Write Control Register,WCR)命令允许主控制器以任何次序写入ETH、MAC 和MII 控制寄存器。通过特殊的MII 寄存器接口对PHY 寄存器执行写操作。主要的操作步骤如下:

1. 将CS 引脚拉为低电平启动WCR 命令。

- 15-

3. 解决问题的一个实例

2. 将WCR操作码及随后的5 位地址(A4 到A0)发送给ENC28J60;

3. 把要写的数据放到发送寄存器中; 5 位地址决定要使用当前存储区中32 个控

制寄存器中的哪一个。在发送WCR 命令和地址后,发送要实际写入的数据,首先发送最高位。 在SCK 的上升沿,数据被写入目标寄存器。拉高CS 引脚的电平可结束WCR 操作。 如果在装载8个位前,CS 线变为高电平,则将中止这个数据字节的写操作。

3.2.2. 详细设计 1) 文件说明

表 3.1 文件一览表

Table 3.1 List of documents

文件名 enc28j60.c 与网卡相关的操作和函数定义 描述 enc28j60.h 与网卡相关的宏定义和函数声明

2) 函数一览表

表 3.2 函数一览表

Table 3.2 Function List 文件名 函数简称 F1_1 F1_2 F1_3 F1_4 F1_5 enc28j60.c F1_6 F1_7 F1_8 F1_9 函数名 ENC28J60_Init write_ENC28J60_Phy read_ENC28J60_Buffer read_ENC28J60_cmd read_ENC28J60 set_ENC28J60_Bank write_ENC28J60 类型 接口 内部 内部 内部 内部 内部 内部 网卡初始化 概要 读PHY寄存器 读缓存器 读控制寄存器 切换Bank时读控制寄存器 切换Bank区 切换Bank时写控制寄存器 些缓存区 写控制寄存器 接收数据包 发送数据包 write_ENC28J60_Buffer 内部 write_ENC28J60_cmd 内部 接口 接口 F1_10 receive_Packet F1_11 send_Packet 3) 函数调用关系

- 16-

基于嵌入式系统网卡驱动的实现

└─F1_10 ├─F1_3 │ └─F1_5 │ └─F1_4 │ └─F1_6 │ └─F1_7 │ └─F1_9 │ └─F1_6 └─F1_11 ├─F1_8 │ └─F1_7 图3.2 函数调用关系

Figure 3.2 The relationship between function call

4) 宏定义

表3.3 使用宏定义一览表

Table 3.3 List of use of macro definitions

值 宏名 描述 SUCCESS FAILED INT8U INT16U

5) 数据结构

- 17-

0x01 0x00 unsigned char unsigned short 函数调用成功返回值 函数调用失败返回值 八位无符号数 十六位无符号数 3. 解决问题的一个实例

表 3.4 数据类型一览表

Table 3.4 List of data types 类型名 Struct BUF{ BUF * B_Next; INT16U B_Len; Void *B_Data ; INT8U B_Type ;} INT8U MACADDR[6]

6) 函数设计

表 3.5 receive_Packet函数

描述 B_Next用于指向下一段数据缓存。 B_Len用于记录本段缓存中数据长度。 B_Data用于记录本段数据的开始位置。 用于记录数据报头类型。 存储6字节的本机MAC地址 Table 3.5 receive_Packet function 函数名称 void receive_Packet(INT8U * packet, INT32U maxlen); 参数 参数类型 COMMENT INPUT packet INT8U * 参数列表 INPUT maxlen INT32U 返回值 void void 全局变量 无 接收数据包 1、允许中断,允许接收 2、判断接收缓存器中是否还有数据包 功能说明 3、接收数据包 4、将接收到的数据包存入BUF 5、释放接收缓存区 制约和注接收缓存区来了一个数据包以后,会将/INT引脚拉低,可通过读/INT意事项 引脚状态判断接收缓存区是否有需要接收的数据包。 异常处理 无

表 3.6 send_Packet函数

Table 3.6 send_Packet function

函数名称 参数列表 返回值 功能说明 制约和注意事项 异常处理 void send_Packet(INT8U * packet, INT32U len) 参数 参数类型 COMMENT packet INT8U * INPUT len INT32U INPUT Void Void 1、编程指向发送缓存区中未用单元;2、写入包控制字节; 3、按顺序以字节为单位发送数据;4、释放数据包占用的BUF; 5、设置寄存器,开始发送数据包。 网络接口层调用此函数,需给定数据包头指针 无 - 18-

基于嵌入式系统网卡驱动的实现

表 3.7 ENC28J60_Init函数

Table 3.7 ENC28J60_Init function 函数名称 void ENC28J60_Init(void); 参数 参数类型 COMMENT 参数列表 Void Void 返回值 Void Void 功能说明 初始化网卡 制约和注无 意事项 异常处理 无 函数流程参见链接 6.9.12 图

表 3.8 SPI_Init函数

Table 3.8 SPI_Init function 函数名称 void SPI_Init(void); 参数 参数类型 COMMENT 参数列表 void void 返回值 void void 功能说明 初始化SPI 制约和注无 意事项 异常处理 无

表 3.8 read_ENC28J60_Buffer函数 Table 3.8 read_ENC28J60_Buffer function

函数名称 参数列表 返回值 功能说明 制约和注意无 事项 异常处理 无 函数流程图 参见链接read_ENC28J60_Buffer

- 19-

void read_ENC28J60_Buffer(INT16U len, INT8U * data) 参数 参数类型 COMMENT len INT16U INPUT data INT8U * INPUT void void 读以太网卡缓冲中的数据


wandabing_论文(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:南充高中2015年面向省内外自主招生考试英语试题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: