引言
在嵌入式系统中实现网络接口,设计人员常常采用一些专为计算机设计的网络接口芯片,如RTL8019、CS8900A等。这些芯片体积大,功耗高,引脚复杂,难于与结构相对简单的嵌入式处理器接口。CP2200是Silabs公司2006年推出的一款网络接口芯片。该芯片专门针对嵌入式系统应用,较好地解决了体积、功耗和接口问题,使嵌入式系统中实现网络接口变得相对容易。TMS320C5410是性能卓越的低功耗定点DSP,在嵌入式系统中有着广泛的应用,使用CP2200可以方便地为其添加网络功能;然而Silabs公司仅为其主流单片机(如C8051F02x、C8051F12x等)配备了CP2200的接口程序库,因此需要为TMS320C5410编写专门的接口程序。
1CP2200简介
CP2200是集成了IEEE 802.3以太网媒体访问控制器(MAC)、10BaseT物理层(PHY)和8 KB非易失性Flash存储器的单芯片以太网控制器,采用48脚TQFP封装。8位并行总线接口支持Intel和Motorola总线方式,可以使用复用或非复用方式寻址。在非复用方式下,数据传输速率可超过30 Mbps。片内Flash存储器可用于存储用户常数、Web服务器内容或作为通用非易失性存储器,Flash的最后6个存储单元已在出厂前被预先写入了一个唯一的48位MAC地址,删除了用户使用时的序列化步骤。该芯片详细资料请查阅参考文献[1]。
2 接口硬件设计
TMS320C5410(详细资料请查阅参考文献[2])有一个增强型外部并行接口(简称“XIO2”),有24位地址线、16位数据线和硬件实现的接口逻辑控制线,可以方便地与各种存储芯片接口。在接口设计时,将CP2200作为一个外部存储器,采用非复用方式寻址直接与DSP的XIO2接口;为了区别于数据和程序空间,将CP2200挂接在DSP的I/O空间上,接口采用Motorola方式。限于篇幅,该接口方式的逻辑时序图请查阅参考文献[1]第16.3节,接口电路原理如图1所示。
图1 接口电路原理
从图1可以看到,DSP与CP2200的接口连线极为简单。最大的优点就是控制信号无需DSP软件控制,而是由DSP硬件自动生成;不仅降低了接口设计的复杂度,还大大提高了总线操作的效率。限于篇幅,图1中仅给出了CP2200与DSP接口的关键数据线连接方法,电路的其他部分请查阅参考文献[2]第2节。在接口电路的设计中,需要注意DSP的外部总线频率设置和DSP的读写延迟设置问题。
2.1 DSP的外部总线频率设置
由于DSP和CP2200的工作频率相差太大,因此需要对DSP的外部总线频率进行设置后才能与CP2200进行接口。CP2200的并口总线时钟频率较低(其时序图请查阅参考文献[1]),约为25 MHz;而DSP的外部时钟频率(CLKOUT)等同于系统时钟,TMS320C5410可以高达100 MHz,需要将DSP的外部时钟分频才能与CP2200接口。通过对DSP内部的BSCR寄存器的14~13位进行配置,可以将DSP的外部时钟进行1~4分频。对TMS320C5410的外部时钟4分频后,可以和CP2200进行可靠的连接。
2.2 DSP的读写延迟设置
CP2200芯片的读写低电平信号(RD,WR)分别需要160 ns(读)和120 ns(写)的有效时间,而TMS320C5410提供的读写有效时间为1个外部时钟周期,约25 ns,因此需要对该有效时间进行延时,可以通过对DSP内部的BSCR寄存器的14~12位进行配置,将读写有效时间延长至0~7个周期。为简单起见,将TMS320C5410的读写有效时间均设置为7个周期(约175 ns)后,便可以对CP2200进行可靠的读写操作。
3 接口软件设计
简单来讲,在嵌入式系统中,芯片的接口软件就是主处理器对该芯片进行配置,设计底层的输入/输出函数,使之能够正常工作。CP2200的接口软件主要包括物理层(PHY)和媒体访问控制器(MAC)的初始化以及收发函数设计这3个部分,接口软件层次图如图2所示。下面就这3个部分讨论CP2200的接口软件设计,并给出各个部分的关键代码。代码中引用的函数和变量如表1所列。
图2 接口软件层次图
表1 文中引用的函数和变量
3.1 物理层初始化
物理层(PHY)协调在物理媒体中传送比特流所需的各种功能,定义了物理设备和接口为所发起的传输必须实现的过程和功能。CP2200有一个符合IEEE 802.3标准的10 BASET以太网物理层收发器,包括接收器、发送器、自适应、环回、jabber、智能静噪、极性纠正和连接完整性功能。在上电复位后,在使能物理层之前,应按如下步骤对物理层进行初始化:
◆ 预处理,自适应同步(同步过程见参考文献[3],第88页)。
◆ 确定双工方式或使能自适应功能。
◆ 使能或禁止环回方式。
◆ 使能所希望的功能,如接收器智能静噪、自动极性纠正、连接完整性、jabber保护、远程故障通知和PAUSE包能力通知等。
◆ 如果自动极性纠正被禁止,则手动设置所希望的极性。
◆ 使能物理层(PHYEN = 1)、发送器和接收器。
◆ 等待1 μs,等待合适的物理层启动时间。
◆ 使能发送器(TXEN = 1)和接收器(RXEN = 1)。
◆ 等待合适的物理层启动时间,等待自适应(如果被使能)完成。
◆ 等待至少75 ms来建立连接。
当物理层初始化成功后,如果有网线连接CP2200和PC机,PC机会显示“本地连接已连接”的提示。(物理层初始化程序略——编者注)
3.2 媒体访问控制器的初始化
媒体访问控制器(MAC)的基本功能是确定网上哪一台计算机占有信道进行发送,CP2200/1有一个符合IEEE 802.3标准的以太网媒体访问控制器(MAC)。MAC可被配置为自动填充短帧(仅全双工方式)、添加CRC和执行帧长度检查。MAC还提供了环回工作方式,与PHY的环回电路分离,便于系统调试。下面是初始化MAC时要进行的步骤:
◆ 确定物理层被设置为全双工方式还是半双工方式。在发送和接收任何包之前,MAC必须被设置为与物理层相同的双工方式。
◆ 向MACCF写0x40B3(全双工)或0x4012(半双工)。该寄存器的相应位应被置1或清除,以改变填充选项或MAC行为。
◆ 向IPGT写0x0015(全双工)或0x0012(半双工)。
◆ 向IPGR写0x0C12。
◆ 向MAXLEN写0x05EE。
◆ 通过写MACAD0:MACAD1:MACAD2来设置48位的以太网MAC地址。
◆ 向MACCN写0x0001,以使能MAC接收。如果要使用环回方式或流控制,则要设置该寄存器中相应的位以使能这些功能。
初始化媒体访问控制器成功后,CP2200就可以获得网络上传输的数据。(媒体访问控制器的初始化程序略——编者注)
3.3 收发函数设计
收发函数的任务是将CP2200作为一个透明通道,完成DSP与以太网之间的数据交换。由于CP2200收发函数的机制不同,因此将发送和接收分开进行阐述。
3.3.1 发送函数设计
CP2200提供了一个发送以太网包的简单接口,DSP只需将源和目的地址、长度/类型和数据加载到发送缓冲区即可。所有其他IEEE 802.3要求,如前同步码、帧开始定界符、CRC和填充(如果需要),都是自动生成的。
当物理层和媒体访问控制器配置成功后,CP2200即准备好发送以太网包。可以用下面的步骤发送一个以太网包:
① 等待前一个包发送结束(TXBUSY==0x00)。最坏的情况是在半双工方式下使用指数退避算法,此时发送一个包的最长时间为500 ms。
② 设置发送缓冲区指针TXSTARTH:TXSTARTL为0x0000。
③ 如果最后一个包是被放弃的包((TXSTA3 & 0xF8)!= 0x00),则必须使用随机存储器访问方法将该包装入发送缓冲区:
◆ 将RAMADDRH:RAMADDRL设置为0x0000。
◆ 向RAMTXDATA写入第一个数据字节。
◆ 将RAMADDRH:RAMADDRL加1。
◆ 向RAMTXDATA写入下一个数据字节。
◆ 重复步骤c和d,直到装载完整个包。
◆ 将短包填充到至少64个字节。
◆ 将TXENDH:TXENDL设置为最后一个字节的地址。该值必须大于或等于0x0040。
④ 如果最后一个包被成功发送((TXSTA2 & 0x80)==0x80),则可以用自动写接口将该包装入发送缓冲区:
将所有数据字节都写入TXAUTOWR寄存器,每次1个字节。
如果MAC工作在半双工方式,将短包填充到至少64个字节。
⑤ 将发送缓冲区指针TXSTARTH:TXSTARTL重新设置为0x0000。
⑥ 通过向TXGO位(TXCN.0)写1来启动发送。
注: 如果总是执行第③步,则可以跳过第④步。
(发送以太网包的程序略——编者注)
3.3.2 接收函数设计
CP2200/1有4 KB的循环接收FIFO缓冲区和8个转换表缓冲区(TLB),能同时存储8个数据包。一旦收到一个包,主控制器就会通过中断请求引脚得到通知。然后主控制器可以通过主机接口将数据包的内容复制到其局部存储器中,或通过向RXSKIP(RXCN.1)写1来跳过该包。接收接口有接收过滤器和哈希表,可以防止不希望的包进入接收缓冲器。一旦复位初始化完成并且接收缓冲区、过滤器和哈希表也完成初始化,CP2200即准备好接收以太网包。在得知收到一个新包后,可以按下面的步骤读取该包:
① 读RXVALID(CPINFOH.7)和RXOK(CPINFOL.7),以检查当前包是否被正确接收。主处理器可以选择使用包起始地址CPADDR来读取包中的特定字节,以及决定是复制还是跳过当前包。应使用参考文献[1]中7.1节介绍的随机访问法来访问接收缓冲器。
② 如果RXVALID或RXOK为0,或要跳过当前包,则要向RXSKIP(RXCN.1)写1。 如果RXVALID和RXOK为1,则读CPLENH:CPLENL以获取当前包的长度。
③ 通过读RXAUTORD来读取整个包,每次读1个字节。
④ 如果读完整个包,则向RXCLRV(RXCN.2)写1。
如果当前缓冲区中还有任何未读的字节,则向RXSKIP(RXCN.1)写1。
(接收以太网包的程序略——编者注)
小结
本文详细介绍了TMS320C5410与CP2200接口的硬件和软件设计方法。在硬件方面,充分利用DSP的专用接口电路,大大提高了硬件接口的效率,经过实测,DSP与PC机的平均通信速率达到了600 kbps以上。在软件方面,根据CP2200的特点,介绍了TMS320C5410的接口程序设计方法,在此基础上,可以运行各种上层网络协议,如ARP、ICMP、UDP、TCP等,为DSP添加了网络功能。本文介绍的接口方法不仅适用于TMS320C54x系列DSP,还适用于多种其他平台,具有较高的应用价值。