2 网络拓扑及实现框图
假设某企业的现状为:总部在北京,在天津和上海各有一家办事处,总部和办事处都建立了自己的办公网络并且都接入Internet;企业内部的信息沟通非常频繁,以往都通过固定电话和E-mail联系。电话费用很高,E—mail又存在时间滞后的缺点;每位员工都拥有一台装有Windows操作系统的PC。为了利用现有资源,可以为每位员工配置一部VoIP电话,通过USB接口与PC连接,局域网的连接方式和网络拓扑如图1所示。各办事处的网内都需要一台代理服务器,这可以通过在一台普通PC上安装相应的服务器软件来实现。这样,通过对现有网络的简单配置便可以建立起跨省市的企业内部即时通信系统。图2是本文所设计的VoIP电话的实现框图。可以看出,VoIP电话部分主要完成语音采集和基于G.711的编解码。以及液晶显示、键盘信息处理等电话的基本功能。而利用PC强大的处理运算能力可以实现诸如G.729的语音压缩编码、RTP控制以及对SIP、TCP/UDP/IP等协议的封装。这样通过与PC相结合便可实现一种低成本的VoIP电话。
3 VoIP电话工作原理
VoIP电话的原理框图如图3所示,主要由4部分组成:微控制器、PCM编解码单元、键盘电路和液晶显示电路。电话工作过程如下:首先,通过话筒将模拟话音送入PCM编码器。经过编码输出的是符合G.711标准的64 kb/s的PCM码流,该码流在微控制器输出的位时钟(BCLK)和帧时钟(XSYNC)的控制下,以8位/帧的速度传送给微控制器,然后,控制单元再将接收到的数据缓冲存储,当缓冲区满时,将数据发送给USB控制器,最后通过USB把数据发送给PC。反之,USB控制器接收来自PC的数据,然后,控制单元把这些数据反向发送给PCM单元解码。最终还原成模拟信号并通过听筒输出。其中微控制器是整个电路的核心部分,它负责产生与PCM单元交换数据时的帧时钟和位时钟;运行液晶驱动程序显示相关状态信息;用软件消除按键抖动并对按键信息读取和处理;控制USB接口接收和发送音频数据;与PC之间相应控制信息的处理,如振铃、忙音、摘挂机检测等。键盘单元作为人机接口,通过微控制器的键盘中断接收来自外部的信息。该单元的连击处理、按键去抖都由微控制器通过软件来完成[3,4]。
4 硬件设计要点
4.1 器件选择
由于本文设计的VoIP电话的特点是与PC结合使用,并且具有很低的成本,所以在器件选择上需要考虑既保证功能的实现又要尽可能降低成本。经过对比,选择Freescale公司的MC68HC 908JB8作为控制器。它是一款低功耗、高性能的8位MCU,具有较丰富的硬件资源。内部含有一个符合USB1.1标准的接口,传输速度为1.5 Mb/s,编码后的音频速率为64 kb/s,完全满足与PC通信的要求,其次,还具有8个键盘中断。利用其中的4个就可以完成4x4的矩阵式键盘设计[5]。PCM编解码器选用OKI公司的MSM7702—01,该器件采用3.3 V电压供电,具有低功耗、A/μ律可选、传送增益可调的特点[6]。LCD选择图形点阵模块LCM12232A,该模块具有122*32点阵格式。采用8位并行工作方式。
4.2 电源设计
由于整个VoIP电话供电来自PC的USB接口,其工作电压是+5 V,而MSM7702—01的供电电压是+3 V,故可以利用MC68HC908JB的片上调压器配合4.7 μF的耦合电容和0.1 μF的旁路电容产生+3 V电源,并由Vreg引脚输出到MSM7702—01。
4.3 时钟设计
HC908系列编程器内部采用6 MHz的时钟。如果电话内部也使用这个频率的时钟,则经过分频后不能获得准确的64 kHz的BCLK和8 kHz的XSYNC信号。时钟的不准确将造成PCM时序的偏差,从而可能引起数据传输错误,因此采用双时钟设计,也就是在线编程时通过跳线选择编程器上的6 MHz作为时钟源供MC68HC908JB写入程序,而当电话工作时则选择电话内部的2.048 MHz时钟源,该时钟源经过分频可以得到准确的64 kHz的BCLK和8 kHz的XSYNC信号,从而保证了PCM时序的准确性。
5 软件设计要点
5.1 同步时钟产生
同步时钟的产生是软件设计中的关键点。MSM7702—01的数据发送时序如图4所示,其中有两个时钟:BCLK和XSYNC。这两个时钟可以通过MSM7702一01内部的定时器TIM对BusClock(总线时钟)分频计数来产生。
BusClock由下式决定:
BusClock=fosc/2=2.048 MHz/2=1.024 MHz
其中fosc是外部时钟。由于BusClock较低,故可采用一分频,即将TSC(状态与控制寄存器)中PS2-PS0(分频选择位)设置为000。采用定时器的溢出中断工作模式,设置定时器溢出间隔为1/128 kHz,则TCHOL(计数寄存器)预置数为:
TCHOL=BusClock/128 MHz=1.024 MHz/128 kHz=(8)10=(00001000)2
这样,当定时器在BusClock的驱动下计数8次后,产生脉宽为1/128 kHz的脉冲。这是因为BCLK的周期为1/64 kHz,而其脉宽为1/128 kHz,故设置定时器每隔1/128 kHz溢出中断一次,在中断例程中交替设置高低电平,这样就可以得到BCLK。如果在中断例程中再使用一个初值为0的计数器,每计数16次则可以产生帧时钟XSYNC,这样MSM7702-01的发送时序就完全可以通过TIM的溢出中断模式来产生。接收时序与发送时序完全相同。不再单独说明。
5.2 PCM时序及其数据采集
整个程序采用查询式结构,分为主程序和中断程序。主程序包括端口、变量和内部寄存器初始化以及键盘信息采集、LCD显示和数据处理等。中断程序则包括键盘响应中断和TIM溢出中断,用于响应事件并对相应标志置位,然后将参数返回给主程序处理。由于TIM溢出中断程序用来产生PCM数据传输时序,它是整个程序的关键点,故着重说明。
程序流程如图5所示,在主程序初始化时已经将Counter(计数器)和端口PTB0、PTB2的初值均设为O。进入中断程序后计数器首先加1,然后判断端口PTB2的电平状态,将其设置为相反的电平(产生BCLK)。如果此时计数器Counter的值为1则需同时设置PTB0为高电平(产生XSYNC),根据器件数据手册的要求,tBCLK≤tXSYNC<100μs[6],故可以设计在TIM溢出3次后将PTB0置低(XSYNC大约持续23μs)。当Counter计数到16后说明一帧数据已经传输完毕,此时将Counter清零,下一次中断将开始下一帧数据的接收和发送。在每一帧内第一个BCLK上升沿到来时,PCM编码器将第一比特数据放到PCMOUT上,下一个上升沿再放第二个比特数据,如此循环8次后,可将一帧数据发送完毕,如图4中PCMOUT的时序。由于PCMOUT在BCLK的上升沿发送而PCMIN在BCLK的下降沿采集,从而接收和发送时序产生流程都可以由图5表示。
由于篇幅所限,主程序和键盘中断例程不一一说明。
6 结束语
以上设计的VoIP电话配合相应的PC机软件就可以满足企业、办事处间语音通信的基本要求,电话所具备的各种复杂功能还可以在此基础上进行扩充,比如电话号码薄、来电防火墙、来电指示、来去电号码存储等。该VoIP电话的特点是具有很低的硬件成本,同时具备了软电话的廉价和传统电话方便使用的优点,适合在企业内部与办事处之间大面积使用,故该设计在构建企业内部的初级VoIP综合业务网方面具有一定的工程应用价值。