利用TL16C554芯片对TMS320VC33 DSP芯片进行串口扩展实现
摘要:DSP在与多个外设进行通信时,通常需要对DSP的串口进行扩展。本文详细介绍了利用TL16C554芯片对TMS320VC33 DSP芯片进行串口扩展,并且采用一种基于C语言的中断编程方法实现异步串行通信。本文给出了具体的设计方案,并给出了硬件接口和软件编程实例,并且利用PC机进行通信。
关键词: 数字信号处理 串行通信 现场可编程逻辑阵列
在实际应用中,经常遇到DSP系统与多路外部信号进行通信,而TMS320VC33只有一个串口,本文以较新的四串口扩展芯片TL16C554来对DSP的串口进行扩展,同时借助C语言和DSP强大的算法解算功能,可以同时完成与多路信号的通信与算法的快速解算,具有重要的实际意义。
1 系统方案概述
1.1 通信方案设计
目前几乎所有的数字信号处理器都提供了一个或多个串行接口,而多数DSP芯片提供的是同步串口。在实际的应用中,往往需要DSP能够与多个外设进行异步串行通信,如与PC机进行串行数据传输就要求DSP系统具有多路UART串行接口。TMS320VC33芯片自带一个串口,而且本文需要同时与三路采样信号进行通信。针对这种情况,本课题研究并实现一种简单可靠的异步串口扩展方法,即在DSP的并行总线上扩展UART芯片,用硬件实现异步数据传输。该方法的优点是软件实现简单,代价是在总线上需扩展其它设备。综合考虑硬件连接和软件编程的便捷性,采用四通道扩展芯片TL16C554实现四串口的扩展,用最简单的硬件连接和软件编程就能实现四路异步的串行通信,能满足实际系统性能要求。
1.2 TMS320VC33简介
数字信号处理是一门涉及众多学科而又广泛应用于诸多领域的新兴学科。上世纪60年代以来,随着计算机和信息技术的飞速发展,数字信号处理技术应用而生并得到迅速的发展。数字信号处理芯片是一种具有特殊结构的微处理器,其实时运行速度远远超过通用微处理器,其主要应用是实时快速地实现各种数字信号处理算法。TMS320C3X是美国TI公司系列DSP处理器的第三代产品,也是其第一代浮点DSP芯片。C3X是一种高性能的CMOS32位器件,具有丰富的指令集、很高的运算速度、较大的寻址空间和较高的性价比,在各领域得到了及其广泛的应用。TMS320VC33是TMS320系列浮点数字信号处理器的新产品,在TMS320C30和TMS320C31的基础上进行了简化和改进。由于浮点运算和定点运算结合起来,具有更高的精度,并且不用考虑运算的溢出问题,因此浮点DSP具有更好的性能。在结构上的改进主要包括:可变宽度的存储器接口、更快速的指令周期时间、可设置优先级的双通道DMA处理器、灵活的引导程序装入方式、可重新定位的中断向量表以及可选的边缘/电平触发中断方式等。本课题需要完成一些快速而实时的浮点算法解算,而且综合考虑性价比,选择TMS320VC33能满足实际系统精度要求。
1.3 TL16C554简介
TL16C554是EXAR公司的异步通信芯片,其主要特点如下:
◆与ST16C454、ST68C454、ST68C554兼容;
◆16字节的发送与接收FIFO;
◆接收控制和发送控制相互独立的四通道选择;
◆四个可选的接收FIFO中断触发级;
◆标准MODEM接口;
◆最高可达1.5M的波特率,其波特率发生器可编程;
◆数据位长度为5、6、7、8,停止位长度为1、1.5、2;
◆具有偶校验、奇校验或无校验模式。
ST16C554不仅能将DSP发送的数据进行并/串转换,还能将从外设或MODEM接收的数据进行串/并转换,能够同时完成四个独立通道的收发。同时,ST16C554还具有四组独立的16字节的接收与发送FIFO,可以通过使能FIFO及设置FIFO中断触发级有效地减少CPU的中断,提高系统效率及可靠性。
2 利用TL16C554进行四串口扩展的硬件设计方案
下图(图-1)为四串口扩展的连接图,其中TMS320VC33的地址线A20,A21用来译码产生片选信号,来选择四串口通道A、B、C、D中的一个或多个通道。
当DSP对UART进行读写操作时,必然涉及到UART的实际地址在DSP中的转换。这里用PAGE3作为VC33的外部总线选通信号,其选择的地址范围为0C00000-0FFFFFF。而对应于UART的读写操作地址以及四个独立通道的选通地址,就要加上相应的偏移量。相应的读写及片选逻辑由CPLD完成。四串口A、B、C、D的地址范围分别是:0C00000―0CFFFFF 0D00000―0DFFFF 0E00000―0EFFFF 0F00000―0FFFFF
在这四个串口中断中,中断信号分别为如下:INTA,INTB,INTC,INTD,这里用DSP的一个中断引脚INT0来产生中断信号,即向任何一个串口发送信号都会触发DSP中断INT0,其中四个串口中断的优先级别要根据实际应用的需要通过软件编程的方式予以实现。
3 串口通信软件设计
3.1 TMS320VC33的C语言开发的优势
就DSP的软件开发而言,用DSP芯片的汇编语言编写程序是一件比较烦杂的事情。一般而言,不同公司的DSP芯片所提供的汇编语言各不相同,即使是同一公司的芯片由于芯片的类型不同及芯片升级换代,其汇编语言也有所不同。因此用汇编语言开发基于DSP芯片的产品所用周期较长,因为开发人员在编写DSP程序之前首先要熟悉这种DSP芯片的汇编语言,而一旦产品开发完毕,回过头再对软件进行修改、升级将非常困难,这是因为汇编语言的可读性和可移植性相对来说要差一些。基于上述原因,本文采用高级语言C来编写相关程序,从而使DSP的开发速度大大提高,也使程序的修改和移植变得十分方便。
3.2软件设计流程
软件设计包括TMS320VC33及TL16C554的初始化和通信协议、CMD命令等。下面将结合上述硬件原理图分别给出TMS320VC33初始化TL16C554的程序,中断服务子程序的编写,通信应用程序的编写的具体方案。
(1)TL16C554的初始化
初始化的主要任务是设置操作每个通道所需要的参数,这些参数包括串行通信时数据串的数据位数、停止位数、奇偶校验等。另外,还需要设置发送和接收的波特率及中断方式。具体定义方法以通道A为例进行说明,其他各通道可以进行类似定义。其中RHR为接收保持寄存器,THR为发送保持寄存器。FCR为FIFO控制寄存器,设置为FIFO使能。IER为中断使能寄存器,与FCR配合使用,设置为FIFO中断方式。LSR为线性状态寄存器,通过查询最低位检测FIFO或RHR中是否有数据。DLL及DLM为波特率设置寄存器,通过对晶振分频完成波特率的设置。当LCR的最高位为1时,才能改变DLL及DLM的设置。
#define rRBR1 (*(volatile unsigned char*)0XC00000)
#define rTHR1 (*(volatile unsigned char*)0XC00000)
#define rIER0 (*(volatile unsigned *)0XC00001) /* Interrupt enable register */
#define rFCR0 (*(volatile unsigned *)0XC00002) /* FIFO control register */
#define rLSR0 (*(volatile unsigned *)0XC00005) /* Line status register */
#define rMSR0 (*(volatile unsigned *)0XC00006) /* Modem status register */
#define rDLL0 (*(volatile unsigned *)0xC00000) /* DLAB=1 */
#define rDLM0 (*(volatile unsigned *)0xC00001)
(2)中断服务程序的编写
TMS320VC33工作于微处理器方式时中断向量起始地址为0x00,工作于微计算机方式或Bootloader方式时中断向量起始地址为0x809FC1,本系统DSP是Bootloader方式。中断向量的编写可以用C或汇编编写,本文用C语言来编写。
interrupt void c_int01(void); /*声明中断处理函数*/
unsigned int *VECS=(unsigned int *)0x809fc1; /*中断向量表表首指针*/
interrupt void int01(void){具体的中断应用程序};
(3)利用中断来实现数据的收发
所谓中断,就是当CPU正在处理某件事情的时候,外部发生的某一事情请求CPU迅速去处理,于是CPU暂时中止当前的工作,转去处理所发生的事情。中断服务程序处理完成该事件以后,再回到原来被中止的地方,继续原来的工作。利用中断来实现数据的收发,就是每向串口发送数据,CPU就响应中断,并将相应的中断标志置位,然后处理相应的中断程序。下面给出通过中断实现串口通信的程序,在实际中已调试成功。
main(){
IE=1, IF=0;//开中断 中断标志初始化为0
ST=0x200;//开GIE全局中断使能
for(i=0; i<14; i++)
{rcv_buf=0;} /*串口缓冲区初始化*/
LCR1 = 0x80; DLL1 = 0x1a;DLM1 = 0x00; /*设置波特率为 19200 */
LCR1 = 0x03; /* 位数为八位,没有奇偶位,一位停止位*/
FCR1 = 0xc7;MCR1 = 0x8; /*FIFO 使能,设置 FIFO触发位为14 */
IER1 = 0x01;//允许接收中断
while(1){ //一直等待中断,通过中断标志进行判断
if(serialflag==1){ //有中断来临
serialflag=0; //重新置中断标志为0
ISendBuf();} //发送数据,再次等待接收中断
}
(4)试验验证
为了验证上述软硬件设计的正确性,可以将扩展的四个串口中的三个串口分别接三台PC机的三个串口,另一个串口接另一台PC机用于控制和显示。根据事先编写好的通信协议,借助于PC机向三路串口发送数据,DSP收到信号会触发相应的中断,将收到的数据通过串口调试助手在PC机进行显示。通过多次试验表明,每次收发数据一致,说明所设计的硬软件能满足实际要求,能较好的完成多路数据的采集。
4 结论
本文介绍了DSP扩展串口的硬件实现以及串口通信的软件编程。通过C语言的编程方式对DSP进行开发,相比汇编语言,程序可读性更好,结构更加合理,而且大大缩短了开发周期。本实例完全能够独立运行,借助PC机实现了数据的收发,并在多路数据采集系统中得到实际应用,收到了良好的效果。
|