要使嵌入式DSP系统要独立运行,必须外接EPROM或Flash存储器用于存放程序。与EPROM相比,Flash芯片功耗低,支持在工作电压下的擦写,可以方便地编写自己的Flash芯片烧录程序,通过在片方式完成对Flash芯片的写操作。本设计采用的是SST公司生产的SST39VF400A,它是一款基于CMOS技术的高性能、多用途的Flash存储芯片,其存储容量达4Mb,功耗低,使用2.7~3.3V单电源供电。为了方便程序的调试,外接了1片64K×16b的SRAM,以用于存放发送数据和接收数据,以便于对比,及时地发现数据传输的正确性。逻辑控制部分主要用于主处理器对外设(如PCI桥芯片、网络适配芯片、SRAM及Flash等)的读写控制及地址分配。
3 软件设计
软件设计主要分为PCI网桥和网络接口二部分。PCI网桥部分主要是对PCI9054进行初始化,即对它的PCI端配置寄存器和本地端配置寄存器进行正确的编程配置,以实现DSP与PCI网卡的无缝连接。网络接口部分的编程包括对RTL8139进行复位初始化,数据包的接收和发送。
RTL8139已经实现了OSI中的物理层和数据链路层的功能,只需再加上高层协议即可。作为一个嵌入式系统,为了节省系统资源,需要尽量使用简化的协议。因此IP地址和本机物理地址在初始化RTL8139时设定,采用本地管理的地址方式,上层协议进行了简化,没有封装复杂的TCP协议。
简化的网卡初始化程序如下:
#define CMD_RST 0x10 //复位标志
#define CMD_RE 0x08 //接收使能
#define CMD_TE 0x04 //发送使能
#define SUCCESS 0xFF //网卡初始化成功标志
Reset_init_rtl8139()
{
CMD=0x10;//软复位网卡
while((read_cmd & CMD_RST)==0) read_cmd=CMD;
//检查网卡是否复位完成
write_mac_ip(); //设定网卡的MAC地址和IP地址
CMD=CMD_RE | CMD_TE; //接收发送使能
set_RxConfig(); //接收配置
set_TxConfig(); //发送配置
init_rx_addr(); //初始化接收缓冲区地址
Rxmissed=0; //clear 0
CMD=CMD_RE | CMD_TE;
return SUCCESS;
}
程序中:CMD为RTL8139的Command寄存器,通过它来对芯片复位并检查复位成功与否;write_mac_ip()是向IDR0~IDR5写入MAC地址,设定IP地址;set_RxConfig()主要是对Receive Configuration Register进行设置。此外,网卡初始化程序设定只接收物理地址匹配的包,不接收组播和广播。
RTL8139接收缓冲区的大小可选,并设定为16KB。初始化过程中根据DSP的快慢还需要加一些延时,这一点非常重要。因为许多寄存器的设置都需要时间,若时间不够,某些寄存器的值可能会设置不正确,从而导致初始化失败,RTL8139的收发功能也会受到影响。
RTL8139数据的收发用中断方式完成。当主处理器要向网上发送数据时,先将1帧数据通过DMA通道送到控制器的发送缓冲区,然后发出传送命令,RTL8139按照PCI总线主模式将数据从发送缓冲区转移到内部发送FIFO中。当FIFO中数据包完整时,RTL8139即开始包发送。控制器在数据发送完成后通过中断方式通知主处理器;接收数据时,网上来的数据包首先被放在接收FIFO中,同时RTL8139要进行组播地址过滤。当接收FIFO中数据包已达到接收配置寄存器的要求时,RTL8139请求PCI总线按照PCI主模式将数据传到接收缓冲区,接收满1帧后,同样以中断方式通知主处理器。数据的收发是通过 DMA通道来完成的。中断子程序流程图如图4所示。
数据包的封装按照IEEE802.3协议、IP协议和UDP协议,其帧格式如图5所示。
封装的过程依次在源数据前加上UDP头、IP头和LLC头。LLC头即通常所说的以太网包头,但也可以根据自己的需要加上其他协议如TCP、ARP或HTTP。不过在嵌入式系统中,为了节省资源,应尽量减少协议的使用。在分组语音数据传输中,实时语音数据可以用UDP,而控制信号可以用TCP。
4 结束语
本文所提出的DSP与RTL8139的接口解决方案已在试验中得到实现,并已用于IP分组语音数据的以太网传输,效果良好。随着ISA总线的淘汰,PCI接口的网络控制器必将在嵌入式领域中得到更广泛的应用。