针对TI公司的DSP芯片TMS320C6713,利用片上同步多通道缓冲串行口(McBSP)和增强型直接存储器存取(EDMA)实现了串口通信功能。该方案解决了芯片只有同步串口而不能进行异步传输的问题,丰富了接口功能。
关键词: TMS320C6713;多通道缓冲串行口;增强型直接存储器存取;串口通信
?
数字信号处理器因其高性能及强大的数据处理能力,而在通信和信号处理、自动控制等领域得到越来越广泛的应用。TMS320C6713(简称C6713)作为TI公司TMS320C6000系列的DSP,经常被用于图像、语音处理等方面。在大多数应用系统中,往往需要实现DSP与PC机或者其他外设之间的异步串行通信。但C6713所提供的串口是同步串口,并不支持通用异步串行收发器标准[1-2]。本文设计了一种利用C6713已有的同步串口McBSP与EDMA实现异步串口通信的方法[3]。
1 硬件接口电路设计
C6713有两个McBSP(McBSP0,McBSP1)口,每个端口有7 个引脚,除数据收发引脚(DX、DR) 之外,还包括发送时钟(CL KX)、接收时钟(CL KR)、发送帧同步(FSX)、接收帧同步(FSR)和外部输入时钟(CL KS)等引脚,分别用于传送数据、时钟和帧同步,实现同步串行通信。
当McBSP工作在串行口方式时,McBSP与串口的连接图如图1所示。对于McBSP 而言,不论外部如何连接,始终认为工作在同步方式下。当串口发送的数据中有帧信息和数据信息时,串口的TxD与McBSP的DR、FSR相连,就可以将数据线上的电平跳变直接引入到FSR端;当FSR检测到数据线上一帧的第一个下跳沿时,McBSP认为帧同步信号到来。
?
2 C6713上的程序设计
为了实现 McBSP与UART通信,本文使用过采样的方法将同步串口模拟成异步串口进行通信,即将 McBSP发送接收数据的时钟频率设置为UART发送接收波特率的16倍。当McBSP发送数据时,软件将每一位扩展为16 bit发送出去,即1被编码为Oxffff,0被编码为0x0000;当McBSP接收数据时,软件同样也要将接收到的每个16 bit字解码还原为1 bit。这样做使同步串口以比特为单位发送数据,可以很方便地模拟出异步串口的数据格式。同时,为了让DSP不需要频繁地对McBSP进行读/写操作,采用EDMA方式发送接收数据,提高了DSP的工作效率。McBSP与数据缓存之间的数据传送由EDMA的通道14和通道15完成。通道14完成数据发送,通道15完成数据接收。
2.1 初始化程序
初始化程序流程如图2所示。在初始化程序中主要对McBSP及EDMA的一些参数进行设置。
假设传输以8IN1的格式,发送接收都设为双相帧模式,第一相是开始位和8个数据位,第二相是停止位。停止位编码为8 bit字,以便于调整为1.5 bit停止位。应该对McBSP相关寄存器位的值初始化,以及EDMA进行相应操作[4]。
2.1.1 McBSP的参数配置
(1)引脚控制寄存器(PCR)的配置
FSXM=1 FSXP=1:允许采样率发生器产生低电平有效的起始位;
FSRM=0 FSRP=1:低电平有效的起始位用作McBSP 的接收帧同步输入端;
CLKRM=1 CLKXM=1:用内部采样率发生器产生串行时钟;
PCR的值为0xB0C。
(2)接收/发送控制寄存器(RCR/XCR)的配置
(R/X)PHASE=1:使能双相位帧传输模式;
(R/X)FRLEN1=8:数据帧的前半部为9个字;
(R/X)FRLEN2=1:数据帧的后半部为2个字;
(R/X)WDLEN1=2:数据帧的前半部均为16 位的字;
(R/X)WDLEN2=0:数据帧的后半部均为8位的字;
(R/X)COMPAND=0:不进行压缩;
(R/X)FIG=1:忽略帧同步的数据传输;
(R/X)DATDLY=0:数据传输不延迟;
RCR和XCR的值都为0x11040840。
(2)采样率发生器寄存器(SRGR)的配置
FSGM=0:当数据从DXR向XSR拷贝时产生接收帧同步信号;
CLKSM=1:采样率发生器的时钟来源于内部CPU时钟信号;
CLKGDV=(McBSP的时钟频率)/(16×波特率)-1,时钟频率必须进行适当的配置,以便产生16 倍波特率的频率。本文采用的C6713的CPU时钟频率为225 MHz,McBSP的时钟频率为112.5 MHz,波特率为57 600 b/s。此时计算得到CLKGDV=121;SRGR的值为0x20000079。
2.1.2 EDMA的设置
(1)打开通道:采用CSL中的EDMA_open函数打开相应的通道,返回值赋给hEdma14、hEdma15。设置如下:
hEdma14=EDMA_open(EDMA_CHA_XEVT1,EDMA_OPEN_
RESET);
hEdma15=EDMA_open(EDMA_CHA_REVT1,EDMA_OPEN_
RESET);
(2)分配链接表地址
采用CSL中的EDMA_allocTable(-1)函数,系统将自动随机地在参数RAM中专门为链接提供的地址空间内分配一个地址作为链接使用。函数的返回值就是分配到的地址,把它分别赋值给hEdmaLINK与hEdmaLINK2。设置如下:
hEdmaLINK=EDMA_allocTable(-1);
hEdmaLINK2=EDMA_allocTable(-1);
设置源和目的地址:CSL中方便地提供了一个获得McBSP的DRR和DXR寄存器的地址函数。只需要定义一个句柄MCBSP_Handle hMcbsp1,在主程序中必须先对hMcbsp1进行赋值,利用MCBSP_open函数打开一个McBSP通道,如:
hMcbsp1=MCBSP_open(MCBSP_DEV1,MCBSP_OPEN_RESET);
定义完hMcBSP1后就可以把hMcBSP1作为参数带入MCBSP_getXmtAddr函数。引用结构体成员,就能对其赋值:
edmaXmitParam.dst=MCBSP_getXmtAddr(hMcbsp1);
edmaRcvParam.src=MCBSP_getRcvAddr(hMcbsp1);
(3)配置EDMA链接
根据CSL中提供的函数,采用以下方法进行链接:
EDMA_config(hEdma14,&edmaXmitParam);
EDMA_config(hEdma15,&edmaRcvParam);
EDMA_link(hEdma14,hEdmaLINK);
EDMA_link(hEdmaLINK,hEdmaLINK);
EDMA_link(hEdma15,hEdmaLINK2);
EDMA_link(hEdmaLINK2,hEdmaLINK2);
(4)使能EDMA通道与关闭
采用CSL提供的库函数进行使能EDMA通道:
EDMA_enableChannel(hEdma14);
EDMA_enableChannel(hEdma15);
同时,在EDMA使用完之后要用如下语句对其复位及关闭操作。
EDMA_RSET(CIER,0x0);
EDMA_close(hEdma14);
EDMA_close(hEdma15);?
2.2 发送子程序
发送时,用发送转换子程序void ProcessTransmitData(void)把一块数据转变为UART发送的字,即扩展每个数据位为 16 bit的字。发送转换子程序把这个发送字块放人发送缓冲器,并且帧开始位(0x0000)和停止位(0xffff)也放在了特定的位置。发送子程序框图如图3所示。
2.3 接收子程序及容错程序
接收时,EDMA从 DRR寄存器中读取扩展的数据,并把数据写人接收缓冲区。当 EDMA将所有数据移人接收缓冲区后,会发出中断给 CPU,然后软件才调用接收转换子程序void ProcessReceive-Data(void),把接收到的数据进行解码。接收子程序框图如图4所示。
?
值得注意的是:由于McBSP在接收数据过程中使用的是内部时钟方式,接收的数据可能会有一定的偏移量,所以解码过程应对数据进行容错处理。调用一个数据逻辑判断子程序unsigned short vote logic(unsigned short value),用以确定每一个数据位的值,每解码一个字时该函数先屏蔽掉高6位和低6位,只检测中间的4 bit数据;当等于1011、1100、1101、1110、1111、0111时,对应解码为“1”,否则为“0”。
3 PC机程序设计
本方案利用PC机与C6713进行串行通信。下传时通过对数据文件读取,将数据传入DSP;上传时在主机端把数据写入文件进行保存。PC机软件采用VC++平台开发,其中包括以下几部分功能[5]:
(1)串口初始化。采用CreateFile( )函数获得串口设备的句柄,利用SetupComm( )函数设置缓冲区,并使用SetCommState( )重新初始化串口;
(2)串口读写:调用ReadFile( )函数进行串口数据接收,调用WriteFile( )函数进行串口数据发送;
(3)关闭串口:利用PurgeComm( )停止收发数据,清除缓冲区,调用CloseHandle(hCom)关闭串口设备句柄。
在进行批量数据传输,例如静态图像传输时,还规定了主机与从机双方必须共同遵守一些协议,包括控制命令、数据收送、超时重发等协议来完成通信,确保数据发送的完整性。
4 传输性能分析
??? 将系统应用于静态图像压缩应用,以传输图像为例,下载一幅256×256的BMP图像,上传压缩后的JPEG图像,一次传输的缓存区设置为2 048 B。先来讨论下载过程中的实际用时,实际下载时间=数据传输时间+程序运行时间。图像下载的理论用时可以用下式来表示:
估算结果表明,实际用时大约是理论用时的1.5倍。对于实际用时大于理论用时并不难理解,实际下载时间=数据传输时间+程序运行时间。其中,程序运行时间又包括串口缓冲区的读写时间以指令执行时间。这里的缓冲区读写时间是双方面的,包括上位机与DSP。在VC++中,由于使用的是MsCommon控件,在接收数据包时,这个控件通常用于传输控制命令,并不适用于做大量数据通信,需要手动进行延时350 ms才能完整地收到大小为2 048的数据包。这里的350 ms包括了等待每一帧2 048数据传输的时间0.28 s加上VC++中读缓冲区的延时时间。对于下载来说,图像大小正好是2
048的整数倍,可分为96次来传输。对于上传JPEG数据流来说,压缩后实际大小是8 455 B,并且
4.13,但程序中可分为5次来传输。因此实际传输时间是5×0.28=1.4
s,再加上延时间与代码执行时间就大概符合实际测试的2.2 s。
通过C6713的McBSP和EDMA实现异步串行通信。目前,已经完成了软硬件调试,并已将它应用静态图像数据的传输。试验结果表明,该方法硬件结构简单可靠,基本满足实时性要求,取得了很好的效果,具有一定的应用价值。
参考文献
[1] TMS320C6000 McBSP:UART,TI Incorporated[J/OL],2004.http://www.TI.com.
[2] TMS320C6000 Peripherals Reference Guide,TI Incorporated[J/OL],2004.http://www.ti.com.
[3] TMS320C6000 DSP enhanced direct memory access(EDMA)controller reference guide.TI Incorporated[J/OL].http://www.ti.com.
[4] 任丽香,马淑芬,李方慧.TMS320C6000系列DSPs的原理与应用[M].北京:电子工业出版社,2000.
[5] 龚建伟,熊光明.VC++/Turbo C串口通信编程实践[M].北京:电子工业出版社,2004.