EDN首页   博客首页

最新日志

发表于:2007-1-28 0:56:23
标签:无标签

0

McBSP读写标准用法

McBSP读写标准用法
static unsigned int mcbspRead(void)
{
    while (!(MCBSP_rrdy(hMcbsp))) {
    }

    return (MCBSP_read(hMcbsp));
}

static void mcbspWrite(unsigned int outdata)
{  
    while (!(MCBSP_xrdy(hMcbsp))) {
    }
    
    MCBSP_write(hMcbsp, outdata);
}

点击此处查看原文 >>

系统分类: DSP   |    用户分类:    |    来源: 整理

评论(0) | 阅读(909)
发表于:2007-1-28 0:53:47
标签:DSP  C54X  经验  

0

C54X使用经验

C54X使用经验
发信人: xunger (迅哥儿 不断战斗中), 信区: Circuit 
标 题: C54X使用经验 
发信站: BBS 水木清华站 (Fri Dec 29 10:19:58 2000) 

一点个人所得,拿来和大家交流交流,抛砖引玉而已。 
1.电源:用TPS73HD318,外部接法有参考电路,我没有接 
电感,工作也正常,rst直接接到dsp的rst,但是需要100K 
上拉电阻。 
2.DSP的中断输入必须加上拉! 
3.可以找到3.3V的sram,cy7c1021lv33之类的,就不用74FCT245 
之类的转换了。 
4.dsp基本上的管脚都有内部的斯密特触发器以及上拉所以一般 
外部接线直接接就可以了,不用再接驱动之类的东东. 
5.HPI的使用: 
如果只是简单的host与dsp的数据交换,那么这部分还是很简单 
的,比如说通过PCI接口交换数据,事实上就是将HPI的4个寄存器 
映射到了PC可以访问的地址空间,然后就可以直接用驱动程序访 
问dsp中的数据了.TI提供了例子是9054与C5409的16位模式的 
HPI,经过实验,看起来较为不直接的HPI8位模式也非常好用,只要 
参照文档设计就可以了. 
6.程序开发: 
CCS非常好用,参照tutorial下面例子走一边流程就可以用C写程序 
了,当然,用汇编要烦一些,主要就是一些记忆性的东西,难度上没有 

什么,新手会碰到一些这样那样的问题,但是都是一些设置上的问题, 
遇到问题不要着急,自己反复试验一下, 
7.BootLoder 
程序的固化是个大问题,好像精华区里面讲得也不是很透. 
只好自己做实验的说. 
我在板子上面做的只有HPI与Flash的boot模式,这也是最让我 
后悔的一件事情.同志们,下次画板子的时候一定不要懒惰,至 
少将串行eeprom也给接上去.多一个选择的说. 
HPI的BOOT方式已经成功.参照5402的bootlode特性一文做(见TI网站). 
觉得这片文档一些地方写得不清楚,强调如下: 
bootloder 
1.从HPI开始; 
2.recheck从eeprom的启动方式开始; 
3.选定了BootLoder方式以后,流程如下: 
(8位模式下面必须高位数据在前,不同的 
BootLoder方式启动是的输入内容有所不同) 
4.Boot Table的格式对于所有的启动方式都是 
一致的,但是HPI不必要,因为HPI是将代码直 
接lode进去的. 
5.HPI Bootlode的具体过程 
1).将0x007f置为0,作为软件标志位,表明 
什么时候HPI BootLode已经完成.然后 
什么时候HPI BootLode已经完成.然后 
将HINT置为低,然后检查IFR中INT2的标 
志位是否有效,如果是,进入HPI Boot 
模式。 
最简单的办法是将HINT与int2接到一起。 
一旦程序已经将代码lode进去,那么必 
须将程序的入口地址载入到0x007f中去。 
0x007f中包括PC的低16位。 
HINT在reset的时候为高,一旦为低就一 
直保持。(这儿是关键,以前我一直试验 
通不过,后来发现必须在下载数据前将HPIC 
的HINT位置为高,这一点文档中间没有强调) 

假如要用flash方式,同时又假如你有动态存储数据的 
需要,那你就和我一样很不幸了,必须研究用程序来烧写 
Flash.这个我也正在研究的说. 
再添一句,如何生成并行下载的bootlode的文件, 
注意,闻亭提供的软件的版本才1.1我以前一直没有注意到这点 
导致用hex500怎么也生成不了10aa开头的文件, 
后来才发现必须要1.2版本一上才可以,faint! 
还有,在编译的时候加上选项 -v548. 
最后罗嗦一句,大家总是问某个资料那儿有之类的问题, 
其实你可以去www.ti.com.cn申请光盘, 

最有用的一分是DSP Solution那张. 
也可以电话里面定的 




原作者:不详
来 源:BBS 水木清华站

点击此处查看原文 >>

系统分类: DSP   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(1185)
发表于:2007-1-28 0:43:37
标签:DSP  开发  问题  

0

DSP开发中值得注意的几个问题

DSP开发中值得注意的几个问题

■ 电子科技大学-德州仪器DSP技术培训中心 杨炼 管庆

引言 
DSP是数字信号处理或数字信号处理器的缩写,它的应用正随着数字化的飞速发展而日益广泛。但是如何很快地入门进行DSP开发,一直都是业界讨论的问题。本文将以德州仪器公司(TI)的DSP为例来介绍一些开发经验,以供大家参考。 

选择DSP的型号 
目前市场上的主要DSP生产商包括TI,ADI,Motorola,Lucent和Zilog等,其中TI占有最大市场份额。产品包括了从低端的低速度DSP到高端的大运算量的DSP产品。目前,广泛使用的TI DSP有三个系列:C2000、C5000、C6000(C3X也有使用),其它型号都基本淘汰。需要提醒注意的是:在TI的DSP中,同一系列中不同型号的DSP都具有相同的DSP核,相同或兼容的汇编指令系统,其差别仅在于片内存储器的大小,外设资源(如定时器、串口、并口等)的多少;不同系列DSP的汇编指令系统不兼容,但汇编语言的语法非常相似。除了汇编语言外,TI还为每个系列都提供了优化的C/C++编译器,方便用户使用高级语言进行开发,效率可以达到手工汇编的90%甚至更高。 
在具体的开发中,根据所设计的系统要求和最终产品的成本估算,一般从以下几个方面去考虑选择什么型号的DSP芯片。 
DARAM。 

DSP设计中的基本技巧 
)可以同时使用FIFO为CY7C4225(1k×18)。 

多CPU的混合系统。MCU在控制、管理领域有不可替代的地位,因为它无论从成本,开发系统都很廉价和成熟。DSP在数字信号处理方面又是普通MCU,甚至通用CPU都无法比拟的。因此许多应用中采用MCU+DSP的结构,MCU负责管理,甚至运行嵌入式操作系统;而DSP仅仅负责快速的数据运算处SP的混合系统目前也很方便,有时采用多个低档的DSP并行比采用一片高档的DSP会大大降低系统的成本。如前锋公司的GSM手机综测仪采用3片VC5409并行处理,分别负责信道、基带和信令。 
多CPU的混合系统中使用RTOS。在DSP+MCU或多DSP的系统中,嵌入式操作系统,特别是实时嵌入式操作系统显得尤其重要。但实时操作系统不仅少,而且价格昂贵,但普通嵌入式操作系统很廉价,根据具体设计要求可以做不同的选择。目前也正在VC5471平台和C5000平台上尝试嵌入式操作系统 
电源管理。TI提供完整和详细的配套电源管理解决方案,这里不再赘述。常用电源管理芯片有TPS73HD318 TPS73HD325TPS7333等等。 
装入程序的实现方法。各个具体型号有所差别,但常用的方式不外乎HPI、16bit或8bit的并行EPROM,还有串口。在有MCU或PC做主控机的情况下一般都使用HPI方式。并行EPROM方式很方便,但需要注意代码的大小。串口加载可以用在多DSP的情况下进行。 

开发环境 
对于DSP工程师来说,除开必须了解和熟悉DSP本身的结构(包括软件指令系统和硬件结构)和技术指标外,大量的时间和精力是花费在熟悉和掌握其开发工具和环境上。因此,各DSP生产厂商以及许多第三方公司作了极大的努力,为DSP系统集成和硬软件的开发提供了大量有用的工具。下面重点讨论TI DSP的集成仿真环境CCS。 

CCS所包含功能有:(1)集成可视化代码编辑界面,可直接编写C、汇编、.H文件、.cmd文件等。(2)集成代码生成工具,包括汇编器、优化C编译器、连接器等等。(3)基本调试工具,如装入执行代码(.out文件),查看寄存器窗口,存储器窗口,反汇编窗口,变量窗口等,支持C源代码级调试。(4)支持多DSP调试。(5)断点工具,包括硬件断点、数据空间读/写断点,条件断点(使用GEL编写表达式)等等。(6)探针工具(probe points),可用于算法仿真,数据监视等。(7)剖析工具(profile points),可用于评估代码执行的时钟数。(8)数据的图形显示工具,可绘制时域/频域波形、眼图、星座图、图像等,并可自动刷新(使用animate命令运行)。(9)提供GEL工具,令用户可以编写自己的控制面板/菜单,从而方便直观地修改变量,配置参数等。(10)支持实时数据交换(RTDX)技术,利用该技术可在不中断目标系统运行的情况下,实现DSP与其它应用程序(OLE)实现数据交换。(11)开放式的插入(plug-ins)技术,支持其它第三方的ActiveX插件,支持各种仿真器包括软仿真(只需安装相应的驱动程序)。(12)提供DSP/BIOS工具,利用该工具可增强对代码的实时分析能力,如分析代码执行的效率,调度程序执行的优先级,方便管理或使用系统资源(代码/数据占用空间,中断服务程序的调用,定时器使用等等),从而减小开发人员对硬件资源熟悉程度的依赖性。 

结语 
以上讨论了DSP开发中会遇到的几个基本问题。当然,在实际操作中还会有很多其它的问题和相应的处理技巧,这里不可能都包括。希望通过此文能对大家的DSP开发有所帮助。■ 

点击此处查看原文 >>

系统分类: DSP   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(1528)
发表于:2007-1-28 0:00:30
标签:dsp  关键问题  

2

DSP编程的几个关键问题

DSP编程的几个关键问题

西安电子科技大学信息科学研究所(710071) 李忠

中国航天504研究所 李峰

摘要:对DSP串口的DMA传输方式使用中可能遇到的疑难问题、汇编指令歧义及C语言混合编程容易犯的错误作了列举分析,对Bootload编程的疑难点做出了实例解释。

关键词:汇编指令的歧义 Bootload Bug McBSP Multi-Frame

DSP芯片凭其优异的性能在高速计算领域有着巨大的应用前景。但其应用所涉及的知识非常庞杂。本文以TI公司的320C54X系列为蓝本进行提纯,所有认识都是笔者在实际工作中亲手实践所得。当程序调不通不知该从何处下手时,此文也许会有所帮助。这些关键点有些是TMS320C5409所独有而有些是与DSP所共有的。

1 McBSP(Multichannel Buffered Serial Port)串口利用DMA中的多帧(Multi-Frame)方式通信的中断处理

在实际通信应用中,一个突发之后,程序必须为下一个突发作准备。因此一般采用串口的DMA多帧方式进行发送,在中断处理程序中或停止发送或加载数据。但在串口以DMA方式传输数据时却有一些问题要讨论。首先DMA的传输同步事件应设为McBSP的传输事件即XEVT,这样一字节传输后会自动准备另一字节(McBSP的READY上升沿触发DMA传输)。中断发生时意味着一个块已传完,这时DMA 的使能自动关闭,McBSP的READY将一直保持高状态。但是在下一次突发传输直接使能DMA时却启动不了传输(相信会有许多人遇到此类问题)。这是因为无法产生McBSP触发启动所需的READY上升沿。解决办法是在中断程序中先关闭McBSP的发送,使READY=0,随后在程序中发送使能DMA,再打开McBSP的发送即可。如先打开McBSP的发送后打开DMA,也是不会工作的。因为McBSP的READY已经由0变到1了,无法再产生READY上升沿。

2 关闭DMA与关闭McBSP的区别

在通信领域,为了充分利用DSP的片上外设资源,常常利用DMA把从串口来的数据或要发的数据放入缓冲区,再处理。对DMA而言,只要其在数据缓冲区的指针指向了中断应发生的位置,就产生中断。但此时最后一个数据只是进入了McBSP而并未真正发出去,所以在传送结束的中断程序中只能关闭DMA 不能关闭McBSP。因为此时McBSP的发寄存器 DXR中还有一个字没有发出。

3 McBSP串口配置的关键时序

主要是寄存器SPCR2 的配置:在保持RRST、XRST、FRST各位为0的前提下,配置好其它串口控制寄存器。等待至少2个CLKR/T时钟以确保DSP内部的同步。

(1)可以向DXR装载数据或使能DMA。

(2)使能GRST(GRST=1)(如果需要DSP内部产生采样时钟)。

(3)使能RRST或XRST,注意此时要保证SPCR中仅有此一位发生改变。

(4)使能FRST(FRST=1)(如果需要DSP内部产生帧同步)。

(5)等待2个R/T CLK时钟周期后,收或发端便会有效。

4 汇编语言程序中的变量

汇编语言程序中的公用变量应在文件中定义,如.def carry.汇编语言程序中使用的局部变量不需定义,可直接声明,例如 trn_num .word 00h。如果在两个asm文件中有两个都没有定义的同名变量,则编译程序会认为他们不是同一变量。在汇编程序的开头应有.mmregs宏语句。它一方面表示对默认定义的确认(ah,bh,trn等),另一方面可以对所用寄存器重新定义。如:

.mmregs

DMPREC .set 54h ;定义DMA优先和使能寄存器地址在54h

DMSA .set 55h

DMSDN .set 57h

DXR10 .set 23h ;定义串口1的发送寄存器地址在23h

5 ST1寄存器中CPL位的影响

CPL位是编译模式控制位,它表示在相对直接寻址时采用哪种指针。当CPL=0时,使用页指针DP;当CPL=1时,使用堆栈指针SP。实际使用中二者没什么差别,但使用SP寻址的程序更易读。在程序中经常使用CPL=1。

6 指令的歧义

6.1 比较下面指令

STLM B,AR4 ;把bl内容送入寄存器AR4 (×)

STLM B,*AR4 ;把bl内容送入寄存器AR4(√)

前者实际执行的是把bl内容送入一个系统用的缓冲区,后者也可用:

MVDM BL,AR4 ;把bl内容送入寄存器AR4 (√)

其他易导致歧义的语句还有:

LD AR5,A ;把AR5的内容送入寄存器A (×)

LDM AR5,A ;把AR5的内容送入寄存器A(√)

ANDM #0x107e,AR4;把#107e加到寄存器 AR4 (×)

ANDM #0x107e,*AR4; 把#107e加到寄存器 AR4 (√)

仅对某些寄存器有效的指令:

MVDD * AR2+,*AR3+ ;把以AR2为地址的内容拷入AR3的地址中

此类指令用作数据块搬移特别有效,但仅对AR2、AR3、AR4、AR5有效。
易错语句中对程序运行危害最大的是:

ST #0 (bsp0_out_sign)

;bsp0_out_sign 是一个变量名(√)

STM #0,bsp0_out_sign

;此语句被编译为STM #0,PMST或STM #0,IMR (×)

这种语句会导致程序运行中的随机故障,且极难发现。

6.2 流水冲突

分析以下程序:

STM to-dce-buff, AR4

LDM AR4,B

ADD A,B ;B=AR4+AL

MVDM BL,AR4 ;AR4=to-dce-buff+AL

实际上,上段程序得不到AR4=to-dce-buff+AL 的结果。这是因为DSP一般采用深度为3~6级的流水结构,产生了无法解决的冲突,所以它不能被正确执行。解决的办法是在赋值和引用之间插入一条或几条其他的指令,或NOP语句即可。

7 汇编与C语言混合编程的关键问题

7.1 C程序变量与汇编程序变量的共用

为了使程序更易于接口和维护,可以在汇编程序中引用与C程序共享的变量:

.ref_to_dce_nun ,to_dte_num,_to_dce_buff,_to_dte_buff

在汇编程序中引用而在C程序可直接定义的变量:

unsigned char to_dte_buff[BUFF_SIZE];

//DSP发向PC机的数据

int to_dte_num; //缓冲区中存放的有效字节数

int to_dte_store; //缓冲区的存放指针

int to_dte_read; //缓冲区的读取指针

这样经过链接就可完成对应。

7.2 程序入口问题

在C程序中,程序的入口是main()函数。而在汇编程序中其入口由 .cmd 文件中的命令决定,如:-e main_start;程序入口地址为main_start。这样,混合汇编出来的程序得不到正确结果。因为C到ASM的汇编有默认的入口c-int00,从这开始的一段程序为C程序的运行做准备工作。这些工作包括初始化变量、设置栈指针等,相当于系统壳不能跨越。这时可在 .cmd文件中去掉语句:-e main_start。如仍想执行某些汇编程序,可以C函数的形式执行,如:

main_start(); //其中含有其他汇编程序

但前提是在汇编程序中把_main_start作为首地址,程序以rete结尾(作为可调用的函数)的程序段,并在汇编程序中引用_main_start,即 .ref mainstart。

7.3 移位问题

在C语言中把变量设为char型时,它是8位的,但在DSP汇编中此变量仍被作为16位处理。所以会出现在C程序中的移位结果与汇编程序移位结果不同的问题。解决的办法是在C程序中,把移位结果再用0X00FF去"与"一下即可。

7.4 堆栈问题

在汇编程序中对堆栈的依赖很小,但在C程序中分配局部变量、变量初始化、传递函数变量、保存函数返回地址、保护临时结果功能都是靠堆栈完成。而C 编译器无法检查程序运行时堆栈能否溢出。所以应尽量多给堆栈分配空间。C编译器的默认大小为1KB。在程序不正常跑飞时应注意检查是否堆栈溢出。

7.5 程序跑飞问题

编译后的C程序跑飞一般是对不存在的存储区访问造成的。首先要查.MAP文件并与memery map图对比,看是否超出范围。如果在有中断的程序中跑飞,应重点查在中断程序中是否对所用到的寄存器进行了压栈保护。如果在中断程序中调用了C 程序,则要查汇编后的C程序中是否用到了没有被保护的寄存器并提供保护(在C程序的编译中是不对A、B等寄存器进行保护的)。

8 命令文件的编写

在编辑 .cmd文件时编译连接器默认:page 0就是ROM区,page 1就是RAM区。下列段必须放在ROM区。

.text load="PROG" PAGE 0 ;程序段

.const load="data" PAGE 0 ;常数段

.cinit load="dtta" PAGE 0 ;初始化段

.switch load="data" PAGE 0 ;switch指令常数表

值得注意的是尽量不要用FILL选项,一旦进行填充会使生成的.out文件增大甚至超过内部的存储空间而无法Bootload。

9 Bootload问题

一般都采用从EPROM引导,但通常很费脑筋。下面介绍一下可为54X系列DSP内部引导程序识别的EPROM存储结构,如表1所示。

假使已经生成了 .out文件,生成时必须带有芯片,此处为MS320VC5409,版本参数如:asm500 init_54x-v548)。

.hex文件与EPROM的存储空间相对应,其生成的参数由.cmd文件决定。下面以实例介绍.cmd文件中的参数编写及意义。

 

cdpd.out ;将cdpd.out 文件转换成.hex文件

-SWWSR 7fffh ;将外部设备的等待时间设为7个等待状态

-BSCR 0f800h ;设置4K为一页,页面切换时插入1个等待状态

-o cdpd.hex ;转换成cdpd.hex文件

-i ;intel格式

-boot ;把所有的程序块装入EPROM

-bootorg 8000h ;从EPROM存储器的8000h处开始写入程序内容

-memwidth 8 ;系统数据宽度转为8位,以避免生成2个文件

-romwidth 8 ;EPROM数据宽度为8位

-e 0840h ;从0840h开始执行程序

-map wfcdpd.mxp ;生成EPROM存储器占用映射

这时生成的cdpd.hex可以直接写入EPROM。需要说明320C5409的外部RAM范围是从8000h~FFFFh,所以设首地址为8000h。但是对C54X系列而言,其转换有个BUG,即它总是不能在0XFFFF处写入从外部EPROM存储器装载的开始地址,只好自己填入。对本例而言在0XFFFE处写0X80,在0XFFFF处写0X00。

参考文献

1 Texas Instruments Inc.TMS320C54X DSP Reference Set Volume
5:Enhanced peripherals

2 Texas Instruments Inc.TMS320C54X Assembly Language Tools User's Guide

3 TMS320VC5409 Bootloader Technical Reference

4 Texas Instruments Inc.TMS320C54X DSP Reference Set volume 1: CPU and Peripherals

5 Texas Instruments Inc. TMS320C6000 McBSP as a TDM Highway

本文摘本《电子技术应用》

点击此处查看原文 >>

系统分类: DSP   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(1472)
总共 , 当前 /