摘 要:LPC4357是NXP推出的基于ARMCotex-M4核心的MCU,介绍了基于该MCU的低成本、低复杂度数字对讲机方案,详细阐述了一种软件设计方法,并针对实现中的问题与难点做了说明。
关键词:LPC4357;Cotex-M4;UDA1380;数字对讲机
在通信设备全面数字化的今天,对讲机是少数还没有被数字化的设备之一。数字对讲机与传统模拟对讲机相比,其频谱利用率更高,通信质量更好,安全性更有保证,业务也更广泛。这些特点对应对紧张的频谱资源状况有重要意义,同时给数字对讲机的应用带来更大的市场空间。2009年,工信部颁发了666号文件[1],文件规定2010年不再批发25 kHz带宽对讲机的型号核准,2011年停止模拟对讲机的型号核准,2016年中国市场禁止使用模拟对讲机,专网无线通信将全面进入数字时代。
从目前的市场形势来分析,除了国家政策的支持外,推动数字化进程的关键因素是降低数字终端的价格。一个低复杂度、低成本的数字对讲机方案对设备生产商和使用者都有积极意义。本文提出了一种基于单片通用处理器的dPMR数字对讲机解决方案,该方案通用性强,成本低,非常适合设备厂商二次开发和扩展。
1 芯片选择
本文提出的方案中,语音CODEC选用飞利浦公司的UDA1380[2],该芯片片内集成两组ADC和DAC,支持双声道全双工通信。声码器由用户根据需要进行选择,可以使用ASIC硬件实现,也可使用软件实现。MCU选用NXP公司的LPC4357。LPC43xx系列芯片基于ARM公司推出的Cortex-M4核心,另有Cortex-M0作为协处理器[3],同时Cortex-M4支持扩展的数字信号处理加速指令,如SIMD指令、MAC指令、饱和运算指令等[4],这使得MCU不仅可以用于控制,还可以用于小规模数字信号处理。
UDA1380的ADC支持8 kHz~55 kHz的采样率,DAC支持8 kHz~100 kHz的采样率,由于调频数字对讲机对话音质量的要求并不高,满足正常、清晰的通话即可,因此不需要立体声采样,只需用一路A/D和D/A,另一路A/D和D/A可以当做通用ADC和DAC。总体上来看, UDA1380在数据输入/输出方面支持模拟、数字间的各种组合,这种特性给应用者带来了很大的灵活性; 闲置A/D和D/A增加了系统可扩展性,并进一步降低硬件复杂度和成本。芯片内部结构如图1所示。
MCU需要完成系统的控制工作和声码器、数字滤波等数字信号处理任务。为了充分发挥芯片的性能,琐碎的控制工作可以交给Cortex-M0处理,Cortex-M4完成数字信号处理算法。综合考虑代码量、内存开销、运算速度以及扩展需求,选用NXP的LPC4357作为MCU。LPC4357最高主频可达204 MHz;片内有两组512 KB的Flash,总共136 KB的SRAM,16 KB的EEPROM;丰富的片内外设和接口可以满足各种扩展需求。经过前期的方案验证,该芯片完全可以满足目前的需求,而且还有足够的可扩展空间。
除上述主要芯片外,系统还需要一个射频前端。为了突出系统的可扩展性,本文并不对射频前端做具体规定,按照前述硬件选择,射频前端可以根据需要灵活选择支持4FSK的专用芯片或者成本更低廉的FM模块。
2 系统总体方案
系统框图如图2所示。MCU与UDA1380通过I2S和I2C接口连接,其中I2S用于语音数据传输,I2C用于控制字传输。
图2中,根据不同的射频前端选择,可以有两种具体的方案: (1)如果射频芯片选用带有4FSK调制解调功能的收发器芯片,可以采用图2(a)所示方案。MCU读取被UDA1380数字化的语音信号,经过声码器压缩、协议栈打包等操作后,可以直接按照2.4 kHz的符号率将数据发送至射频收发芯片进行调制并发射。接收的过程是发射的逆过程。(2)如果需要进一步降低成本,射频前端可以选用更简单的FM收发器,在MCU内使用软件实现基带调制解调(如图2(b))。这样MCU从UDA1380读取数据后,除了(1)中所述的处理外,还要做4FSK调制,然后再通过I2S接口发送回UDA1380,使用UDA1380的另一路D/A将数据转变为模拟信号再做模拟FM调制并发射。接收过程同样是发送的逆过程。
3 软件需求分析与设计
本方案中,软件需要完成的任务主要包括系统控制、数据通信、协议栈和数字信号处理算法。
3.1 系统控制
系统控制包括对音量调节、频道选择、按键解析等操作。系统启动后,完成必要的初始化和全局缓冲区内存申请等工作后,进入主循环。主循环中需要处理的每项工作可以看做一个任务,每个任务都各自的触发条件。软件顺序地执行每个任务,没有一定的优先级,但是某些任务的返回值可能会影响其他任务的执行状态,所以整个主循环也是一个状态机。主循环内的宏观流程图如图3所示。
为了提升方案的功耗表现,增加了节能模式,在正常发送或接收模式下,也应该根据需要尽可能让不工作的模块处于关闭状态,以进一步延长设备的工作时间。经测量,加入电源管理后,功耗降低了。
3.2 数据通信
3.2.1 语音数据采集与播放
本文使用的MELP声码器对20 ms语音帧进行编码,UDA1380被配置为16 kHz的采样率,16 bit量化、立体声采样(右声道传输其他数据)。所以在MCU内一个20 ms语音帧所需缓冲区大小为1 280 B。为了保证数据的连续性,使用两片1 280 B大小的缓冲区进行交替使用。为了使收发独立,互不干扰,除了两片发送缓冲区,还需要为接收也开辟两块1 280 B的缓冲区。综上所述,MCU中用于语音数据的静态缓冲区为5 KB,出于对RAM资源节省的考虑,将这些静态缓冲区通过分散加载[5]放置于片内Flash中的固定位置。声码器对一个语音帧的编解码操作必须在接下来的20 ms内完成,以保证整个系统的正常运行。
由于语音数据量大,为了在数据通信上不占用过多资源,MCU中I2S接口数据的收发使用DMA来控制,如图4所示。采集时,UDA1380将数据传输到MCU中I2S模块的缓冲队列中,当缓冲队列的数据深度达到预设的DMA触发深度时,DMA控制器将I2S缓冲队列中的数据搬移至Flash中的数据缓冲区,等待后续的声码器压缩处理;播放时,声码器解码数据后存放在Flash中的数据缓冲区中,此时DMA控制器被启动,从Flash数据缓冲区搬移数据到I2S模块的发送缓冲队列中,队列中的数据会连续发送至UDA1380进行播放。
3.2.2 同步
系统工作时,MCU中对数据的处理一定要与已接收或者待发送的有效数据保持一定的同步关系,这种同步通过DMA控制器的中断来实现。设置DMA使其每搬移1 280 B中断一次,即每20 ms中断一次。双缓冲区方案不是唯一的,也可以使用一个较大的队列来替代。考虑到此处时间控制十分严格且数据量一定,所以选用双缓冲区交替使用的方法不但节省内存,软件实现也十分简单,在对应的中断处理函数中只需切换数据缓冲区索引并重启DMA即可达到同步的目的。
另一个对定时要求十分严格的地方就是MCU与射频前端的通信部分。只有此处严格定时,才能保证空中数据的连续与正确。由于本文给出的方案偏向于通用方案,所以该处的定时针对不同射频前端推荐几种处理方式:(1)如果射频收发器选用支持4FSK的专用芯片,可以从接口和中断的角度考虑解决方案。常用于此处的接口有SPI、McBSP等,这种同步接口通过严格的控制时钟可以达到准确定时的目的。此外,专用芯片通常会将收发结束的信号引出到管脚,用户可用此信号触发MCU的外部中断,使用异步方式通信。(2)如果通过MCU软件完成4FSK基带调制解调,可以使用定时器中断满足定时需求,或者使用DMA搬移定量数据并中断,既可以节省MCU资源,又可以达到定时目的。
3.3 数字信号处理算法
方案中的信号处理算法主要指数字滤波、声码器和基带调制解调。这部分软件占用MCU资源最多,其中声码器是对系统性能影响最大的模块。
实现上述数字信号处理算法的方法是使用汇编或者编译器支持的固有函数,也可以使用厂商提供的DSP库[6]。为了避免过多地依赖编译器又能充分发挥Cortex-M4的性能,选择C内嵌汇编的方式实现。实验表明,采用ADF7021为射频前端,在未使用M0做辅助操作时,LPC4357完成一个20 ms语音帧的编解码操作需要10 ms左右的时间,该延迟不会影响系统正常运行。
3.4 需要注意的问题
实现过程中需要注意:(1)由于目前没有使用操作系统,因此软件设计时要使用非阻塞操作,除了满足实时响应的需求,也避免了不必要的系统瘫痪;(2)该方案的灵活性是建立在简化硬件、充分利用软件实现各种功能的基础上,软件设计时要尽可能地模块化、部件化,以方便功能扩展和二次开发。
本文设计的方案已经应用于样机设计并投入小批量试产,在成本、话音质量、功耗等方面有显著的优势;而且由于在设计之初充分考虑了二次开发问题,所以该方案有着良好的可扩展性,应用前景十分广阔。
参考文献
[1] 工业和信息化部.工业和信息化部关于150 MHz 400 MHz频段专用对讲机频率规划和使用管理有关事宜的通知[S].2009-12-12.
[2] Philips Semiconductors. UDA1380, stereo audio coder-decoder for MD, CD and MP3[Z]. 2004.
[3] NXP Semiconductors. LPC43xx user manual Rev. 1.1[Z]. 2012.
[4] ARM. Cortex-M4 devices generic user guide[Z]. 2010.
[5] ARM. RealView编译工具4.0-链接器用户指南[Z].2008.
[6] IAR Systems. Designing advanced DSP applications on the Kinetis ARM Cortex-M4 MCU-Part 1[Z]. 2011.