引言
单片机P89LPC932A1是Philips公司生产的一款单片封装的微控制器,适合于许多要求高集成度、低成本的场合,可以满足多方面的性能要求。MC14LC5480是Motorola公司生产的一款PCM编解码芯片,主要用于对话音的A/D、D/A转换。笔者用单片机P89LPC932A1驱动PCM语音编码芯片正常工作,并通过SPI接口与之进行通信,同步双向地传输PCM数字语音。
1 P89LPC932A1简介
P89LPC932A1集成了8 KB Flash 程序存储器、512字节静态数据存储器、512字节E2PROM、I2 C 总线、SPI 总线、增强型UART 接口、模拟比较器、看门狗、4 个中断优先级、双DPTR,且支持ISP/ IAP 编程等功能。该单片机采用了高性能的处理器结构,指令执行时间只需2~4个时钟周期,6倍于标准80C51器件。P89LPC932A1集成了许多系统级的功能,可大大减少元件的数目,减小电路板面积以及降低系统的成本。
本设计中,主要用到P89LPC932A1的功能单元有SPI单元、CCU单元和定时器单元。
1.1 同步串行接口SPI
SPI往往被称为“三线式接口”。实际上几乎所有的实现都需要2根数据线、1根时钟线、1根片选线和1根公共接地线。P89LPC932A1的SPI操作很容易理解,只要记住该协议是基于2个8位移位寄存器(1个在主机中,1个在从机中),其关键操作是在主机和当前选定的从机之间传输一个字节的数据,当数据从主机移位传送到从机的同时,数据也以相反的方向移入。
P89LPC932A1的SPI接口有主模式和从模式两种工作状态。主/从模式均支持高达3 Mbps 的传输速率。SPI接口有4个引脚:SPICLK、MOSI、MISO和SS。这4个引脚在不同的模式下处于不同的工作状态。
本实验中单片机的SPI被设置为主模式:MOSI为数据输出端;MISO为数据输入端;SS为从机选择引脚;SPICLK为输出,为从机提供串行传输时钟,其产生的时钟速率可选择为CPU时钟的1/4、1/16、1/64和1/128。
单片机P89LPC932A1的SPI工作在主模式下的时序如图1所示。
图1 SPI主机传输格式(CPHA=0)
值得注意的是,在主模式下SPICLK引脚向从机提供的串行传输时钟并不是连续的。SPI初始化完成后,SPICLK并不会立即产生串行传输时钟。只有对SPI数据寄存器有效的写操作才能启动SPI时钟发生器和数据的传输,当写入的8位数据串行传输完成后,SPI时钟将会停止。这意味着从机的输入/输出必须由串行传输时钟SPICLK单独控制。
1.2 捕获/比较单元CCU的PWM功能
P89LPC932A1的CCU单元主要有基本定时器功能、输出比较功能、输入捕获功能和PWM功能。本实验中主要使用CCU单元的OCD脚产生PWM脉冲,篇幅原因,只对CCU单元的PWM操作进行介绍。
P89LPC932A1的PWM就是对脉冲的宽度进行调制的技术,即通过对一系列脉冲的宽度进行调制来等效地获得所需的波形。CCU单元在其定时器递增或递减计数的过程中与设定好的比较值进行比较,当比较匹配时使输出的脉冲翻转来实现PWM操作。TOR寄存器的值决定其输出脉冲的频率,OCR寄存器的值决定比较匹配时输出脉冲的占空比。
PWM操作有对称和非对称两种模式,实验中采用非对称模式和定时器递减计数来产生PWM波形,当比较匹配时可以设置中断操作。非对称PWM(递减计数)如图2所示。
图2 非对称PWM(递减计数)
1.3 定时器/计数器单元
P89LPC932A1有2个通用定时器/计数器T0和T1,与标准80C51的定时器兼容。本实验中使用定时器/计数器T1来作为时钟发生器,为PCM编码芯片提供所需的工作主时钟。更改定时器初值寄存器的值可以控制输出时钟的频率。
2 MC14LC5480的工作模式
PCM编码芯片MC14LC5480具有低功耗、低噪声等特点,片内全差分模拟电路设计,集成发送带通滤波器和接收低通滤波器,具有RC预/后滤波器,μ/A律可选择。
MC14LC5480可工作在长帧模式、短帧模式、IDL(Interchip Digital Link)模式和GCI(General Circuit Interface)模式下。这4种工作模式的区别主要体现在输入的帧同步(采样时钟)和位同步(PCM数据收发时钟)两路信号之间的关系上。这里采用的是长帧模式,其要求的同步时序关系如图3所示。其中,DT、DR是PCM编码的输出、输入引脚。
图3中/收发帧同步(FST/FSR)时钟频率固定为8 kHz,而长帧模式下收发位同步(BCLKT/BCLKR)时钟频率可选择为64~4 096 kHz。另外,长帧模式下帧同步时钟的占空比必须满足图3中的关系;也就是说,一个周期内帧同步时钟的高电平宽度应该等于2~8个位同步时钟周期,其上升沿驱动8位PCM语音数据的收/发。除此之外,MC14LC5480还需一个外部提供的芯片主时钟(MCLK),可接受的频率为256、512、1 536、1 544、2 048、2 560或4 096 kHz。
图3 长帧模式同步时序
对照图1和图3可以看出,语音芯片的DT和DR引脚每次同步收/发8位数据,这与单片机的SPI数据传输格式是相同的,但语音芯片对帧同步时钟却有特别占空比的要求。本实验中在长帧模式下选择位同步时钟(BCLKT/BCLKR)频率为2 048 kHz,单个周期内帧同步时钟的高电平宽度包含8个位同步时钟周期,由此计算出8 kHz的帧同步时钟(FST/FSR)的占空比为8 kHz×8/2 048 kHz=1/32。该帧同步时钟由单片机CCU单元的OCD引脚提供。
3 电路设计
在本设计中,利用单片机P89LPC932A1的CCU单元的OCD引脚产生占空比为1/32的PWM波形,为PCM编码芯片MC14LC5480提供所需的帧同步时钟;通过P89LPC932A1的SPI数据接口(MOSI/MISO)与MC14LC5480的数字输入/输出引脚(DR/DT)进行PCM码的双向传输;同时SPI所产生的串行传输时钟(SPICLK)作为MC14LC5480的位同步时钟,单片机晶振频率为8.192 MHz。连接电路如图4所示。
图4 单片机与PCM芯片连接电路
需要注意的是,本设计中将PCM编码芯片MC14LC5480的芯片主时钟(MCLK)和位同步时钟(BCLKT/BCLKR)均设置为2.084 MHz,但却分别由单片机的SPICLK和T1提供。这是由于单片机的SPI在主模式下向从机提供的串行传输时钟(SPICLK)并不是连续的,显然不能作为MC14LC5480的芯片主时钟。因此,需要由单片机的T1单独提供一路连续的2.084 MHz时钟作为MC14LC5480的芯片主时钟。
4 程序设计本实验主要实现单片机对PCM编码芯片的驱动和数字语音的收发功能。步骤如下:
① 首先初始化定时器T1,使其产生连续的2.048 MHz时钟作为MC14LC5480的芯片主时钟(MCLK)。
② 初始化SPI单元,设置SPI的工作模式为主模式,设置串行传输时钟SPICLK的频率为2.048MHz。
③ 初始化CCU单元,主要是寄存器TOR和OCR初值的设置,使单片机CCU单元的OCD引脚为MC14LC5480提供频率为8 kHz、占空比为1/32的帧同步时钟。
④ 判断刚产生的帧同步时钟的上升沿是否到来,通过查询OCD比较匹配中断标志位(TOCF2D)来实现。如果发现帧同步时钟的上升沿,则立即对SPI的数据寄存器进行写操作,这步操作只是为了启动SPICLK时钟来向语音芯片提供位同步时钟,因此写入的数据可以是任意值(如0x00)。
这样,驱动语音芯片工作的3路时钟信号全部产生,语音芯片将在下一个SPI时钟周期内工作,通过SPI数据接口与单片机通信。每完成一次SPI通信,单片机的SPI传输完成标志位(SPIF)置位,程序对SPI数据寄存器进行读/写操作。在读/写操作之间进行的其他操作主要是单片机对收到的PCM数据进行处理,如存储或通过其他端口转发等。程序流程如图5所示。
图5 单片机程序流程
编者注: 实验程序见本刊网站www.mesnet.com.cn。
5 总结
本设计充分利用单片机P89LPC932A1的多种系统级功能,MCU负担轻、程序编写量小;由于不需另外搭建时钟电路来满足语音芯片MC14LC5480对多路时钟的需求,因而电路设计简单,成本低。经实验证明,本设计电路工作稳定,语音传输清晰。