第6章 部件工作原理与编程示例(2)
S3C4510B内嵌一个可以以10M/100M的速率工作在半双工或全双工模式下的以太网控制器。在半双工模式下,控制器支持IEEE802.3的CSMA/CD协议;在全双工模式下,控制器支持包括用于流控的暂停操作的IEEE802.3 MAC控制层协议。
以太网控制器的MAC层支持媒体独立接口(Media Independent Interface,MII)和带缓冲的DMA接口(Buffered DMA Interface,BDI)。MAC层由发送模块、接收模块、流控模块、用于存储网络地址的匹配地址存储器(Content Address Memory,CAM)以及一些命令寄存器、状态寄存器、错误计数器寄存器构成。
MII支持在25MHz时钟下以100M速率的发送与接收操作,和在2.5MHz时钟下以10M速率的发送与接收操作。同时,MII遵循ISO/IEC802-3中关于从MAC层中分离出物理层的媒体独立层标准。
图6.2.9为以太网系统的流控框图。
图6.2.9 以太网系统的流控框图
主要特性
S3C4510B以太网控制器的主要特性描述如下:
- 为设备联入以太网提供廉价的解决方案。
- 带猝发模式的BDMA引擎。
- BDMA发送/接收缓冲(均为256字节)。
- MAC发送/接收FIFOs(分别为80字节和16字节),支持在冲突后重新发送,无需DMA请求。
- 数据对准逻辑。
- 端模式变换。
- 支持新/旧传输媒体(与目前的10M网络兼容)。
- 10M/100M的传输速率,提高系统性价比。
- 符合IEEE802.3标准,与现有应用系统兼容。
- 支持媒体独立接口(MII)或7线制接口。
- 用于物理层配置与连接的站管理(Station Management)信号。
- 片内CAM(可存储21个地址)。
- 支持双倍带宽的全双工模式。
- 硬件支持全双工流控暂停操作。
- 支持特定情况下的长数据包模式。
- 支持用于快速测试的短数据包模式。
- 支持填充生成,数据更易于传输并减少传输时间。
MAC功能模块
以太网控制器MAC层的功能模块描述如表6-2-13和图6.2.10。
表6-2-13 MAC功能模块描述
功能模块 | 描 述 |
媒体独立接口(MII) | MII为物理层和发送/接收模块之间的接口 |
发送模块 | 将要发送的数据从发送缓冲区移到MII。发送模块包括CRC生成电路、奇偶校验电路、前导与后缀生成电路。发送模块同时还包含用于 处理冲突后的回退和数据帧间间隔的定时器。 |
接收模块 | 从MII接收数据并存入接收FIFO。接收模块完成逻辑功能:计算与校验CRC值;对从MII接收的数据进行奇偶生成和检测最大与最小数据包长度。接收模块同时还包含一个匹配地址存储器(CAM)模块,用于存储网络目的地址,根据该目的地址决定接收或丢弃数据包。 |
流控模块 | 辨别MAC控制包,并支持用于全双工连接的暂停操作。流控模块同时支持生成暂停控制包,并提供用于暂停控制的定时器和计数器。 |
MAC控制(命令)与状态寄存器 | 控制可编程选项,包括禁止或使能当某条件发生时通知系统的各种信号。状态寄存器保持各种用于错误处理的状态信息,以及用于网络管理的错误计数器累加统计信息等。 |
回环电路 | 提供独立于MII和物理层的MAC层测试。 |
图6.2.10 MAC层流控功能模块
媒体独立接口(Media Independent Interface,MII)
发送和接收模块均通过MII进行操作,其接口特性描述如下:
- 独立于传输媒体。
- 支持多生产商互操作。
- 支持到MAC层和到物理层接口设备的连接。
- 支持10M或100M的数据传输能力。
- 数据与分隔符的传输和参考时钟同步。
- 提供独立的4位数据宽度发送与接收通道。
- 使用TTL电平信号,与通用数字CMOS ASIC处理器电平兼容。
- 支持到物理层和到站管理设备的连接。
- 提供简单的管理接口。
- 具有驱动有限长度屏蔽电缆的能力。
物理层(Physical Layer Entity,PHY)
物理层完成发送与接收数据的编码/解码。其编码/解码(用于10BASE-T的曼切斯特编码、用于100BASE-X的4B/5B编码以及用于100BASE-T4的8B/6T编码)方式对MII无影响。MII对原始数据进行接收时,以前导字段开始,到CRC字段结束。同时,MII对原始数据进行发送时,也以前导字段开始,到CRC字段结束。MAC层可生成填充数据并传送到PHY。
带缓冲的DMA接口(Buffered DMA Interface,BDI)
带缓冲的DMA接口支持通过系统总线的读/写操作,带有两个8位的总线数据收发器,同时可选择奇偶校验功能。数据收发器通过系统接口进行初始化。MAC层控制器通过响应BDI的准备好信号从BDI接收数据并发送出去,或将接收到的数据发送给BDI,由帧结束信号标识各数据包的边界。
MAC发送模块(MAC Transmit Block)
MAC发送模块负责数据发送,与802.3标准的CSMA/CD协议兼容。MAC发送模块由如下几部分构成:
- 发送FIFO和发送控制器。
- 前导与后缀发生器。
- 填充发生器。
- 并行CRC发生器。
- 开始逻辑与计数器。
- 回退与重发定时器。
- 发送状态机。
图6.2.11为MAC发送功能模块图。
图6.2.11 MAC发送功能模块图
发送FIFO与读/写控制器(Transmit FIFO and Read/Write Controllers):发送FIFO的大小为80字节,每一个字节数据附加一个奇偶校验位,即每个字节为9位长度,其中,前64个字节数据可以被打包存储和发送,并在发生碰撞时进行重发,无需系统更多的干预。如果没有碰撞发生,则进行数据包发送,剩余的16个字节由系统处理,以避免因为FIFO不发送而丢失。
当系统接口设置了相应控制寄存器的发送使能位时,发送状态机就从BDI请求数据,然后由系统控制器从系统存储器中获取数据。
FIFO控制器将数据存储在发送FIFO中,然后通过一个握手信号通知发送状态机,FIFO中的数据有效,可以开始发送操作。如果FIFO未满,FIFO控制器向BDI请求更多的数据。发送状态机连续的发送数据,直到检测到最后一个字节的帧结束信号,然后追加经过计算的CRC值到数据包的末尾(若发送控制寄存器的CRC除去位被置位,则不追加),状态寄存器的包发送位被置位,若中断使能同时产生中断。
模块中的写FIFO控制器与计数器和发送状态机的读FIFO控制器与计数器根据各自的计数值协同工作,尽管他们由不同的时钟源驱动。
FIFO控制器将数据和校验位存储在FIFO中,并对数据进行奇偶校验,如果校验错误,FIFO控制器就设置一个错误状态位,若对应的中断使能同时产生中断。
前导与后缀发生器(Preamble and Jam Generator):一旦控制寄存器中的发送使能位被置位,且FIFO中有8个字节的数据,发送状态机发出Tx_en信号启动发送,开始发送前导与起始帧分隔符。
填充发生器(PAD Generator):如果发送一个短的数据包,MAC会生成填充字节将短数据包扩展到64字节的最小限制,填充字节由“0”组成。有一个控制位可以禁止填充字节的生成。
并行CRC发生器(Parallel CRC Generator):数据包中所有要发送的数据,从目的地址域到其后的所有数据域都可以生成CRC。用户也可通过设置发送控制寄存器的对应位禁止CRC生成。该功能可以用于测试,例如,为测试接收器的错误检测功能,可强制发送CRC错误的数据。该功能也可用在某些需要端到端CRC校验的网桥与交换机应用场合。
回退与重发定时器(Back-off and Retransmit Timers):当检测到网络上有碰撞时,发送器模块就停止数据的发送并向网络发送一个特定的阻塞信号,通知所有的节点网络有碰撞。之后,发送器等待一段时间后再重发数据,如果连续16次的重发失败,发送状态机就置错误标志位,并在中断使能的情况下产生中断通知系统由于网络的过渡阻塞使数据包发送失败。发送状态机清除FIFO,MAC准备下一个数据包的发送。
发送数据奇偶校验器(Transmit Data Parity Checker):FIFO中的数据要进行奇校验检测。当数据准备发送时,发送状态机进行奇偶校验,如果检测到奇偶错误,发送数据奇偶校验器作如下操作:
- 停止数据的发送。
- 设置发送状态寄存器中的奇偶错误位。
- 如果中断使能则产生中断。
发送状态机(Transmit State Machine):发送状态机是发送模块的中央控制逻辑,控制着各种信号的传输、定时器、处理状态寄存器中的错误。
MAC接收模块(MAC RECEIVE BLOCK)
MAC接收模块负责数据的接收,与802.3标准的CSMA/CD协议兼容。
当接收到一个数据包时,接收模块首先检测诸如CRC错误、对齐错误、长度错误等错误条件,也可以通过设置控制寄存器的相应位禁止错误检查。接收模块根据CAM的状态和目的地址,决定接收或拒绝数据包。MAC接收模块由以下几个部分构成:
- 接收FIFO,FIFO控制器和计数器。
- 接收BDI状态机。
- 开始逻辑与计数器。
- 用于地址识别的CAM块。
- 并行CRC校验器。
- 接收状态机。
接收模块的主要部件如图6.2.12所示。
图6.2.12 MAC接收功能模块
接收FIFO控制器(Receive FIFO Controller):接收FIFO控制器一次接收一个字节的数据,并根据接收到的字节数更新计数器的值。在FIFO接收数据时,CAM模块根据自身存储的地址对数据包的目的地址进行检测,如果CAM能识别该地址,FIFO就继续接收数据包,如果CAM不能识别,接收模块就丢弃数据包并清除FIFO。
地址CAM和地址识别(Address CAM and Address Recognition):CAM模块完成地址识别。它将接收到的数据包的目的地址与自身存储的地址进行比较,如果地址匹配,接收状态机就继续接收数据。CAM模块按6个字节存储一个地址的方式组织,共有32字(128字节)的大小,最多可存储21个地址(126字节)。
CAM的地址单元0、1和18用于发送暂停控制包。因此,用户要发送一个暂停控制包,必须将目的地址写入CAM0,源地址写入CAM1,长度/类型、操作码和操作数写入CAM18。同时,必须对MAC发送控制寄存器的发送暂停控制位置位,此外,CAM19和CAM20可用于构造一个由用户定义的控制帧。
接收状态机(Receive State Machine):在MII模式下,接收模块从MII的RxD[3:0]接收数据,数据传输与25MHz(100M速率)的接收时钟或与2.5MHz(10M速率)的接收时钟同步。在7-线模式下,传输速率为10MHz,接收模块从RxD_10接收数据。
接收模块检测到数据包的前导与起始帧分隔符(SFD)后,接收状态机按字节对数据进行处理,生成奇偶位并存储到接收FIFO。如果CAM模块接受数据包的目的地址,接收FIFO就将数据包的其余部分存储。在接收结束后,接收模块就通过设置接收状态寄存器的对应位标识数据包接收完毕。在接收过程的任何错误都将复位FIFO,同时接收状态机等待当前数据包的结束,然后进入空闲状态等待下一个前导信号和起始帧分隔符SFD。
BDMA接口接收状态机(BDMA Interface Recevie State Machine):BDMA接口接收状态机产生Rx_rdy信号请求接收FIFO中的数据,数据包的最后一个字节数据通过Rx_EOF信号标识。如果在接收过程中发生任何错误,或在最后发生CRC错误,BDMA接口接收状态机发出Rx_toss信号指示接收到的数据包应该丢弃。
流控模块(Flow Control Block):流控模块具有如下功能:
- 识别由接收模块接收到的MAC控制帧。
- 发送MAC控制帧,即使发送器暂停。
- 用于暂停操作的定时器与计数器。
- 命令与状态寄存器(CSR)接口。
- 可选择MAC控制帧通过,进行软件处理。
流控模块中的接收逻辑按如下方式识别MAC控制帧:
- 长度/类型域必须为MAC控制帧规定的特定值;目的地址必须被CAM识别;包括CRC在内的数据包长度必须为64字节;CRC必须有效;数据帧必须包含一个有效的暂停操作码和操作数。
- 如果长度/类型域不是MAC控制帧规定的特定值,MAC不作响应,数据包被当做普通包处理。如果CAM不能识别目的地址,数据包就被MAC丢弃;如果包括CRC在内的数据包长度不是64字节,MAC也不进行操作,然后数据包被标识为MAC控制帧,在允许通过的情况下,传送到软件处理。
用户可通过设置发送状态寄存器中的控制位,进行全双工暂停操作或其他的MAC控制功能,即使发送器自身处于暂停状态。两个定时器和两个对应的命令与状态寄存器(CSR)与暂停操作相关。
命令与状态寄存器(CSR)接口在发送与接收控制寄存器和状态寄存器内提供控制位与状态位,这些位可用于初始化MAC控制帧的发送、使能或禁用MAC的控制功能,以及读取流控计数器的值。
控制位可选择将MAC控制帧完全在控制器内处理,或将MAC控制帧传送到软件处理。
带缓冲DMA接口(Buffered DMA Interface)
带缓冲DMA(BDMA)控制模块(BDMA Control Blocks)
BDMA引擎控制一个发送缓冲区和一个接收缓冲区。BDMA发送缓冲区在数据包被发送时保持数据和状态信息;BDMA接收缓冲区在数据包被接收时保持数据和状态信息。每一个FIFO都有一个控制模块用于控制数据从缓冲区的移入和移出。
图6.2.13为BDMA控制模块图。
图6.2.13 BDMA控制模块图
总线仲裁器(Bus Arbiter):总线仲裁器决定发送或接收BDMA缓冲控制器中的哪一个有较高的优先级访问系统总线,优先级也可以改变。总线仲裁器在以下情况向系统管理器发出总线请求信号(nREQ):
- 当缓冲区中的数据大于一次接收的数据时。
- 当缓冲区中的剩余空间大于一次发送的数据时。
- 当EOF(帧结束)标志被存入缓冲区时。
当接收到系统管理器的应答信号后,总线仲裁器根据优先级决定系统总线的访问权。
BDMA总线控制逻辑(BDMA Bus Control Logic):BDMA控制器的功能模块提供对系统总线进行读、写操作的总线控制逻辑,该控制逻辑支持如下操作:
- 猝发尺寸控制,以优化系统总线的使用。
- 发送起始控制(基于发送缓冲区大小的1/8),使发送能力与系统总线的能力匹配。
- 大、小端字节交换功能,支持大、小端存储格式的数据传输。
- 发送、接收数据对齐部件满足按字对齐的要求。
存储数据结构(Memory Data Structure):以太网控制器有三种数据结构用于交换控制信息和数据,分别为:
- 发送帧描述符(Transmit Frame Descriptor)。
- 接收帧描述符(Receive Frame Descriptor)。
- 帧数据缓冲(Frame Data Buffer)。
每一个帧描述符由如下元素构成:
- 帧起始地址
- 所有者位
- 发送器控制域
- 状态域
- 帧长度
- 下一个帧描述符指针
以下为发送帧描述符的数据结构:
[0]填充模式选择(P)
0 = 填充模式 1 = 无填充模式
[1]CRC模式选择(C)
0 = CRC模式 1 = 非CRC模式
[2]当前帧发送完毕后MAC发送中断使能控制(T)
0 = 禁止 1 = 使能
[3]小端模式(L)
0 = 大端模式 1 = 小端模式
[4]帧数据指针递增/递减(A)
0 = 递减 1 = 递增
[6:5]部件对齐控制(WA)
00 = 无无效字节 01 = 一个无效字节
10 = 两个无效字节 11 = 三个无效字节
[31]所有者位(O)
0 = CPU 1 = BDMA
[30:0]帧数据指针(Frame Data Pointer)
被发送帧数据的地址。
[15:0]帧长度(Frame Length)
发送帧的大小。
[31:16]发送状态(Tx Status)
该发送帧的发送状态域由MAC在发送后更新。
[31:0]下一个帧描述符指针(Next Frame Descriptor Pointer)
下一个帧描述符的地址。
接收帧描述符的数据结构如下:
[31]所有者位(O)
0 = CPU 1 = BDMA
[30:0]帧数据指针(Frame Data Pointer)
被接收保存的帧数据地址。
[15:0]帧长度(Frame Length)
接收帧的大小。
[31:16]接收状态(Rx Status)
该接收帧的接收状态域由MAC在接收完毕后更新。
[31:0]下一个帧描述符指针(Next Frame Descriptor Pointer)
下一个帧描述符的地址。
数据帧(Data Frame):帧起始地址的最高位,所有者位,控制描述符的所有者。当所有者位为“1”时,描述符属BDMA控制器所有,当所有者位为“0”时,描述符属CPU所有,描述符的所有者同时拥有相应的数据帧,描述符的帧起始地址指向该数据帧。
当接收到数据帧时,由软件设置BDMA模块中的最大帧尺寸寄存器的值为系统帧缓冲尺寸(典型值为:1536和2048)。软件同时设置接收帧描述符的起始地址寄存器,使其指向一个帧描述符链。
然后,BDMA引擎开始设置BDMA接收控制寄存器(BDMARXCON)中的BDMA接收使能位,当接收到一个数据帧时,数据帧被拷贝到由接收帧起始地址规定的存储器中。接收的数据帧被写入帧数据缓冲区,直到数据帧的结束或帧长度超过设定的最大帧尺寸。
如果成功接收到整个数据帧,由帧描述符中的状态位指示,否则,就设置状态位指示错误发生,同时所有者位被清除并可能产生中断。接着,BDMA控制器拷贝下一个帧描述符寄存器的值到发送帧描述符起始地址寄存器,如果下一个帧描述符地址为空,BDMA控制器停止工作,所有后续的帧都被丢弃。否则,描述符被读入,BDMA控制器按上述步骤开始处理下一个帧。
当BDMA控制器读取一个描述符时,若描述符的所有者位没有设置,BDMA控制器可以有两种处理方式:
- 跳到下一个帧描述符
- 产生中断并停止BDMA的工作。
发送帧描述符包含如下内容“
- 一个指向帧数据的4字节指针。
- 部件对齐控制位[6:5]
- 帧数据指针递增/递减控制位[4]
- 小端控制位[3]
- 发送后中断使能位[2]
- 无CRC位[1]
- 无填充位[0]
在发送过程中,发送帧描述符中两字节的帧长度移入BDMA的内部发送寄存器,发送后,发送状态保存到发送帧描述符。然后BDMA控制器更新下一个帧描述符地址寄存器。
当发送帧描述符起始地址寄存器指向第一个帧缓冲使,发送器就开始将帧数据发送到发送缓冲存储器。
以太网控制器特殊功能寄存器(Ethernet Controller Special Registers)
S3C4510B使用的特殊功能寄存器可分为两大类:
- BDMA控制与状态寄存器。
- MAC控制与状态寄存器。
BDMA控制与状态寄存器(BDMA Control and Status Registers)
所有包含存储器地址的寄存器都必须按字对齐格式保存地址。表6-2-14为BDMA控制与状态寄存器描述。
表6-2-14 BDMA控制与状态寄存器
寄存器 | 偏移地址 | 操作 | 功能描述 | 复位值 |
BDMATXCON | 0x9000 | 读/写 | BDMA发送控制寄存器 | 0x00000000 |
BDMARXCON | 0x9004 | 读/写 | BDMA接收控制寄存器 | 0x00000000 |
BDMATXPTR | 0x9008 | 读/写 | 发送帧描述符起始地址寄存器 | 0xFFFFFFFF |
BDMARXPTR | 0x900C | 读/写 | 接收帧描述符起始地址寄存器 | 0xFFFFFFFF |
BDMARXLSZ | 0x9010 | 读/写 | 接收帧最大尺寸寄存器 | 未定义 |
BDMASTAT | 0x9014 | 读/写 | BDMA状态寄存器 | 0x00000000 |
CAM | 0x9100-0x917C | 只读 | CAM内容(32字) | 未定义 |
BDMATXBUF | 0x9200-0x92FC | 读/写 | BDMA发送缓冲(64字),仅用于测试模式寻址 | 未定义 |
BDMARXBUF | 0x9800-0x98FC 0x9900-0x99FC | 读/写 | BDMA接收缓冲(64字),仅用于测试模式寻址 | 未定义 |
BDMA发送控制寄存器(BDMA Transmit Control Register)
BDMA发送控制寄存器描述如下:
表6-2-15 BDMA发送控制寄存器描述
位 | 位名 | 功能描述 |
[4:0] | BDMA猝发尺寸 (BTxBRST) | 在BDMA模式下,该值加1即为发送尺寸。 若BTxBRST = 0,则发送尺寸为1字; 若BTxBRST = 31,则发送尺寸为32字; |
[5] | 根据所有者位BDMA发送停止或跳过当前帧 (BTxSTSKO) | 当数据帧的所有者位没有设置时,该位决定BDMA发送器跳过当前帧,还是产生中断(如果中断使能)。 |
[6] | 保留 | 未使用 |
[7] | BDMA发送控制包完成中断使能 (BTxCCPIE) | 当该位被置位时,在MAC完成控制包的发送后,BDMA发送控制包完成中断产生。 |
[8] | BDMA发送空表中断使能(BTxNLIE) | 当该位被置位时,BDMA发送空表中断被使能,即当发送帧描述符的起始地址指针为空地址时(0x00000000)产生中断。 |
[9] | BDMA非所有者中断使能 (BTxNOIE) | 该位置位时,BDMA非所有者中断使能。若当前帧的所有者位不属于BDMA控制器,且BTxSTSKO位置位时产生中断。 |
[10] | BDMA发送缓冲区空中断使能 (BTxEmpty) | 当该位置“1”时使能发送缓冲区空中断。 |
[13:11] | BDMA发送到MAC的开始条件 (BTxMSL) | 这几个位决定当一个新的数据帧到达后,何时将BDMA发送缓冲区中新的帧数据移到MAC发送FIFO中。 “000”表示不等待; “001”表示等到填满BDMA发送缓冲器的1/8; “010”表示等到填满BDMA发送缓冲器的2/8; “011”表示等到填满BDMA发送缓冲器的3/8; “1xx”表示等到填满BDMA发送缓冲器的4/8; 但当帧的最后一个数据到达BDMA发送缓冲区时,则立即将其移入MAC的发送FIFO,无论这几位的值如何。 |
[14] | BDMA发送使能 (BTxEn) | 当该位置位时,BDMA发送模块使能,即使该位被禁止,缓冲区中的数据也要被移入MAC发送FIFO,直到缓冲区下溢。 该位在以下情况自动被禁止: 1、 如果下一个帧指针为空。 2、 如果所有者位为“0”,且BTxSTSKO位为“1”。 注意在该位置位之前,帧描述符的起始地址指针必须赋值。 |
[15] | BDMA发送模块复位(BTxRS) | 该位置“1”,BDMA发送模块复位。 |
[4:0]BDMA的发送尺寸(BTxBRST)
在BDMA模式下,该值加1即为发送尺寸;若BTxBRST = 0,则发送尺寸为1字;若BTxBRST = 31,则发送尺寸为32字;
[5]根据所有者位BDMA发送停止或跳过当前帧(BTxSTSKO)
0 = 如果BDMA控制器不是帧的所有者,就跳过当前帧,处理下一个帧描述符。
1 = 如果中断使能,BDMA发送器就产生中断。
[6]保留
[7] BDMA发送控制包完成中断使能(BTxCCPIE)
0 = 禁止BDMA发送控制包完成中断。
1 = 使能BDMA发送控制包完成中断,当MAC发送控制包完成时产生中断。
[8]BDMA发送空表中断使能(BTxNLIE)
0 = 禁止BDMA发送空表中断。
1 = 使能BDMA发送空表中断,当BDAMTxPTR的值为空地址(0x00000000)时产生中断。
[9]BDMA非所有者中断使能(BTxNOIE)
0 = 禁止BDMA非当前发送帧所有者中断。
1 = 使能BDMA非当前发送帧所有者中断。
[10]BDMA发送缓冲区空中断使能(BTxEmpty)
0 = 禁止BDMA发送缓冲区空中断。
1 = 使能BDMA发送缓冲区空中断。
[13:11]BDMA发送到MAC的开始条件(BTxMSL)
000 = 不等待。
001 = 等待发送缓冲区填满1/8。
010 = 等待发送缓冲区填满2/8。
011 = 等待发送缓冲区填满3/8。
1xx = 等待发送缓冲区填满4/8。
[14]BDMA发送使能(BtxEn)
0 = 禁止BDMA发送器。
1 = 使能BDMA发送器。
[15]BDMA复位(BTxRS)
0 = 无影响。
1 = 复位BDMA发送模块。
BDMA接收控制寄存器(Buffered DMA Receive Control Register)
BDMA的接收控制寄存器BDMARXCON描述如下:
表6-2-16 BDMA接收控制寄存器描述
位 | 位名 | 功能描述 |
[4:0] | BDMA接收尺寸 (BRxBRST) | 在BDMA模式下,该值加1即为接收尺寸。 若BTxBRST = 0,则发送尺寸为1字; 若BTxBRST = 31,则发送尺寸为32字; |
[5] | 根据所有者位BDMA接收停止或跳过当前帧 (BRxSTSKO) | 当数据帧的所有者位没有设置时,该位决定BDMA接收器跳过当前帧,还是产生中断(如果中断使能)。 |
[6] | BDMA接收存储器地址递增/递减(BRxMAINC) | 该位决定地址递增或递减。如果该位置为“1”,则地址递增。 |
[7] | BDMA每接收帧中断使能(BRxDIE) | 当该位被置位时,BDMA控制器在每次将一个完整的数据帧移入存储器时产生中断。 |
[8] | BDMA接收空表中断使能(BRxNLIE) | 当该位被置位时,BDMA接收空表中断被使能,即当接收帧描述符的起始地址指针为空地址时(0x00000000)产生中断。 |
[9] | BDMA非所有者中断使能 (BRxNOIE) | 该位置位时,BDMA非所有者中断使能。若当前帧的所有者位不属于BDMA控制器,且BRxSTSKO位置位时产生中断。 |
[10] | BDMA接收最大尺寸溢出中断使能 (BRxMSOIE) | 当该位置“1”时使能BDMA接收最大尺寸溢出中断。当接收帧的尺寸大于接收帧最大尺寸寄存器的值时产生中断。 |
[11] | BDMA接收大/小端模式(BRxLittle) | 该位决定数据以大端或小端格式存储。如果该位置“1”,数据从接收缓冲到系统总线时发生交换。 |
[13:12] | BDMA接收字对齐 (BRxWA) | 接收字对齐控制位决定每一个数据帧的第一个字中有多少个无效字节。这些无效字节由BDMA控制器在组装字数据时插入。 “00” = 无无效字节; “01” = 1个无效字节; “10” = 2个无效字节; “11” = 3个无效字节; |
[14] | BDMA接收使能 (BRxEn) | 当接收使能位置“1”时,BDMA接收模块使能,即使该位被禁止,MAC也要接收数据,直到MAC接收FIFO上溢。 该位在以下情况自动被禁止: 3、 如果下一个帧指针为空。 4、 如果所有者位为“0”,且BRxSTSKO位为“1”。 注意在该位置位之前,帧描述符的起始地址指针必须赋值。 |
[15] | BDMA接收模块复位(BRxRS) | 该位置“1”,BDMA接收模块复位。 |
[16] | BDMA接收缓冲区空中断使能(BRxEmpty) | 该位置“1”使能BDMA接收缓冲区空中断。 |
[17] | BDMA接收数据帧长度通知中断使能(BRxEmpty) | 该位置“1”使能BDMA接收数据帧长度通知中断。该中断的功能通报从接收数据帧的长度域得到数据帧的长度值。 |
[4:0]BDMA的接收尺寸(BRxBRST)
在BDMA模式下,该值加1即为接收尺寸;若BRxBRST = 0,则接收尺寸为1字;若BRxBRST = 31,则接收尺寸为32字;
[5]根据所有者位BDMA接收停止或跳过当前帧(BRxSTSKO)
0 = 如果BDMA控制器不是帧的所有者,就跳过当前帧,处理下一个帧描述符。
1 = 如果中断使能,BDMA接收器就产生中断。
[6]BDMA接收存储器地址递增/递减(DRxMAINC)
0 = 帧存储器地址递减。
1 = 帧存储器地址递增。
[7] BDMA每接收帧中断使能(BRxDIE)
0 = 禁止BDMA每接收帧中断。
1 = 使能BDMA每接收帧中断。
[8]BDMA接收空表中断使能(BRxNLIE)
0 = 禁止BDMA接收空表(0x00000000)中断。
1 = 使能BDMA接收空表中断。
[9]BDMA非所有者中断使能(BRxNOIE)
0 = 禁止BDMA非当前接收帧所有者中断。
1 = 使能BDMA非当前接收帧所有者中断。
[10]BDMA接收最大尺寸溢出中断使能(BRxMSOIE)
0 = 禁止BDMA接收最大尺寸溢出中断。
1 = 使能BDMA接收最大尺寸溢出中断。
[11]BDMA接收大/小端格式(BRxLittle)
0 = 大端数据帧格式。
1 = 小端数据帧格式(BDMA接收缓冲区中的帧数据在系统总线进行端格式转换)。
[13:12]BDMA接收字对齐(BrxWA)
00 = 无无效字节。
01 = 1个无效字节。
10 = 2个无效字节。
11 = 3个无效字节。
[14]BDMA接收使能(BRxEn)
0 = 禁用DBMA接收器。
1 = 使能BDMA接收器
[15]BDMA接收器复位(BRxRS)
0 = 无影响。
1 = 复位BDMA接收器
[16]BDMA接收缓冲空中断(BrxEmpty)
0 = 禁止接收缓冲空中断。
1 = 使能接收缓冲空中断。
[17]BDMA接收数据帧长度通知中断(BrxEmpty)
0 = 禁止接收数据帧长度通知中断。
1 = 使能接收数据帧长度通知中断。当BDMA控制器获得接收帧的长度值时,产生中断。
BDMA发送帧描述符起始地址寄存器(BDMA Transmit Frame Descriptor Start Address Register)
BDMA的发送帧描述符起始地址寄存器BDMATXPTR描述如下:
寄存器 | 偏移量 | 操作 | 描 述 | 复位值 |
BDMATXPTR | 0x9008 | 读/写 | BDMA发送帧描述符起始地址寄存器 | 0xFFFFFFFF |
表6-2-17 BDMA发送帧描述符起始地址寄存器描述
位 | 位名 | 功能描述 |
[25:0] | BDMA发送帧描述符起始地址 | BDMA发送帧描述符起始地址寄存器的内容为发送帧的帧描述符地址。在BDMA的操作过程中,该起始地址会更新为下一个帧地址。 |
BDMA接收帧描述符起始地址寄存器(BDMA Receive Frame Descriptor Start Address Register)
BDMA的接收帧描述符起始地址寄存器BDMARXPTR描述如下:
寄存器 | 偏移量 | 操作 | 描 述 | 复位值 |
BDMARXPTR | 0x900C | 读/写 | BDMA接收帧描述符起始地址寄存器 | 0xFFFFFFFF |
表6-2-18 BDMA接收帧描述符起始地址寄存器描述
位 | 位名 | 功能描述 |
[25:0] | BDMA接收帧描述符起始地址 | BDMA接收帧描述符起始地址寄存器的内容为接收帧的帧描述符地址。在BDMA的操作过程中,该起始地址会更新为下一个帧地址。 |
BDMA接收帧最大尺寸寄存器(BDMA Receive Frame Maximum Size Register)
BDMA接收帧最大尺寸寄存器BDMARXLSZ描述如下:
表6-2-19 BDMA接收帧最大尺寸寄存器描述
位 | 位名 | 功能描述 |
[15:0] | BDMA接收帧的最大尺寸(BRxLSZ) | 该值控制每帧有多少个字节可以保存到存储器中,如果接收帧的尺寸超过该值,则报告错误。 |
[31:16] | BDMA接收帧长度(BRxFSZ),只读 | 当接收帧长度通知中断产生时,帧长度/类型域保留当前存储帧的长度值。 |
BDMA状态寄存器(BDMA Status Register)
BDMA状态寄存器BDMASTAT描述如下:
表6-2-19 BDMA接收帧最大尺寸寄存器描述
位 | 位名 | 功能描述 |
[0] | BDMA每接收帧操作(BRxRDF) | 当该位置“1”时,BDMA接收器每接收到一个数据帧都移入存储器。若要产生下一帧接收中断,该位必须清零。 |
[1] | BDMA接收地址表空(BRxNL) | 当该位置“1”时,BDMARXPTR的地址值为空。 |
[2] | BDMA接收器非帧所有者(BRxNO) | 当该位置“1”时,BDMA接收器非当前帧的所有者。 |
[3] | BDMA接收最大尺寸溢出(BRxMSO) | 当该位置“1”时表示接收帧的尺寸大于接收帧最大尺寸寄存器(BDMARXLSZ)的值。 |
[4] | BDMA接收缓冲区空(BRxEmpty) | 当该位置“1”时,BDMA接收缓冲区为空。 |
[5] | 帧长度通知(BRxEarly) | 当BDMA接收器接收到当前帧的长度/类型域时该位置“1”。 |
[6] | 保留 | 未使用 |
[7] | BDMA接收缓冲区多于一个数据帧(BRxFRF) | 当BDMA接收缓冲区多于一个数据帧时该位置“1”。。 |
[15:8] | BDMA接收缓冲区帧数(BRxNFR) | 该值为BDMA接收缓冲区当前接收到的总帧数。 |
[16] | BDMA发送控制包完成(BTxCCP) | 每当MAC发送控制包完成时该位置“1”。 |
[17] | BDMA接收地址表空(BTxNL) | 如果BDMATXPTR的值为空,该位置“1”。 |
[18] | BDMA发送器非当前帧所有者(BTxNO) | 如果BDMA发送器非当前帧所有者,该位置“1”。 |
[19] | 保留 | 未使用 |
[20] | BDMA发送缓冲区空(BTxEmpty) | 若BDMA发送缓冲区空,该位置“1” |
[31:21] | 保留 | 未使用 |
[0]BDMA每接收帧操作(BRxRDF)
0 = 复位BDMA接收器。
1 = 完全接收每一个数据帧并移入存储器。
[1]BDMA接收地址表空(BRxNL)
0 = 设置新帧描述符的复位状态。
1 = 当前帧描述符的地址为空(0x00000000)。
[2]BDMA接收器非帧所有者(BRxNO)
0 = BDMA接收器为当前帧的所有者。
1 = BDMA接收器非当前帧的所有者(CPU为所有者),此时BDMA接收器停止工作,BRxSTSKO位置“1”。
[3]BDMA接收最大尺寸溢出(BRxMSO)
0 = 处于复位状态或下一个帧到达BDMA接收缓冲。
1 = 接收帧的大小超过最大帧尺寸。
[4]BDMA接收缓冲区空(BRxEmpty)
0 = BDMA接收缓冲区非空。
1 = BDMA接收缓冲区为空。
[5]BDMA接收帧长度通知(BRxEarly)
0 = 正常操作。
1 = 通过读取BDMA接收最大帧尺寸寄存器BDMARXLSZ[31:16]的值,可以获取当前帧的长度。
[7]BDMA接收缓冲区多于一个数据帧(BRxFRF)
0 = BDMA接收缓冲区仅有一个数据帧。
1 = BDMA接收缓冲区多于一个数据帧。
[15:8]BDMA接收缓冲区当前的总数据帧数(BRxNFR)
[16]BDMA发送控制包完成(BTxCCP)
0 = 写“1”清除该位或复位BDMA发送器。
1 = MAC发送控制包完成。
[17]BDMA发送接收地址表空(BTxNL)
0 = 设置新帧描述符的复位状态。
1 = 当前帧描述符的地址为空(0x00000000)。
[18]BDMA发送器非帧所有者(BTxNO)
0 = BDMA发送器为当前帧的所有者。
1 = BDMA发送器非当前帧的所有者(CPU为所有者),此时BDMA发送器停止工作,如果BTxSTSKO位置“1”。
[20]BDMA发送缓冲区空(BTxEmpty)
0 = BDMA发送缓冲区非空。
1 = BDMA发送缓冲区为空。
注:为使下一帧数据能产生对应的中断,应该通过对其写“1”的方式将位0、1、2、3、4、16、17、18和20清零。
匹配地址存储器寄存器(Content Address Memory(CAM) Register)
有21个CAM用于暂停控制包的发送和目的地址的识别,CAM存放目的每一个目的地址由6个字节组成,共占用32字的空间(32×4字节),因此最多可以保留21个独立的目的地址。
用户可以使用CAM的0、1和18传送暂停控制包,在传送暂停控制包时,目的地址写入CAM0,源地址写入CAM1,包长度/类型,操作码和操作数写入CAM18,然后设置MAC发送控制寄存器的发送暂停控制位。
表6-2-20 CAM寄存器描述
位 | 位名 | 功能描述 |
[31:0] | CAM内容 | CPU使用CAM内容作为目的地址。要使用CAM功能,必须设置控制寄存器的相应位。 |
MAC寄存器(Media Access Control(MAC)Register)
以太网MAC控制器包括一些控制寄存器和状态寄存器,主要有MAC控制寄存器、发送与接收控制寄存器,CAM控制寄存器,一个用于网络管理的计数器,以及一些流控寄存器,如表6-2-21所示。
表6-2-21 MAC控制与状态寄存器
寄存器 | 偏移地址 | 操作 | 功能描述 | 复位值 |
MACON | 0xA000 | 读/写 | MAC控制寄存器 | 0x00000000 |
CAMCON | 0xA004 | 读/写 | CAM控制寄存器 | 0x00000000 |
MACTXCON | 0xA008 | 读/写 | MAC发送控制寄存器 | 0x00000000 |
MACTXSTAT | 0xA00C | 读/写 | MAC发送状态寄存器 | 0x00000000 |
MACRXCON | 0xA010 | 读/写 | MAC接收控制寄存器 | 0x00000000 |
MACRXSTAT | 0xA014 | 读/写 | MAC接收状态寄存器 | 0x00000000 |
STADATA | 0xA018 | 读/写 | 站管理数据寄存器 | 0x00000000 |
STACON | 0xA01C | 读/写 | 站管理控制与地址寄存器 | 0x00006000 |
CAMEN | 0xA028 | 读/写 | CAM使能寄存器 | 0x00000000 |
EMISSCNT | 0xA03C | 读清除/写 | 丢包错误计数器 | 0x00000000 |
EPZCNT | 0xA040 | 读 | 暂停寄存器 | 0x00000000 |
ERMPZCNT | 0xA044 | 读 | 远程暂停寄存器 | 0x00000000 |
ETXSTAT | 0x9040 | 读 | 发送控制帧状态寄存器 | 0x00000000 |
MAC控制寄存器(MAC Control Register)
MAC控制寄存器为MAC提供全局的控制与状态信息,除位[10](MissRoll)为状态位以外,其余均为MAC控制位。
MAC控制寄存器的设置对发送和接收都有影响,也可以单独对发送或接收操作进行控制。
表6-2-22 MAC控制寄存器描述
位 | 位名 | 功能描述 |
[0] | 停止请求(HaltReq) | 当该位置“1”时,只要当前包的发送或接收完成,就停止数据包的发送或接收。 |
[1] | 立即停止(HaltImm) | 当该位置“1”时,立即停止所有的发送或接收操作。 |
[2] | 软件复位(Reset) | 当该位置“1”时,复位所有的MAC控制与状态寄存器和MAC状态机。 |
[3] | 全双工(FullDup) | 当该位置“1”时,发送和接收操作同时进行(全双工)。 |
[4] | MAC回环(MACLoop) | 当该位置“1”时,数据包在MAC控制器内进行回环收发。 |
[5] | 保留 | 未使用 |
[6] | MII关闭 | 该位用于选择连接模式。“1”选择10M接口,“0”选择MII。 |
[7] | Loop10 | 当该位置“1”时,Loop_10外部信号有效 |
[9:8] | 保留 | 未使用 |
[10] | Missed Roll | 当丢包错误计数器发生卷绕时,该位自动置“1”。 |
[11] | 保留 | 未使用 |
[12] | MDC关闭 | 当该位为“0”时,使能用于电源管理的MDC时钟生成功能,为“1”时,禁用该功能。 |
[13] | Missed Roll使能(EnMissRoll) | 当该位置“1”时,无论何时发生丢包错误计数器卷绕都将产生中断。 |
[14] | 保留 | 未使用 |
[15] | 10M链接状态(Link10) | 该的值对应Link10引脚的状态。 |
[31:16] | 保留 | 未使用 |
CAM控制寄存器(CAM Control Register)
无论CAM是否拒绝数据包,CAM控制寄存器有三个接收控制位用于接收特殊目的地址的数据包,对应的三类特殊目的地址为:
- 站包地址,第一个字节为偶数。例如:00-00-00-00-00-00。
- 多播组地址,第一个字节为奇数,但地址 FF-FF-FF-FF-FF-FF除外。例如:01-00-00-00-00-00。
- 广播地址:FF-FF-FF-FF-FF-FF
当使能CAM的比较模式,会根据CAM存储器的目的地址对到达的信息进行过滤。通过设置三个接收控制位,可以接收所有的数据包,当对CAM控制寄存器清零时,拒绝所有的数据包。
表6-2-23 CAM控制寄存器描述
位 | 位名 | 功能描述 |
[0] | 站包接收(StationAcc) | 当该位置“1”时,接收目的地址为“单播”(Unicast)站包地址的数据包。 |
[1] | 组接收(GroupAcc) | 当该位置“1”时,接收目的地址为“多播”(Multicast)组地址的数据包。 |
[2] | 广播接收(BroadAcc) | 当该位置“1”时,接收目的地址为广播地址的数据包。 |
[3] | Negative CAM(NegCAM) | 当该位为“0”时,接收被CAM识别的数据包,其余的包丢弃。当该位为“1”时,接收未被CAM识别的数据包,其余的包丢弃。 |
[4] | 比较使能(CompEn) | 当该位置“1”时使能比较模式。 |
[31:5] | 保留 | 未使用。 |
MAC发送控制寄存器(MAC Transit Control Register)
通过设置MAC发送控制寄存器的使能完成控制位和所有的MAC错误使能控制位,可在每一个数据包发送完成后产生中断。如果只对MAC发送控制寄存器的相应位进行设置,则可以有选择的使能某些特定的中断。
表6-2-24 MAC发送控制寄存器描述
位 | 位名 | 功能描述 |
[0] | 发送使能(TxEn) | 当该位置“1”时,发送使能,该位清“0”时立即停止发送。 |
[1] | 发送停止请求(TxHalt) | 当该位置“1”时,在完成当前帧的发送后停止发送操作。 |
[2] | 无填充(NoPad) | 当该位置“1”时,不为少于64字节的数据包生成填充。 |
[3] | 无CRC(NoCRC) | 当该位置“1”时,不在数据包末尾增加一个CRC。 |
[4] | 快速回退(FBack) | 当该位置“1”时,使用快速回退用于测试。 |
[5] | 无延迟(NoDef) | 当该位置“1”时,禁用延时计数器。延时计数器持续计数直到载波侦听位关闭。 |
[6] | 发送暂停(SdPause) | 当该位置“1”时,发送一个暂停命令或其他的MAC控制包。当一个完整的MAC控制包发送后,发送暂停位自动清除。 |
[7] | MII 10M SQE测试模式使能(SQEn) | 该位置“1”使能MII 10M SQE测试模式。 |
[8] | Underrun使能(EnUnder) | 当该位置“1”时,若在发送过程中MAC发送FIFO空,则产生中断。 |
[9] | 延迟使能(EnDefer) | 当该位置“1”时,若MAC延迟MAX_DEFERRAL时间:“0”=在100M时0.32768毫秒;“1”=在10M时3.2768毫秒,则产生中断。 |
[10] | 无载波使能(EnNCarr) | 当该位置“1”时,若在发送一个完整包的过程未检测到载波,则产生中断。 |
[11] | 过冲突使能(EnExColl) | 当该位置“1”时,若同一个包在发送过程中产生16次冲突,则产生中断。 |
[12] | 延迟冲突使能(EnLateColl) | 当该位置“1”时,若在512位时间之后发生冲突,则产生中断。 |
[13] | 发送奇偶使能(EnTxPar) | 当该位置“1”时,若在MAC的发送FIFO中检测到奇偶错误,则产生中断。 |
[14] | 完成使能(EnComp) | 当该位置“1”时,无论MAC发送或丢弃一个包,都产生中断。 |
[31:15] | 保留 | 未使用 |
MAC发送状态寄存器(MAC Transit Status Register)
当有对应的事件发生时,MAC发送状态寄存器MACTXSTAT设置发送状态标志,同时,如果发送控制寄存器的相应中断使能位被设置,还产生中断请求。
表6-2-25 MAC发送状态寄存器描述
位 | 位名 | 功能描述 |
[3:0] | 发送冲突计数(TxColl) | 该4位记录在成功发送数据帧后产生的冲突次数。 |
[4] | 过冲突 (ExColl) | 当该位置“1”时表示同一个包在发送过程中产生了16次冲突,在这种情况下,该数据包被丢弃。 |
[5] | 发送延迟(TxDefered) | 当该位置“1”时表示数据包在发送过程中被延迟。 |
[6] | 暂停(Paused) | 当该位置“1”时表示数据包在发送时由于收到暂停命令而被延迟。 |
[7] | 发送中断(IntTx) | 当该位置“1”时表示在发送数据包时有中断发生。 |
[8] | Underrun(Under) | 当该位置“1”时表示在包的发送过程中MAC发送FIFO空。 |
[9] | 延迟 (Defer) | 当该位置“1”时表示MAC延迟MAX_DEFERRAL时间:在100M时0.32768毫秒;在10M时3.2768毫秒。 |
[10] | 无载波 (NCarr) | 当该位置“1”时表示在发送一个数据包的过程未检测到载波。 |
[11] | 信号质量错误(SQE) | 当该位置“1”时表示在规定的时间内未报告SQE测试信号。 |
[12] | 延迟冲突(LateColl) | 当该位置“1”表示在512位时间之后发生冲突。 |
[13] | 发送奇偶错误(TxPar) | 当该位置“1”时表示在MAC的发送FIFO中检测到奇偶错误。 |
[14] | 完成(Comp) | 当该位置“1”时表示MAC发送或丢弃了一个包。 |
[15] | 发送停止(TxHalted) | 如果由于清除了TxEn位(MACTXCON中)或设置了HaltImm位(MACON中),使发送停止,该位置“1”。 |
[31:16] | 保留 | 未使用 |
MAC接收控制寄存器(MAC Receive Control Register)
通过设置MAC接收控制寄存器的数据包好位和所有的MAC错误使能控制位,可在每一个数据包接收完成后产生中断。如果只对MAC接收控制寄存器的相应位进行设置,则可以有选择的使能某些特定的中断。
表6-2-26 MAC接收控制寄存器描述
位 | 位名 | 功能描述 |
[0] | 接收使能(RxEn) | 当该位置“1”时,接收使能,该位清“0”时立即停止接收。 |
[1] | 接收停止请求(RxHalt) | 当该位置“1”时,在完成当前帧的接收后停止接收操作。 |
[2] | 长使能(LongEn) | 当该位置“1”时,接收数据包的长度大于1518字节。 |
[3] | 短使能(ShortEn) | 当该位置“1”时,接收数据包的长度小于64字节。 |
[4] | 去除CRC值(StripCRC) | 当该位置“1”时,在完成CRC校验后,从数据包中去除CRC值。 |
[5] | 控制包通过(PassCtl) | 当该位置“1”时,使能控制包到达MAC。 |
[6] | 忽略CRC值(IgnoreCRC) | 当该位置“1”时禁用CRC校验。 |
[7] | 保留 | 未使用 |
[8] | 对齐使能(EnAlign) | 当该位置“1”时使能对齐中断。当接收到的数据包长度(按位)不是八的倍数或CRC无效则产生对齐中断。 |
[9] | CRC错误使能(EnCRCErr) | 当该位置“1”时使能CRC中断。当接收到的数据包CRC无效或在接收时物理层产生Rx_er信号,则产生CRC中断。 |
[10] | 上溢使能 (EnOver) | 当该位置“1”时使能上溢中断。当接收数据包时MAC的接收FIFO满,产生上溢中断。 |
[11] | 长错误使能 (EnLongErr) | 当该位置“1”时使能长错误中断。当接收数据帧长度超过1518时,产生长错误中断,除非长使能位被置“1”。 |
[12] | 保留 | 未使用 |
[13] | 接收奇偶使能(EnRxPar) | 当该位置“1”时,若在MAC的接收FIFO中检测到奇偶错误,则产生中断。 |
[14] | 好使能 (EnGood) | 当该位置“1”时,若完整接收到一个数据包产生数据包好中断。 |
[31:15] | 保留 | 未使用 |
注:以上的数据帧长度不包括前导和起始帧分隔符SFD。
MAC接收状态寄存器(MAC Receive Status Register)
当有对应的事件发生时,MAC接收状态寄存器MACRXSTAT设置接收状态标志,当某个状态位被设置时,会保持到另一个数据包到达或通过软件写“1”的方式清除,同时,如果接收控制寄存器的相应中断使能位被设置,还产生中断请求。
表6-2-25 MAC接收状态寄存器描述
位 | 位名 | 功能描述 |
[4:0] | 保留 | 未使用 |
[5] | 控制帧到达 (CtlRecd) | 当接收的数据包为MAC控制帧(Type = 8808H),或当CAM能识别包目的地址,或帧长度为64字节,该位置“1” |
[6] | 接收中断 (CtlRecd) | 当接收数据包产生中断时,该位置“1”。 |
[7] | 10M接收状态 (Rx10Stat) | 当数据包从7线接口接收时,该位置“1”,当数据包从MII接收时,该位清零。 |
[8] | 对齐错误 (AlignErr) | 当数据帧的长度(按位)不是8的整数倍或CRC无效时,该位置“1”。 |
[9] | CRC错误 (CRCErr) | 当数据帧尾部的CRC与计算值不匹配时,或在包的接收过程中物理层PHY发出Rx_er信号时,该位置“1”。 |
[10] | 溢出错误 (Overflow) | 当需要存储接收的数据而MAC接收FIFO满时,该位置“1”。 |
[11] | 数据长错误 (LongErr) | 当MAC接收到的数据帧超过1518字节时,该位置“1”。但当接收控制寄存器中的长数据使能位为“1”时,该位不会被置为“1”。 |
[12] | 保留 | 未使用 |
[13] | 接收奇偶错(RxPar) | 如果在MAC接收FIFO中检测到奇偶错时,该位置“1”。 |
[14] | 接收好(Good) | 如果数据包被成功接收,未发生任何错误,该位置“1”。当MAC接收控制寄存器中的EnGood为“1”时,同时会产生中断。 |
[15] | 接收停止(RxHalted) | 如果由于清除了RxEn位(MACRXCON中)或设置了HaltImm位(MACON中),使接收停止,该位置“1” |
[31:16] | 保留 | 未使用 |
MAC站管理数据寄存器(MAC Station Management Data Register)
表6-2-26 站管理数据寄存器描述
位 | 位名 | 功能描述 |
[15:0] | 站管理数据 | 该寄存器的内容为用于站管理功能的16位数据。 |
MAC站管理控制与地址寄存器(MAC Station Management Control and Address Register)
表6-2-27 站管理控制与地址寄存器描述
位 | 位名 | 功能描述 |
[4:0] | 物理层寄存器地址 | 该5位的内容为物理层寄存器地址。 |
[9:5] | 物理层地址 | 该5位的内容为物理层设备的地址。 |
[10] | 写(Wr) | 该位置“1”,初始化为写操作,清零为读操作。 |
[11] | 忙(Busy) | 当开始读/写操作时,该位置“1”,当读/写操作结束时,MAC控制器自动清除该位。 |
[12] | 无前导(PreSup) | 当该位置“1”时,前导不送到PHY,为“0”时送到PHY。 |
[15:13] | MDC时钟周期 | 用于控制MDC周期。 STACON[15:13] MDC周期 000 16×(1/fMCK) 001 18×(1/fMCK) 010 20×(1/fMCK) . . 111 30×(1/fMCK) MDC周期 = STACON[15:13]×2+16 STACON[15:13]默认值为“100”。 |
[31:16] | 保留 | 未使用 |
CAM使能寄存器(CAM Enable Register)
CAM使能寄存器,CAMEN,标识哪一个CAM地址有效,可用于直接的比较工作模式。寄存器的0到20位对应于21个CAM地址的有效性,当CAM地址少于21个时,寄存器的较高位被忽略。
表6-2-28 CAM使能寄存器描述
位 | 位名 | 功能描述 |
[20:0] | CAM使能(CAMEn) | 若某位置“1”,则对应的CAM地址有效,清零则对应的CAM地址无效。 |
[31:21] | 保留 | 未使用 |
MAC丢包错误计数寄存器(MAC Missed Error Count Register)
MAC丢包错误计数寄存器(EMISSCNT)的值指示由于各种错误丢弃的数据包数量。结合数据包发送与接收的状态信息,该寄存器和另外两个暂停计数寄存器提供用于站管理所需要的信息。
对该寄存器进行读操作会清除其内容。
表6-2-29 MAC丢包错误计数寄存器描述
位 | 位名 | 功能描述 |
[15:0] | 对齐错误计数(AlignErrCnt) | 接收到的对齐错误包数量。在包接收结束时,如果Rx_Stat值指示有一个对齐错误,该软件计数器增加。 |
CRC错误计数(CRCErrCnt) | 接收到的CRC错误包数量。如果Rx_Stat值指示有一个CRC错误,该软件计数器增加。 | |
丢包错误计数(MissErrCnt) | 由于MAC接收FIFO溢出、奇偶错误、或Rx_En位被清除等原因,被MAC控制器拒绝的有效包数量。该数字不包括被CAM拒绝的包数量。 | |
[31:16] | 保留 | 未使用 |
MAC接收暂停计数寄存器(MAC Received Pause Count Register)
MAC接收暂停计数寄存器(EPZCNT)保持16位接收暂停计数器的当前值。
表6-2-30 MAC接收暂停计数寄存器描述
位 | 位名 | 功能描述 |
[15:0] | 接收暂停计数(EPZCNT) | 该计数值指示由于接收来自MAC的暂停控制操作包而引起发送器暂停的时间单位数量。 |
MAC远程暂停计数寄存器(MAC Remote Pause Count Register)
MAC远程暂停计数寄存器(ERMPZCNT)保持16位远程暂停计数器的当前值。
表6-2-31 MAC接收暂停计数寄存器描述
位 | 位名 | 功能描述 |
[15:0] | 远程暂停计数(ERMPZCNT) | 该计数值指示由于发送暂停控制操作包而引起远程MAC暂停的时间单位数量。 |
MAC发送控制帧状态寄存器(MAC Transmit Control Frame Status Register)
MAC发送控制帧状态寄存器(ETXSTAT)是一个基于RAM的寄存器,提供MAC控制包发送到远程站的状态信息。
DMA引擎读取该寄存器的值,并产生中断通知系统MAC控制包的发送已经完成。
表6-2-32 MAC发送控制帧状态寄存器描述
位 | 位名 | 功能描述 |
[15:0] | 发送状态值(Tx_Stat) | 该16位的值指示MAC控制包发送到远程站的状态信息。该值由DMA引擎读取。 |
以太网控制器的操作(Ethernet Controller Operation)
该部分包括S3C4510B以太网控制器的如下内容:
- MAC帧与包格式。
- 发送一个帧。
- 接收一个帧。
- 全双工暂停操作。
- 错误信号与网络管理。
MAC帧与包格式(MAC Frame and Packer Formats)
MAC发送所有域的每一个字节,除帧检测序列FCS外,总是最低位在前。在此,对帧和包的概念作一个说明,“包”通常是指发送或接收的所有字节序列。而“帧”仅指由站发送或接收的字节。
表6-2-33 MAC帧与包的格式描述
域名 | 域尺寸 | 描 述 |
前导(Preamble) | 7字节 | 每一个前导字节的各个位为:10101010,从左到右发送。 |
起始帧分隔符(SFD) | 1字节 | SFD的每个位为:10101011,从左到右发送。 |
目的地址 | 6字节 | 目的地址可以是单独的地址,多播(或广播)地址。 |
源地址 | 6字节 | MAC不对源地址字节作检测,但作为一个有效的站地址,发送的第一个位(第一个字节的最低位)必须为“0“ |
长度或类型 | 2字节 | 当该长度域大于1500字节时,MAC将其作为类型域处理。该域小于或等于1500时表示数据域中逻辑链路控制(LLC)数据字节数。MAC首先发送高字节。 |
逻辑链路控制(LLC)数据 | 46到1500字节 | 用于逻辑链路控制的数据字节。 |
填充(PAD) | 0到46字节 | 如果LCC数据少于46字节,MAC发送时填充全“0”的字节。 |
帧检测序列(FCS) | 4字节 | FCS域包含16位的错误检测码。 |
图6.2.14为一个IEEE802.3以太网包(帧)的域。
图6.2.14 一个IEEE802.3以太网包(帧)的域
对标准MAC帧有影响的选项(Options that Affect the Standard MAC Frame)
有些选项会对标准的MAC帧产生影响,如下所述:
- 某些物理层会发送较长或较短的前导。
- 短包模式允许LCC数据域少于46字节,通过选项可以不要填充和支持短包的接收。
- 长包模式允许LCC数据域多于1500字节,通过选项可以支持长包接收。
- “无CRC”模式不在数据包末尾增加CRC域。
- “忽略CRC”模式允许接收的数据包CRC域无效。
目的地址格式(Destination Address Format)
目的地址的第0位为地址类型位,该位标识目的地址是独立的地址还是组地址,组地址有时称为“多播”地址,独立地址称为“单播”地址,广播地址为一种特殊的组地址,具有特殊的16进制格式:FF-FF-FF-FF-FF-FF。
第1位区别目的地址是局部管理地址还是全局管理地址,若为全局管理地址,该位的值为“0”,若为局部管理地址,该位的值为“1”,对于广播地址,该位也必须置“1”。
以下为目的地址格式:
[0]独立或组地址标识(I/G)
0 = 独立(单播)地址。
1 = 组(多播)地址。
[1]全局与局部地址标识(U/L)
0 = 全局地址。
1 = 局部地址。
特定流控目的地址(Special Flow Control Destination Address)
特定流控目的地址用于发送暂停操作包,为使MAC能接收到包含该特定目的地址的控制包,目的地址必须放在特定的CAM单元里(CAM0),同时该CAM单元必须使能、CAM必须有效。
发送一个帧(Transmitting a Frame)
要发送一个帧,发送控制寄存器中的发送使能位必须置“1”,发送停止请求位必须清“0”,此外,MAC控制寄存器中的立即停止位和停止请求位也必须清“0”,这些条件通常在BDMA控制器初始化完成以后设置,然后由系统使用Tx_wr#和Tx_EOF信号传输字节数据到发送数据缓冲区。
发送状态机开始发送FIFO中的数据,并保持前64个字节直到本站获得网络控制权,此时,发送模块请求更多的数据并发送,直到系统输入Tx_EOF信号通知到达发送的数据包末尾,发送模块添加经过计算的CRC到数据包的末尾并发送出去,然后设置发送状态寄存器的第0位,表示成功发送。如果中断使能,该操作同时产生一个中断请求。
一个帧的发送操作可以分为一个MII接口操作和一个BDMA/MAC接口操作。
BDI发送操作(BDI Transmit Operation)
BDI发送操作是一个简单的FIFO机制。BDMA引擎保存待发送的数据,当MAC成功取得网络控制权时,发送状态机将数据发送出去。
复位后,发送FIFO为空,发送模块发出Tx_rdy信号,发送被禁止。要使能发送,系统必须设置发送控制寄存器的发送使能位,此外,发送FIFO中必须有8个字节的数据。BDMA引擎可以先将数据放入发送FIFO,后使能发送位,也可以先使能发送位,后将数据放入发送FIFO。总之,只有两个条件同时满足,才能开始发送操作。
MII发送操作(MII Transmit Operation)
MII发送模块由3个状态机组成,具体工作原理可以参考S3C4510B的用户手册。
接收一个帧(Receiving a Frame)
当接收模块使能时,监控从MII(在回环模式下)或从发送模块传来的数据流。MII提供0到7个前导字节,然后是起始帧分隔符(SFD)。接收模块首先检测前导字节,然后在前8个字节中寻找SFD(10101011),如果不能检测到SFD,就将包当做碎片丢弃。
其后是目的地址,最低位在前,当接收到一个字节,接收模块生成奇偶位并将其存储到接收FIFO中,同时发出Rx_rdy信号.接收模块然后接收其后的数据并将其存入接收FIFO。
S3C4510的以太网控制器是所有部件中控制最复杂的一个,关于以太网控制器的工作原理更详细的内容,可参考S3C4510B的用户手册。
关于以太网控制器的初始化和发送、接收编程,读者可参考已经移植到S3C4510B的uClinux源代码,该源代码有详细的描述,限于篇幅,不在此列出。源代码位于:/Linux/drivers/net/s3c4510.c。
6.2.8 Flash存储器工作原理与编程示例
Flash存储器的操作包括对Flash的擦除和烧写,由前面所介绍的Flash存储器的工作原理可知,对Flash存储器的编程与擦除是与具体的器件型号紧密相关的,由于不同厂商的Flash存储器在操作命令上可能会有一些细微的差别,Flash存储器的烧写、擦除程序一般不具有通用性,针对不同厂商、不同型号的Flash存储器,程序应作相应的修改。
以本系统所使用的Flash存储器HY29LV160为例,详细说明其操作命令及相关的编程方法,其他厂商或型号的Flash存储器的编程方法与之类似。
HY29LV160是HYUNDAI公司生产的Flash存储器,其主要特点有:3 V单电源供电,可使内部产生高电压进行编程和擦除操作;支持JEDEC单电源Flash存储器标准和CFI(Common Flash Memory Interface)特性;只需向其命令寄存器写入标准的微处理器指令,具体编程、擦除操作由内部嵌入的算法实现,并且可以通过查询特定的引脚或数据线监控操作是否完成;可以对任一扇区进行读、写或擦除操作,而不影响其它部分的数据。
Flash存储器的操作命令
向Flash存储器的特定寄存器写入地址和数据命令,就可对Flash存储器进行烧写、擦除等操作,但操作必须按照一定的顺序,否则就会导致Flash存储器复位而使操作命令无法完成。编程指令只能使‘1’变为‘0’,而擦除命令可使‘0’变为‘1’,因此正确的操作顺序是先擦除,后编程,当Flash存储器被擦除以后,读出的内容应全为0xff。以下介绍HY29LV160编程命令、整片擦除命令以及对应的程序设计,关于HY29LV160更详细的内容可参考本书所附光盘中HY29LV160的用户手册。
1、 正常编程命令:
| 第一步 | 第二步 | 第三步 | 第四步 | |||||
地址 | 数据 | 地址 | 数据 | 地址 | 数据 | 地址 | 数据 | ||
正常编程 | 字 | 0x555 | 0xAA | 0x2AA | 0x55 | 0x555 | 0xA0 | 待编程 | 待编程 |
字节 | 0xAAA |
| 0x555 |
| 0xAAA |
| 的地址 | 的数据 |
如上表所示,向HY29LV160的指定地址中写入数据,可按字(16位)或字节(8位)操作,共需要四个总线周期,分四步完成,前两个周期是解锁周期,第三个是建立编程命令,最后一个周期完成向待编程地址写入特定的数据。
2、 整片擦除命令:
| 第一步 | 第二步 | 第三步 | 第四步 | |||||
地址 | 数据 | 地址 | 数据 | 地址 | 数据 | 地址 | 数据 | ||
整片擦除 | 字 | 0x555 | 0xAA | 0x2AA | 0x55 | 0x555 | 0x80 | 0x555 | 0xAA |
字节 | 0xAAA |
| 0x555 |
| 0xAAA |
| 0xAAA |
| |
| 第五步 | 第六步 |
| ||||||
地址 | 数据 | 地址 | 数据 | ||||||
整片擦除 | 字 | 0x2AA | 0x55 | 0x555 | 0x10 | ||||
字节 | 0x555 |
| 0xAAA |
|
如上表所示,将HY29LV160整片擦除,也可按字(16位)或字节操作,共需要六个总线周期,分六步完成,前两个是解锁周期,第三个是建立编程命令,第四、第五是解锁周期,最后一个周期是整片擦除周期。
FLASH存储器的操作检测
当按照规定的命令序列向Flash存储器发出命令时,其内部的编程或擦除算法就可自动完成编程或擦除操作,但无论是编程或擦除都需要一定的操作时间,同时用户还应了解其内部的操作检测机制,以便知道操作是否完成或操作是否正确。常用检测的状态位有:跳变位(DQ6)、超时标志位(DQ5)、数据查询位(DQ7)和Ready/Busy引脚(RY/BY#)。
常用的检测方法有三种:第一种是判断引脚RY/BY#的状态,在编程或擦除操作过程中,RY/BY#引脚一直为低电平,操作完成后变为高电平;第二种是检测跳变位DQ6,在编程或擦除时对任何地址进行连续的读均引起DQ6连续跳变,直至操作结束才停止跳变;第三种方法是使用数据线的DQ7和DQ5位,DQ7位在编程或擦除过程中输出的数是写入该位数据的反码,当操作完成时输出才变为写入该位的数据;DQ5的状态为“1”时表示操作超时,此时应再读一次DQ7的状态,若DQ7输出仍不是写入的数据,则操作失败,复位Flash存储器。其流程如图6.2.1所示。
对于第一种方法,需要占用系统的I/O口以判断引脚RY/BY#的状态,故较少使用,而第二种方法对DQ6的连续跳变检测相对较困难,因此,常用第三种方法检测Flash存储器的工作状态。
本例采用第三种方法编程检测Flash存储器的工作状态,程序流程如图6.2.14。
图6.2.14 检测Flash存储器状态的流程图
FLASH存储器的整片擦除示例
打开CodeWarrior for ARM Developer Suite(或ARM Project Manager),新建一个项目,并新建一个文件,名为Init.s,具体内容与第一个例子相同。
保存Init.s,并添加到新建的项目。
再新建一个文件,名为main.c,具体内容如下:
/*****************************************************************
* Institute of Automation, Chinese Academy of Sciences
* File Name: main.c
* Description:
* Author: JuGuang.Lee
* Date:
*****************************************************************/
#define FLASH_START_ADDR 0x0000
#define FLASH _ADDR_UNLOCK1 0x555
#define FLASH _ADDR_UNLOCK2 0x2aa
#define FLASH _DATA_UNLOCK1 0xaaaa
#define FLASH _DATA_UNLOCK2 0x5555
#define FLASH _SETUP_ERASE 0x8080
#define FLASH _CHIP_ERASE 0x1010
#define UINT16 unsigned short
int FlashStatusDetect(UINT16 *ptr, UINT16 Data, int TimeCounter);
int Main()
{
int i;
volatile UINT16 *flashPtr=(UINT16 *) FLASH _START_ADDR;
//按HY29LV160整片擦除命令要求写入命令序列,以16位方式操作
*((volatile UINT16 *) FLASH_START_ADDR+ FLASH _ADDR_UNLOCK1) = FLASH _DATA_UNLOCK1;
*((volatile UINT16 *) FLASH _START_ADDR+ FLASH _ADDR_UNLOCK2) = FLASH _DATA_UNLOCK2;
*((volatile UINT16 *) FLASH _START_ADDR+ FLASH _ADDR_UNLOCK1) = FLASH _SETUP_ERASE;
*((volatile UINT16 *) FLASH_START_ADDR+ FLASH_ADDR_UNLOCK1) = FLASH_DATA_UNLOCK1;
*((volatile UINT16 *) FLASH_START_ADDR+ FLASH_ADDR_UNLOCK2) = FLASH_DATA_UNLOCK2;
*((volatile UINT16 *) FLASH_START_ADDR+ FLASH_ADDR_UNLOCK1) = FLASH _CHIP_ERASE;
//判断擦除操作是否正确完成
if(FlashStatusDetect((UINT16 *)flashPtr, 0xffff, 0x1000000)!=1)
printf(“ERROR!”);
return(0);
}
int FlashStatusDetect(UINT16 *ptr, UINT16 Data, int TimeCounter)
{
int tmp = TimeCounter;
volatile UINT16 *p = ptr;
UINT16 data1, data2, current_data;
current_data = Data & 0x8080;
while((*p& 0x8080) != current_data)
{
if(tmp-- <= 0)
return 0;
}
return 1;
}
在该程序中,首先以16位方式操作方式,按HY29LV160整片擦除命令要求写入命令序列,然后判断DQ7的状态是否正确。为稳妥起见,在擦除完成之后还应读取Flash存储器的内容与0xFFFF相比较,看是否相等,若相等则表明擦除操作完全正确,否则表明擦除操作错误或Flash存储器已经损坏,读者可自行添加这段代码。
注意符号常量FLASH_START_ADDR,程序中用其标识系统中Flash存储器的起始物理地址,此例假定系统中Flash存储器的起始物理地址为0x0,在系统复位或上电时,位于ROM/SRAM/FLASH Bank0的Flash存储器的起始物理地址会被映射到0x0,可用此例程进行整片擦除操作。但当Flash中写有应用程序或操作系统时,这些程序在启动并初始化系统后,可能会把Flash存储器映射到其他的地址空间,此时应修改该起始地址,否则就不能正确擦除Flash存储器。
保存main.c,并添加到新建的项目,并对该项目进行编译链接,生成可执行的映象文件。
在编译链接项目文件时,将链接器程序的入口地址为0x0040,0000。
打开AXD Debugger(或ARM Debugger for Windows)的命令行窗口,执行obey命令:
>obey C:/memmap.txt
系统中SDARM被映射到0x0040,0000~(0x0140,0000-1),Flash存储器被映射到起始地址为0x0处。
从0x0040,0000处装入生成的可执行的映象文件,并将PC指针寄存器修改为0x0040,0000,运行可执行的映象文件,就可整片擦除系统中的Flash存储器。
FLASH存储器的编程示例
该例程完成向Flash存储器的一个单元写入数据,以此为基础,读者可以编写更复杂、功能更强的Flash烧写工具。
打开CodeWarrior for ARM Developer Suite(或ARM Project Manager),新建一个项目,并新建一个文件,名为Init.s,具体内容与第一个例子相同。
保存Init.s,并添加到新建的项目。
再新建一个文件,名为main.c,具体内容如下:
/*****************************************************************
* Institute of Automation, Chinese Academy of Sciences
* File Name: main.c
* Description:
* Author: JuGuang.Lee
* Date:
*****************************************************************/
#define FLASH_START_ADDR 0x0000
#define FLASH _ADDR_UNLOCK1 0x555
#define FLASH _ADDR_UNLOCK2 0x2aa
#define FLASH _DATA_UNLOCK1 0xaaaa
#define FLASH _DATA_UNLOCK2 0x5555
#define FLASH _SETUP_WRITE 0xa0a0
#define UINT16 unsigned short
int Main()
{
volatile UINT16 *to_add;
to_add= (UINT16 *)0x0; //写入的地址
*((volatile UINT16 *) FLASH _START_ADDR + FLASH _ADDR_UNLOCK1) = FLASH _DATA_UNLOCK1;
*((volatile UINT16 *) FLASH _START_ADDR + FLASH _ADDR_UNLOCK2) = FLASH _DATA_UNLOCK2;
*((volatile UINT16 *) FLASH _START_ADDR + FLASH _ADDR_UNLOCK1) = FLASH _SETUP_WRITE;
*to_add = 0x1234; //写入的数据
return 0;
}
保存main.c,并添加到新建的项目,并对该项目进行编译链接,生成可执行的映象文件。
在编译链接项目文件时,将链接器程序的入口地址为0x0040,0000。
打开AXD Debugger(或ARM Debugger for Windows)的命令行窗口,执行obey命令:
>obey C:/memmap.txt
系统中SDARM被映射到0x0040,0000~(0x0140,0000-1),Flash存储器被映射到起始地址为0x0处。
从0x0040,0000处装入生成的可执行的映象文件,并将PC指针寄存器修改为0x0040,0000,运行可执行的映象文件,程序就会将数据0x1234烧写入的Flash存储器的0x0地址处。
对于编写连续烧写Flash存储器多个存储单元的程序,只需循环执行该段代码即可,但应在对每个单元烧写命令发出后进行检测,保证前一个单元烧写结束后再进行下一个存储单元的烧写;当然也可采用延时等待的方法进行连续的烧写。
6.3 BootLoader简介
在以上的示例中,当完成用户程序的编译并下载到目标板上运行时,总是要首先进行存储器的映射,然后通过ADS(或SDT)调试环境下载,显然,这个过程对普通用户来说显得特别烦琐,然而,要在裸板(没有任何程序的系统板)上调试运行程序,也只能采用这种方法。
如果能在用户设计的系统板上烧写一段BootLoader程序,就可以将该过程屏蔽起来,让用户通过一些简单的操作,就可完成程序的下载、调试等工作。在嵌入式系统中,BootLoader的作用与PC机上的BIOS类似,通过BootlLoader可以完成对系统板上的主要部件如CPU、SDRAM、Flash、串行口等进行初始化,也可以下载文件到系统板、对Flash进行擦除与编程。事实上,一个功能完善的BootLoader已经相当于一个微型的操作系统了。
BootLoader作为系统复位或上电后首先运行的代码,一般应写入Flash存储器中并从起始物理地址0x0开始。BootLoader根据实现的功能不同,其复杂程度也各不相同。一个简单的BootLoader程序可以仅仅完成串行口的初始化,并进行通信,而功能完善的BootLoader可以支持比较复杂的命令集,对系统的软硬件资源进行合理的配置与管理。因此,用户可根据自身的需求实现相应的功能。
关于BootLoader的具体编写过程,可参考其他的相关资料,在此不作详述。
6.4 本章小节
本章主要介绍了在前一章所设计的最小系统硬件平台上,进行简单程序设计的基本步骤,同时也介绍了S3C4510B相关硬件模块的工作原理,通过对本章的阅读,希望读者能掌握基于S3C4510B的嵌入式系统的基本编程方法。
本章的难点、但也是读者必须掌握的问题是系统的存储器映射,S3C4510B任一时刻能寻址的地址空间为64MB,而系统配置的实际物理存储器一般没有这么多,因此,将系统的实际存储器安排(映射)在64MB地址空间的哪个位置,是程序设计与运行时必须清楚的。