1、基于 DSP 的网络通信接口设计方案导读:DSP 对网卡通信过程控制的实现解决了 DSP 网络中任意站点之间,DSP 网络与PC 机之间准确、高速的实时通信问题,是将网络技术应用到 DSP 数字化系统中的关键,从而最终实现了以 DSP 为核心的处理系统数字化和网络化的融合。1 通信协议的制定协议是用来管理通信的法规,是网络系统功能实现的基础。由于 DSP 可以实现对网卡的直接操作,对应于 OSI 网络模型,网卡包含了物理层和数据链路层的全部内容,因此,规定了数据链路层上数据帧封装格式,就可以为基于 DSP 的局域网络中任意站点之间的通信提供具体规范。因为以太网是当今最受欢迎的局域网之一,在以太
2、网中,网卡用于实现 802.3 规程,其典型代表是 Novell 公司的 NE2000 和 3COM 公司的 3C503 等网卡,所以研究工作中的具体试验平台是以 DSP 为核心构成的以太局域网,主要用于语音的实时通信,所使用的网卡为 Novell 公司的 NE2000 网卡。NE2000 网卡的基本组成请见参考文献2,其核心器件是网络接口控制器(NIC)DP8390.该器件有三部分功能:第一是IEEE802.3MAC(媒体访问控制)子层协议逻辑,实现数据帧的封装和解封,CSMA/CA(带碰撞检测功能的载波侦听多址接入)协议以及 CRC 校验等功能;第二是寄存器堆,用户对 NE2000 网卡通
3、信过程的控制主要通过对这些寄存器堆中各种命令寄存器编程实现;第三是对网卡上缓冲 RAM 的读写控制逻辑。DP8390 发送和接收采用标准的 IEEE802.3 帧格式。IEEE802.3 参考了以太网的协议和技术规范,但对数据包的基本结构进行了修改,主要是类型字段变成了长度字段。所以,以 DSP 为核心的局域网内通信数据包基本格式如图 1 所示。DSP 读出数据包和打包从目的地址开始。目的地址用来指明一个数据帧在网络中被传送的目的节点地址。NE2000 支持 3 种目的地址:单地址、组地址及广播地址。单地址表示只有 1 个节点可以接收该帧信息;组地址表示最多可以有 64 个字节接收同一帧信息;
4、而广播地址则表示它可以被同一网络中的所有节接收。源地址是发送帧节点的物理地址,它只能是单地址。目的地址和源地址指网卡的硬件地址,又称物理地址。 在源地址之后的2 个字节表示该帧的数据长度,只表示数据部分的长度,由用户自己填入。数据字段由461500 字节组成。大于 1500 字节的数据应分为多个帧来发送;小于 46 字节时,必须填充至 46 字节。原因有两个:一是保证从目的地址字段到帧校验字段长度为 64 字节的最短帧长,以便区分信道中的有效帧和无用信息;二是为了防止一个站发送短帧时,在第一个比特尚未到达总线的最远端时就完成帧发送,因而在可能发生碰撞时检测不到冲突信号。NE2000 对接收到的
5、从目的地址字段后小于 64 字节的帧均认为是 “碎片”,并予以删除。在数据字段,根据系统的具体功能要求,用户可以预留出若干个字节以规定相应的协议,以便通信双方依据这些字节中包含的信息实现不同的功能。2 基于 DSP 的网络通信程序设计如果基于网络操作系统,用户可以利用一些软件对网络操作系统的支持,很容易地编写出优秀的网络通信程序,但这些程序必须依附于网络操作系统。而在 DSP 环境下,必须深入了解网络接口控制器(NIC)的工作原理2,通过对网络直接编程,实现局域网内任意站点之间的通信而完全抛开网络操作系统。 DSP 对网卡的通信过程控制就是 DSP对 DP8390 中各种寄存器进行编程控制,完
6、成数据分组的正确发送和接收。DP8390 的所有内部寄存器都是 8 位,映像到 4 个页面。每个页面有 16 个可供读写的寄存器地址(RA=00H0fH)。页面的选择由命令寄存器 CA 控制。第 0 页寄存器用于收发过程,第 1 页寄存器主要用于 DP8390 的初始化,第 2 页寄存器则用于环路诊断。 DSP 对寄存器的操作是将寄存器作为 DSP 的端口设备,其实际物理端口地址(PPA)为网卡基本 I/O端口地址(BIOA)与寄存器地址(RA)之和(即 PPA=BIOA+RA)。应注意的是,PPA 与寄存器间并不存在一一对应关系,对 PPA 的读操作与写操作并不一定是对同一寄存器进行的,这种
7、情况在第 0 页尤其明显。用户数据分组在 DSP 和网卡交互是通过网卡的数据端口实现的,既可以用 DMA 方式也可以用 PIO 方式读入数据分组或将数据分组送至网卡 RAM 缓冲区。在本系统中,DSP 采用 DMA 方式对网卡进行数据读写。网卡的数据端口地址(NDPA)为网卡基本 I/O 地址(BIOA)加偏移地址 10H(即NDPA=BIOA+10H)。 网卡通信过程控制可分为网卡初始化、接收控制和发送控制。下面分别予以讨论。2.1 网卡初始化网卡初始化的主要任务是设置所需的寄存器状态,确定发送和接收条件,并对网卡缓冲区 RAM 进行划分,建立接收和发送缓冲环。具体过程请参阅参考文献 2.需
8、要说明的是,每一块网卡被赋予一个物理地址,以便通信站点的标识。这个物理地址存在网卡的PROM(存储地址为 00000005H)六个单元中,在网卡初始化时,通过远程 DMA 读入 DSP 内存中,并送入网卡物理地址寄存器。在一步的意义在于:一方面,如果能正确读出网卡的物理地址,则说明网卡硬件基本没有问题,网卡的上电复位和 DSP 对网卡的初始化顺利通过;另一方面,这个物理地址可以用于 DSP 网络系统中的点名、包的过滤丢弃等服务,也就是说,在链路层根据数据帧携带的源地址和目的地址确定数据报从哪里来,是否接收或丢弃。网卡初始化时另一个重要的工作就是接收缓冲环的设置,为了有效利用缓冲区,NIC 将接
9、收缓冲区 RAM 构成环形缓冲结构,如图 2 所示。接收缓冲区 RAM 分成多个 256 字节的缓冲区,N 个(N 最大为 256)这样的缓冲区通过指针控制链接成一条逻辑上的缓冲环。缓冲环的开始页面地址存入 PSTART 寄存器,环页面结束地址存入 PSTOP 寄存器。PSTART 和 PSTOP 确定了接收缓冲环的大小和边界。为便于缓冲环读写操作,还需要 2 个指针:当前页面指针 CURR 和边界指针BNRY.CURR 确定下一包放在何处,起着缓冲环写页面指针作用;BNRY 指向未经 DSP取走处理最早到达的数据包起始页面,新接收的数据包不可将其覆盖,起着缓冲环读页面指针的作用。也就是说,C
10、URR 可以告诉用户网卡接收的数据分组当前放到了什么位置,而 BNRY 则用于确定 DSP 读缓冲环到了什么地方。由于接收缓冲区为环形结构,BNRY和 CURR 相等时,环缓冲区可能满也可能空。为了使 NIC 能辨别这两种状态,规定当BNRY 等于 CURR 时,才认为环缓冲区满;当缓冲区空时,CURR 比 BNRY 指针值大 1.因此,初始化时设置:BNRY=PSTART,CURR=PSTART+1. 这时读写指针不一致,为了保证正确的读写操作,引入一软件指针 NEXTPK 指示下一包起始页面。显然,初始化时NEXTPK=CURR.这时,缓冲环的读指针对 NEXTPK,而 BNRY 只是存储
11、分组缓冲区的起始页面边界指示,其值为 NEXTPK-1.2.2 接收控制过程DSP 完成对 DP8390 的初始化后,网卡就处于接收状态,一旦收到分组,就自动执行本地 DMA,将 NIC 中 FIFO 数据送入接收缓冲环,然后向主机申请 “数据分组接收到”中断请求。DSP 如果响应中断,则启动网卡远程 DMA 读,将网卡缓冲区中的数据分组读入学生机存储区,然后对接收缓冲环 CURR、 NEXTPK、BNRY 指针内容进行修改,以便网卡能从网上正确接收后续分组。DSP 响应网卡接收中断后,接收控制过程如下: 设置远程 DMA 的起始地址; RSAR0=00H,RSAR1=Nextpk. 设置远程
12、 DMA 操作的字节数,这个长度在 461500 字节范围内根据具体要求自己确定。 0AH 送命令寄存器CR,启动远程 DMA 读。 从网卡数据端口依序读入数据分组,注意,最先读入的 4 字节非数据分组内容,第 1 字节为接收状态,第 2 字节为下一包页地址指针,3 与 4 字节为接收字节数。第 2 字节内容应该送入 Nextpk,其它字节根据用户要求处理。 修改边界指针 BNRY=Nextpk-1. 清除远程 DMA 字节数寄存器 RBCR0 和 RBCR1.2.3 发送控制过程DSP 先执行远程 DMA 写操作,将内存中的数据分组传至网卡发送缓冲区,然后启动发送命令进行数据分组发送。发送控
13、制过程如下: 设置远程 DMA 的起始地址为网卡发送缓冲区起始地址; 设置远程 DMA 操作的字节数; 12H 送命令寄存器 CR,启动远程 DMA 写; 依序送出数据分组至网卡发送缓冲区; 清除远程 DMA 字节数寄存器;设置发送字节数寄存器 TBCR0 和 TBCR1; 12H 送命令寄存器 CR,启动数据分组发送。3 发送方发送频率的控制发送方发送频率的正确控制主要保护两点:一是有一个最小发送时间间隔,否则会因为接收方不能及时接收而导致系统瘫痪;二是发送频率能够足具体的功能实现要求。譬如在语音的实时通信中,发送频率就取决于声卡的采样频率。在 8kHz 采样频率时,声卡每秒钟采样 8000
14、 字节,采用 1024 字节需用时 128ms,如果通信协议规定发送 1 次传送1024 字节有效数据,则必须每 128ms 发送一次才能保证缓冲区有新数据待发送,也才能保证接收方有新数据播放。 128ms 是一个理论计算数值,在实际的操作中采样速度和发送频率之间总是不能完全匹配,而存放数据的缓冲区大小是有限的,如果没有良好的控制技巧来实现正确发送,就会造成声音抖动和延时。解决的办法是双缓冲技术和双指针控制,并且根据采样速度和发送频率之间的匹配情况送入不同的发送通信进行处理后发送。正确发送的含义有两方面,一是每次发送的都是新数据,二是能满足接收方总在播放新数据的需求。4 接收方防止数据包的丢失
15、由于 DSP 通过中断请求判断是否有数据分组到来,如果中断繁忙而两个数据包到来时间相差非常短,DSP 有可能只响应一次中断,从而导致丢包的发生。分析网卡接收数据过程,当网卡收到数据分组时,首先执行本地 DMA,将 NIC 中 FIFO 数据送入接收缓冲环,并将本地 DMA 操作的起始地址存放在当前页寄存器(CURR )和当前本地 DMA 寄存器(CLDA0、CLDA1)中,DSP 从网卡接收缓冲环读出数据到存储器则称远程 DMA 操作,用软件指针 Nextpk 来指示远程 DMA 的起始页面。因此通过比较网卡本地 DMA 和远程DMA 的当前地址,即在中断服务子程序中比较 CURR 和 Nex
16、tpk 指针,或比较 CLDA0、CLDA1 和 Nextpk 指针,就可以保证当前数据分组放到了哪里就读出到哪里,从而防止丢包的发生。5 结论DSP 芯片是专门为实现各种数字信号处理算法而设计的、具有特殊结构的微处理器,其卓越的性能、不断上升的性价比、日渐完善的开发方式使它的应用越来越广泛。将计算机网络技术引入以 DSP 为核心的嵌入式系统,使其成为数字化、网络化相结合,集通信、计算机和视听功能于一体的电子产品,必须大大提升 DSP 系统的应用价值和市场前景。将 DSP 技术与网络技术相结合,必须解决两个关键问题:一是实现 DSP 与网卡的硬件接口技术,二是基于 DSP 的网络通信程序设计。