8814|10

60

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

用DSP/BIOS和RTDX技术实现I/O [复制链接]

基本要求:DSP/BIOS和RTDX组件,目标板

7.1 打开和查看工程
在CCS中打开工程文件并查看它包含的源程序及库文件。

1.    如果你把CCS安装在c:\ti 目录,可以创建一个新目录c:\ti\myproject;如果CCS安装在其他目录,则可在相应的位置建立myproject 目录。

2.    将c:\ti\c5400\tutorial\hostio1下的所有文件拷贝到新目录下。

3.    从Windows开始菜单中,选择Program→Code Composer Studio ’C5400→CCStudio。

4.    选择Project→Open并打开hostio.mak。

5.    依次点击Project、HOSTIO.MAK、Source旁的’+’,可以看到工程文件中包含的各种文件。hostiocfg.cmd及include中的头文件是在保存配置文件时创建的。本例程需要的文件有:

o    hostio.c 主程序

o    signalprog.exe VB应用程序,它产生正弦波并显示输入/输出信号

o    slider.exe   VB应用程序,它控制输出信号幅度

o    hostiocfg.cmd 连接命令文件,它仅增加了名为trace的LOG对象

o    hostiocfg.s54 汇编源文件

o    hostiocfg.h54 头文件



7.2 查看源程序
    本章中的例子模拟一个能数字化音频信号、调整音量、产生幅度可调的模拟输出的DSP应用程序。

    为简单起见,该例没有使用收、发模拟信号的设备,而是使用主机产生的数字信号测试算法。数据的输入/输出及音量控制信号是采用RTDX在主机和目标板之间传送的。

    在主机上运行的VB应用程序使用RTDX产生输入信号并显示输入/输出信号,该程序允许开发者不中止程序运行即进行算法测试。

1.    双击Project View中的hostio.c源程序。

2.    注意源程序的下述方面:

o    三个RTDX通道声明为全局的。第一个输入通道控制音量,第二个输入通道接收主机发送来的信号,输出通道用于从目标板向主机发送的输出信号。(是站在目标板应用程序的角度来称输入和输出信道的,即:输入信道从主机接收数据,输出信道向主机发送数据。)

o    当通道当前不是处于等待输入状态时,调用RTDX_channelBusy函数将返回FALSE,它表明数据已到达可供读取。如第六章所述,调用RTDX_readNB无需等待接收数据就可返回DSP应用程序。主机将数据异步写入控制通道。

o    RTDX_Poll用于RTDX下层应用之间的数据读/写的。

o    如果输入通道是使能的,RTDX_read将等待数据的到来。

o    如果输出通道是使能的,RTDX_write将缓冲区的数据写入到输出的RTDX通道中。

o    当目标板通过调用RTDX_enableInput使控制通道control_channel处于使能状态时,则该例程中的其他RTDX通道将处于非使能状态。而下一节描述的主机程序将使能这些通道。使用control_channel的滑动控制被视为应用程序的有机组成部分,在目标程序中使能该通道会使人们在应用程序运行时亦清楚该通道是处于使能状态的;而A2D通道和D2A通道是用于算法测试的。所以这些通道是通过主机应用程序设定为使能状态或非使能状态的。

#include

#include

#include

#include "target.h"

#define BUFSIZE 64

#define MINVOLUME 1

typedef Int sample; /* representation of a data sample from A2D */

/* Global declarations */

sample inp_buffer[ BUFSIZE];

sample out_buffer[ BUFSIZE];

Int volume = MINVOLUME; /* the scaling factor for volume control */

/* RTDX channels */

RTDX_CreateInputChannel(control_channel);

RTDX_CreateInputChannel(A2D_channel);

RTDX_CreateOutputChannel(D2A_channel);

/* Objects created by the Configuration Tool */

extern LOG_Obj trace;

/*

* ======== main ========

*/

Void main()

{

sample *input = inp_buffer;

sample *output = out_buffer;

Uns size = BUFSIZE;

TARGET_INITIALIZE(); /* Enable RTDX interrupt */

LOG_printf(&trace,"hostio example started");

/* enable volume control input channel */

RTDX_enableInput(&control_channel);

Connecting to I/O Devices while (TRUE) {

/* Read a new volume when the hosts send it */

if (!RTDX_channelBusy(&control_channel)){

RTDX_readNB(&control_channel, &volume, sizeof(volume));

}

while (!RTDX_isInputEnabled(&A2D_channel)){

RTDX_Poll(); /* poll comm channel for input */

}

/*

* A2D: get digitized input (get signal from the host through

* RTDX). If A2D_channel is enabled, read data from the host.

*/

RTDX_read(&A2D_channel, input, size*sizeof(sample));

/*

* Vector Scale: Scale the input signal by the volume factor to

* produce the output signal.

*/

while(size--){

*output++ = *input++ * volume;

}

size = BUFSIZE;

input = inp_buffer;

output = out_buffer;

/*

* D2A: produce analog output (send signal to the host through

* RTDX). If D2A_channel is enabled, write data to the host.

*/

RTDX_write(&D2A_channel, output, size*sizeof(sample));

while(RTDX_writing){

RTDX_Poll(); /* poll comm channel for output */

}

}

} 



7.3 Signalprog应用程序
VB编制的应用程序signalprog.exe的源程序可用于文件signalfrm.frm。有关该应用程序的详细说明可见文件signalprog.pdf。可查看几个对该例而言很重要的例程和函数:

o    Test_ON。点击Test_ON按钮时运行该例程。首先,它为输入通道和输出通道创建RTDX接口实例;接着,它打开输入/输出通道并使它们处于使能状态。该例程同时清除图形并启动Transmit_Signal和Receive_Signal的定时器。VB源程序中的全局变量声明把VB应用程序中的通道和hostio.c应用程序中相应通道联系到一起,如下:

' Channel name constants

Const READ_CHANNEL = "D2A_channel"

Const WRITE_CHANNEL = "A2D_channel"

o    Test_OFF   该例程废止、关闭和释放Test_ON例程创建的RTDX对象,并使定时器处于非使能状态。

o    Transmit_Signal首先,该函数产生正弦波信号并把正弦信号显示在Transmitted Signal图中;然后,它试图使用‘写’方式将数据传送到目标板。

o    Receive_Signal 该函数使用ReadSAI2方式从目标板读取数据,并将信号显示在Received Signal图中。

o    tmr_MethodDispatch_Timer 该例程调用Transmit_Signal和Receive_Signal函数,该例程在定时器被Test_On例程使能后每隔1ms被调用一次。



7.4 运行应用程序
1.    点击工具栏按钮或选择Project→Build。

2.    选择File→Load Program并双击hostio.out。

3.    选择Tools→RTDX。

4.    选择窗口中RTDX区域的Configure,在RTDX属性对话框的General Settings中选择Continuous RTDX模式并点击OK。

5.    将RTDX域的RTDX Disable改为RTDX Enable,此时按钮Configure变为Diagnostics。

6.    选择Tools→DSP/BIOS→Message Log。在Message Log区域点击鼠标右键并从弹出菜单中选择Property Page,选择名为trace的Log对象并点击OK。

7.    点击工具栏按钮或选择Debug→Run。

8.    使用Windows浏览器,运行signalprog.exe和slider.exe,你可以看到两个VB应用程序。


由于slider.exe应用程序将创建和打开RTDX控制通道,因此它必须在RTDX使能以后运行,否则它不能打开控制通道。Signalprog应用程序只有在点击Test On按钮后才使用到RTDX,因此它可以在任何时候运行。

9.    调整signalprog窗口高度。

10.  
在signalprog窗口中的点击Test ON,这就启动了输入/输出通道。

11.  滑动Volume Slider窗口的控制钮,这将改变输出信号幅度,观察Received Signal图中信号幅度的变化。

注:Volume Slider初始化设置


Volume Slider的初始化设置与其应用程序的运行不是同步进行的,它们在滑动条第一次移动时同步。

12.  关闭Volume Slider应用程序,这将废止输入/输出通道。

13.  点击signalprog窗口中的Test OFF,这将关闭控制通道。

14.  点击工具栏按钮或按Shift+F5中止运行。

15.  现在你可在Massage Log窗口中看到调用LOG_prinft产生的信息“hostio example started”。由于整个程序的运行都是在主函数中进行的,因此你不能更早地看到上述信息。DSP/BIOS和主机在DSP处于idle状态时才进行通信联系。直到应用程序从主函数中返回,DSP才会处于idle状态。所以,如果你想看到运行中DSP/BIOS的影响,你的程序应当在从主函数返回后执行DSP/BIOS的函数。下一节所用的hostio.c的修改版会说明该技术。



7.5 使用HST和PIP模块修改源程序
现在用DSP/BIOS提供的HST和PIP修改该实例。修改后的程序仍能实时测试DSP算法。这次测试数据来自一个主机文件,而不是前述的正弦信号。

HST模块为执行数据I/O提供了与外设接口更直接的通道。HST模块使用PIP模块实现主机I/O。一旦I/O设备和ISRs已经做好测试准备,就可使用PIP模块的API,这只需对源程序稍加修改即可。

1.    将目录c:\ti\c5400\tutorial\hostio2中的下述文件拷贝到你的工作文件夹下。(不要全部拷贝,特别不能拷贝hostio.cdb文件)。

o    hostio.c 已经修改过的源程序,它使用DSP/BIOS API的HST和PIP模块代替RTDX传送输入/输出信号。

o    input.dat  该文件包含输入数据

2.    在Project View中的hostio.c处,双击鼠标左键,该文件就显示在CCS窗口的右半部分,它与前述源程序的区别如下:

最新回复

一年复一年,好像还像昨天,真是太快了。通信人总是这么忙碌。 期望明年收入多点,家人都健康。  详情 回复 发表于 2010-12-17 13:56
点赞 关注
 

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
增加了两个头文件

#include

#include

o    删除了BUFSIZE定义、inp_buffer和out_buffer的全局声明以及RTDX的输入和输出通道声明。

o    将输入/输出函数从主函数中的while循环中移到了A2DscaleD2A函数中。

/* ======== A2DscaleD2A ======== */

/* FUNCTION: Called from A2DscaleD2A_SWI to get digitized data

* from a host file through an HST input channel,

* scale the data by the volume factor, and send

* output data back to the host through an HST

* output channel.

* PARAMETERS: Address of input and output HST channels.

* RETURN VALUE: None. */

Void A2DscaleD2A(HST_Obj *inpChannel, HST_Obj *outChannel)

{

PIP_Obj *inp_PIP;

PIP_Obj *out_PIP;

sample *input;

sample *output;

Uns size;

inp_PIP = HST_getpipe(inpChannel);

out_PIP = HST_getpipe(outChannel);

if ((PIP_getReaderNumFrames(inp_PIP) <= 0) ||

(PIP_getWriterNumFrames(out_PIP) <= 0)) {

/* Software interrupt should not have been triggered! */

error();

}

/* Read a new volume when the hosts send it */

if (!RTDX_channelBusy(&control_channel))

RTDX_readNB(&control_channel, &volume, sizeof(volume));

/* A2D: get digitized input (get signal from the host

* through HST). Obtain input frame and allocate output

* frame from the host pipes. */

PIP_get(inp_PIP);

PIP_alloc(out_PIP);

input = PIP_getReaderAddr(inp_PIP);

output = PIP_getWriterAddr(out_PIP);

size = PIP_getReaderSize(inp_PIP);

/* Vector Scale: Scale the input signal by the volume

* factor to produce the output signal. */

while(size--){

*output++ = *input++ * volume;

}

/* D2A: produce analog output (send signal to the host

* through HST). Send output data to the host pipe and

* free the frame from the input pipe. */

PIP_put(out_PIP);

PIP_free(inp_PIP);

    A2DscaleD2A函数由A2DscaleD2A_SWI对象调用,在下一节中将创建该SWI对象并使它调用A2DscaleD2A函数。

A2DscaleD2A函数接收A2DscaleD2A_SWI对象传送来的两个HST对象,

它接着调用HST_getpipe函数获取各HST对象所采用的内部PIP对象的地址。

调用PIP_getReaderNumFrames函数和PIP_getWriteNumFrames函数可确定是否在输入流水线中至少有一帧数据可读取,输出管道中是否至少有一帧数据可写入。

使用与7.2节中同样的RTDX调用,该函数获取由RTDX控制通道中设置的幅度值。

调用PIP_get可从输入流水线中获取完整的一帧数据。调用PIP_getReaderAddr获取输入流水线数据帧的起始地址。调用PIP_getReaderSize获取输入流水线中帧的字长。

调用PIP_alloc从输出流水线中获取空帧。调用PIP_getWriterAddr获取输出流水线中输出数据帧的起始地址。

接下来该函数将输入信号乘以幅度值并将结果写入PIP_getWriterAddr提供的地址中。

调用PIP_put将一个完整帧写入到输出流水线中。调用PIP_free重复利用输入帧以便函数下次运行时使用。

o    增加了错误检测函数,它将出错信息写入trace日志中并将程序置于无限循环状态。如果A2DscaleD2A函数无有效的数据可供处理时,该函数将被调用。
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
7.6 HST和PIP资料
每个主机通道都在内部都使用一个流水线。当使用主机通道时,目标应用程序管理流水线得一端,主机通道控制插件管理流水线得另一端。

当准备使用外设而不是使用主机修改程序时,可保留管理流水线目标板端的源代码,并在函数中增加处理管理流水线另一端的I/O设备的源代码。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

4
 
7.7 在配置文件中增加通道和SWI
A2DscaleD2A函数被SWI对象调用并使用两个HST对象,本节将创建这些对象(c:\ti\c5400\tutorial\hostio2\hostio.cdb文件中已经包含了这些对象)。

A2DscaleD2A函数还与两个PIP对象有关,不过它们是在你创建HST对象时自动生成的。HST_getpipe函数获取相应HST对象的内部PIP对象的地址。

1.    在Project View的HOSTIO.CDB处,双击鼠标左键打开该文件。

2.    在HST manager处点击鼠标右键并选择Insert HST。

注意,存在名为RTA_fromHost和RTA_toHost的HST对象,它们是内部用来修改DSP/BIOS控制的。

3.    将对象名HST0修改为input_HST。

4.   
在input_HST处点击鼠标右键并从弹出菜单中选择Properties,然后设置该对象的属性如下图所示并点击OK。

o    mode 该属性决定目标程序和主机通道控制插件各管理的流水线的哪一端。输入通道从主机向目标板发送数据,输出通道从目标板向主机发送数据。

o    framesize 它设置每帧的长度,等同于7.2节定义的BUFSIZE,长度为64字

o    notify,arg0,arg1 当输入通道中包含一个完整的数据帧时,这些属性指定调用的函数及该函数的输入参数,SWI_andn函数提供了操作SWI对象的mailbox的另一方法。

在第五章,你使用SWI_dec函数递减mailbox值,并在mailbox值抵达0时运行SWI对象的函数。

SWI_andn函数把mailbox值当作掩码,它将传递给函数的第2个参数所指定的比特位清0。因此,当输入通道包含一个完整帧时,A2DscaleD2A_SWI对象的SWI_andn函数被调用且mailbox的bit0被清零。

5.    插入另一个HST对象并命名为output_HST。

6.   
为output_HST对象设置如下属性并点击OK。

当输出通道中含有一个空帧时,它用SWI_andn清除mailbox的bit1。

7.    在SWI manager处点击鼠标右键并选择Insert SWI。

8.    将新对象SWI0命名为A2DscaleD2A_SWI。

9.    设置A2DscaleD2A_SWI属性并点击OK。

o    function 当软中断被登记并执行时,该属性使该对象调用函数A2DscaleD2A。

o    mailbox  mailbox初始值。input_HST对象清除掩码的第一比特,output_HST清除掩码的第二比特,当运行A2DscaleD2A函数时,mailbox值被复位为3

o    arg0,arg1 两个HST对象,它们作为A2DscaleD2A函数的输入参数

10.  选择File→Close,你将被询问是否保存对hostio.cdb的修改,点击Yes保存配置,同时自动产生hostiocfg.cmd、hostiocfg.s54和hostiocfg.h54。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
7.8 运行修改后的程序
1.    点击工具栏按钮 或选择Project→Rebuild All。

2.    选择File→Load Program。选择hostio.out并点击Open。

3.   
选择Tools→DSP/BIOS→Host Channel Control,Host Channel Control列出了HST对象,它允许你把它们和PC机上的文件捆绑在一起,也可以启动和废止通道。





4.    点击工具栏按钮或选择Debug→Run。

5.    在input_HST通道处点击鼠标右键并从弹出菜单在选择Bind。

6.    从你的工作文件夹下选择文件input.dat并点击Bind。

7.   
在output_HST通道处点击鼠标右键并从弹出菜单在选择Bind。

8.    在File Name框中敲入output.dat并点击Bind。

9.    在input_HST通道处点击鼠标右键并从弹出菜单在选择Start。

10.  在output_HST通道处点击鼠标右键并从弹出菜单在选择Start,注意在Transferred栏中显示数据正在被传送。

11.  当数据传送完毕,点击或者按Shift+F5中止运行程序。
 
 
 

回复

2498

帖子

0

TA的资源

至上芯片

6
 

回复 5楼 bolibo123 的帖子

辛苦了。。。。。。。这么详细啊!!!!!!!!!!!
个人签名我的邮箱gaoxiaoan123@163.com!回帖是一种美德!互相帮助,共同进步!
口头禅:生活在于创造机会,把握机会!
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

7
 
楼主,有个地方不是很明白。请指教一下!
1: while (!RTDX_isInputEnabled(&A2D_channel)){

RTDX_Poll(); /* poll comm channel for input */

}
这段程序是用来干什么的呢!我查了一下RTDX_isInputEnabled函数在头文件里,我翻译好像是使能通道的,是不是这样呢,poll用来干什么呢?
我的ti的例子是这样滴
        while (!RTDX_isInputEnabled(&A2D_channel)){
#if     RTDX_POLLING_IMPLEMENTATION
            RTDX_Poll();        /* poll comm channel for input*/
#endif
楼主是否能给翻译一下?
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

8
 
而且,楼主,在写输出通道时,并没有使能RTDX_enableInput(D2A_channel);啊?这样是错的吗?如果不错,又该怎样解释啊?
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

9
 
现在才看完,好文章,楼主很强大!解了我很多疑惑!
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

10
 
还有,RTDX使用完之后,是不是应该RTDX-inputdisable()一下哪?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(中级)

11
 
一年复一年,好像还像昨天,真是太快了。通信人总是这么忙碌。
期望明年收入多点,家人都健康。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表