0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

采用McBSP接口与EDMA配置实现异步串口通信,提高工作的效率

电子设计 来源:郭婷 作者:电子设计 2018-12-07 09:06 次阅读

TMS320DM6437的性能很高,但是开发的费用却很廉价,这样就可以面向更多的市场,主频600 MHz,32位定点,采用达芬奇(DaVinci(TM))技术。该器件采用TI第3代超长指令集结构(VelociTI.3)的TMS320C64x+DSP内核,主频可达600 MHz,支持8个8位或4个16位并行MAC运算,峰值处理能力高达4 800MIPS。

1 硬件接口电路设计

DSP的McBSP接口可由内部时钟发生器或外部器件提供收/发时钟信号(CLKR/CLKX)及收/发帧同步信号(FSR/FSX)。EN_IN、EN_OUT为DSP控制FPGA中McBSP接口的使能信号,它们均与DSP的GPIO相连。当EN_IN为高时,FPGA接收DSP的数据;当EN_OUT为高时,FPGA开始向DSP发送数据。

McBSP接口是全双工串行接口,提供收发数据双缓冲以处理连续的数据流,并可独立配置收发部分,接收和发送都可使用独立的帧信号和时钟源。接收数据时,FPGA的数据通过McBSP传到DSP的DRR寄存器中,触发McBSP接收同步事件,EDMA将数据搬入DSP内存。发送数据时,当EDMA从DSP内存中将数据搬入DSP的DXR寄存器时,利用McBSP发送同步事件,将数据传输给FPGA。

采用McBSP接口与EDMA配置实现异步串口通信,提高工作的效率

2 软件程序设计

传统的C6000型DSP对McBSP和EDMA进行操作时,多使用CSL(Chip Support Library)进行编程操作,由于TMS320DM6437不支持CSL,而是改用PSP(Proeessor Support Package),所以对TMS320DM6437 McBSP接口采用PSP提供的McBSP Driver,主要用McBSP Driver提供的LLC层API进行编程。以方便实验程序的运行。

在很多实践中实现DSP和FPGA通信时,McBSP所需的帧同步信号以及时钟信号均由FPGA产生,McBSP发送过来32 bit的数据,DSP内部采用EDMA方式接收数据,McBSP接收同步事件触发EDMA传输。将数据放入DSP片内二级存储器的缓冲区,等待DSP处理。为了写入的数据不被覆盖掉,片内二级存储器缓冲区采用乒乓缓冲结构,就有McBSP发送同步事件触发EDMA传输。

2.1 McBSP配置

2.1.1 接收数据格式配置

McBSP接收数据格式在数据结构LLC_RcvDataSetup中设置,该数据结构在McBSP Driver提供的头文件llc_mcbsp Type.h中定义,在编译工程文件的时候需包含此头文件。接收数据为单帧数据,一个数据帧长度为4个字节,采用帧同步信号检测模式,不进行压缩,数据传输延迟一个比特,采用McBSP同步事件产生中断。McBSP发送数据格式在数据结构LLC_XmitDatasetup中设置,具体参数和接收数据格式保持一致。M-cBSP帧同步和时钟参数在数据结LLC_mcbspClkSetup中设置,该结构同样在头文件llc_mcbspType.h中定义。

2.1.2 启动McBSP

首先调用MeBSP LLC层API对McBSP接口进行设置,准备接收FPGA传输过来的信号。先调用函数LLC_mcbspOpen,该函数在llc_mcbsp.c中定义,函数原型为LLC_mcbspOpen(LLC_McbspObj*const pMcbspObj,Uint32InstanceId,Int32*pMcbspParam,CSL_Status*pStatus),所需参数分别为用户定义的McBSP通道对象,McBSP通道ID,用户定义的配置参数及状态信息,返回参数为指向该通道的句柄hMcbsp。该句话就最为API的函数。

然后设置McBSP通道0,调用函数LLC_mcbspHwSetup(LLC_McbspHandle hMcbsp,const LLC_McbspHwSetup*setup)。第1个参数即为刚才返回的指向McBSP通道0的句柄,第2个参数为一个结构体,包含了前面定义的接收和发送数据结构以及帧同步和时钟参数结构,这样就按照实际应用的要求完成了对McBSP0通道的设置。

最后利用函数LLC_mcbspHwControl使能McBSP接收和发送功能。函数原型为LLC_mcbspHwControl(LLC_McbspHandle hMcbsp,LLC_Mcbsp ControlCmd cmd,const void*arg)。第1个参数为指向McBSP通道0的句柄,第2个参数为硬件控制命令,第3个为对特定命令的补充说明。开启McBSP接收发送功能时,硬件控制命令为LLC_MCBSP_CMD_RESET_CONTROL,使能发送功能时,命令补充说明为LLC_MCBSP_CTIRL_RX_ENABLE,使能接收功能时,命令补充说LLC_MCBSP_CTRL_TX_ENABLE。

2.2 EDMA配置

2.2.1 EDMA配置原理

EDMA中传输的数据种类有3种:ARRAY,BLOCK,FRAME,分别对应3种不同类型的传输。首先是一维传输,即每一个EDMA事件触发的传输只传输一个ARRAY,该ARRAY所包含的字节数由参数RAM里的参数ACNT决定。然后是二维传输,每一个EDMA事件触发传输一个FRAME,每个FRAME里包含的ARRAY数由参数BCNT决定。就像这样在类推先去,三维传输即每次传输一个BLOCK,每个BLOCK里包含的FRAME数由参数CCNT决定。这样的数据就更加有严密性。

一个参数RAM的长度为32个字节。首先是32 bit的可选参数OPT,对于可选参数,通过对各个位置0或1设置事件优先级,数据单元大小,源地址/目的地址变更模式,传输结束代码,是否使能传输参数链接(LINK)功能,同步传输方式等。SRC和DST为EDMA传输所需的源地址和目的地址。SRCBIDX和DSTBIDX用于二维传输中,表示一个ARRAY的开始到下个ARRAY的开始所跨越的字节数。SRCCIDX和DSTCIDX用于三维传输中,一个FRAME的开始到下个FRAME的开始所跨越的字节数。

采用McBSP接口与EDMA配置实现异步串口通信,提高工作的效率

在有些日常生活中采用的双缓冲结构,即在DSP缓冲区内开辟2块缓冲用于并行处理FPGA通过McBSP传过来的数据。当EDMA往PingBuffer里传输数据时,CPU即可处理PongBuffer里的数据,当工作完成后,彼此又交换缓冲区,EDMA往PongBuffer里写数据,CPU处理PingBuffer里的数据。为了实现双缓冲结构,采用了EDMA提供的LINK功能,即将不同的EDMA传输参数RAM链接起来,组成一个传输链,在传输链中,一个传输的结束会导致自动从参数RAM中装载下一个传输需要的事件参数。在具体程序中,只需将Ping通道的参数RAM LINK到Pong通道,同时将Pong通道的参数RAMLINK到Ping通道即可。

2.2.2 EDMA接收数据配置实现

在使用EDMA3 Driver之前必须首先对其进行初始化。EDMA3 LLD提供了2个API进行相关工作。EDMA3_DRV_create和EDMA3_DBV_open。前者用于创建一个EDMA3 Driver对象,后者用于开启对应的EDMA3 Driver通道。

创建并开启EDMA3 Driver通道后,即可为此通道分配资源以及初始化其配置。首先调用EDMA3_DRV_requestChannel请求分配一个DMA通道,随后对该通道的参数RAM进行配置,以满足传输需要。EDMA3_DRV_setSrcParams用于设置该EDMA通道接收数据源地址为McBSPO的DRR寄存器,地址为0x01D00000,地址计数模式为递增模式。EDMA3_DRV_setDestParams设置该EDMA通道接收数据目的地址为DSP片内存储区PingBuf-fer首地址,确保第一次传输数据是到PingBuffer,地址计数模式同样为递增模式。EDMA3_DRV_setSrcIndex用于配置源地址计数索引值,由于源地址为McBSPO的DRR寄存器,固定不变,所以srcBidx=0,srcCidx=0。接着调用EDMA3_DRV_setDestIndex配置目的地址计数索引值,由于接收数据为32 bits,所以sreBidx=srcCidx=4,这是因为DSP内的最小计数单元为一个字节,8bit。EDMA3_DRV_setTransferPamms配置剩余的参数RAM传输参数,包括设置ACNT=4,BCNT=2 048,CCNT=1,采用一维传输A-SYNC。

接下来是Ping/Pong传输的程序实现。需再调用EDMA3_DRV_requestChannel两次,替Ping/Pong各自分配一个通道,于是,一共有3个通道,对应3个参数RAM。Ping通道的参数RAM与主通道的参数RAM完全一致,Pong通道的参数RAM与主通道相比,只需将Pong通道接收数据目的地址改为PongBuffer首地址。随后调用EDMA3_DRV_linkChannel 3次,分别将主通道和Ping通道LINK,Ping通道和Pong通道相互LINK。

2.2.3 EDMA中断实现

TMS320DM6437中,EDMA的128个通道只产生一种中断,当一个通道传输完成后,IPR(Interrupt Pending Register)寄存器里的相应位会被置1,EDMA中断处理器通过查询IPR寄存器确定是哪个通道完成了传输,并调用相应的中断服务程序。

EDMA LLD中中断的设置通过调用EDMA3_DRV_requestChannel实现。该函数的参数中跟中断有关的为eventQ(与通道优先级相关),tceCb(回调函数,即通道传输完成后所调用的中断服务程序)。设置eventQ=0,保证最高优先级,tceCb=edma_isr,该函数的作用是在通道传输完成后发送一个旗语信号给信号处理程序,通知其对收到的数据进行处理。此外,还需调用EDMA3_DRV_setOptField将参数RAMOPT参数中TCINTEN位置1,以使能EDMA中断。随后,利用DSP/BIOS将EDMA中断源和DSP的可屏蔽中断5连接起来。

采用McBSP接口与EDMA配置实现异步串口通信,提高工作的效率

3 实现结果

配置好MeBSP和EDMA后,启动FPGA传输数据,DSP做好接收和发送数据的准备,实验中,FPGA连续不断地发送自加地数给DSP,而DSP只发送2048个32 bit的从0开始的自加数据给FPGA。该结果如图5所示。着可以表明DSP内部的PingBuffer区和PongBuffer区能连续不断的收到FPGA传输过来的数据。

采用McBSP接口与EDMA配置实现异步串口通信,提高工作的效率

本例中设置传完2 048个数据后EDMA发送事件触发一次中断,调用的中断服务程序主要作用是发送一个旗语信号给信号处理程序,并打印出“GOT INTO RCV ISR”,进入中断服务程序,随后已被阻塞的信号处理程序线程收到旗语信号后,开始运行,并打印信息“receive rcv int”,中断测试结果如图6所示,可以看出中断在连续不断的被触发!

采用McBSP接口与EDMA配置实现异步串口通信,提高工作的效率

4 结论

经过以上的测试和实验过程,TMS320DM6437的McBSP和EDMA实现了异步串口通信,在其测试中软硬件的实施都很正常,并且切合实际的应用和实施。可以看出该发放硬件部分容易实现,而且非常简单放心,且采用EDMA方式,很好的节约了资源,大大的提高了工作的效率和资源的利用。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21302

    浏览量

    593104
  • 发生器
    +关注

    关注

    3

    文章

    1291

    浏览量

    60842
  • 串口通信
    +关注

    关注

    32

    文章

    1577

    浏览量

    54859
收藏 人收藏

    评论

    相关推荐

    McBSP串口配置的关键时

    本帖最后由 mr.pengyongche 于 2013-4-30 03:20 编辑 McBSP串口配置的关键时
    发表于 07-16 14:17

    附件为McBSPEDMA简单例程

    附件为McBSPEDMA简单例程对初学者有些用处~
    发表于 03-02 16:02

    McBSP EDMA例程

    附件为McBSPEDMA简单例程,希望对初学者有所帮助。 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before
    发表于 06-21 08:42

    两路McBSP的数据输出存在相对位移的问题,猜测可能与EDMA event Queue有关?

    数据的收发,相关参数如下所示,这些接口的收发均采用EDMA3 PingPongBuffer方式,DMA数据搬移采用A-sync,信道控制器0,事件队列均
    发表于 06-21 13:08

    关于mcbsp模块打开FIFO功能收不到EDMA中断的情况

    配置为1 word,缓存大小配置为32bits的整数倍,每种倍数都尝试过,只要打开BFIFO功能,EDMA就进不了中断了,之前默认没有使用BFIFO功能的时候mcbsp都可以正常
    发表于 06-21 10:14

    使用mcbsp EDMA AD数据采集请问ad中断后怎么启动mcbsp

    打算使用AD7656 AD采集,为降低cpu占用率使用edma传输数据,ad7656有两种接口:spi和并行数据总线,ad转换完成后可以通过一个IO输出中断。Spi方式:我的想法是ad完成中断cpu
    发表于 07-15 15:59

    McBSP和McASP怎么同时使用edma3?

    现在需要McBSP和McASP都要使用edma3,是使用edma3_cc0的中断,然后设置不同的param,在中断发生后中断处理程序中靠不同tcc位来判断,还是同时使用edma3_cc
    发表于 03-17 10:50

    如何配置STM32串口异步通信的输入输出模式呢

    目录串口通信基本原理并行通信与串行通信串行通信中单工,半双工和全双工的区别按通信方式不同又可分为
    发表于 02-18 06:14

    6748的mcbsp edma3 pingpong传输不进入中断

    各位大佬好,现在采用的是6748的芯片 来进行采集,mcbsp采集的数据通过edma3 来实现pingpong传输 ,现在采用的是A_SYN
    发表于 10-13 15:08

    mcbsp edma3 只能采集一个数据并且进不去中断

    各位大佬好,现在采用的是6748的芯片来进行数据采集 ,用mcbsp采集的数据通过edma3读取drr的 来pingpong传输给另一个地址进行算法 ,现在采用的是A_SYNC模式传输
    发表于 10-14 09:56

    基于TMS320DM6437的McBSPEDMA实现串口

    针对DSP TMS320DM6437,为了实现FPGA和DSP间的串口通信采用了其同步多通道缓冲串行口(McBSP)和增强型直接存储器存取
    发表于 12-07 13:49 23次下载

    McBSP在语音信号处理中的应用与实现

    详细介绍了TMS320C54x的多缓冲串口(McBSP)软硬件设计并提出如何用McBSP在语音通信中降低传输带宽,并提出了具体的设计思想和实现
    发表于 10-10 16:21 26次下载
    <b class='flag-5'>McBSP</b>在语音信号处理中的应用与<b class='flag-5'>实现</b>

    使用McBSP实现DSP与串行Flash的接口通讯

    介绍了 McBSP与Flash之间串行接口的设计,并介绍了TMS320VC5509串行8位引导装载的实现方法。同时给出用CSL库函数实现McBSP
    发表于 08-27 14:30 10次下载
    使用<b class='flag-5'>McBSP</b><b class='flag-5'>实现</b>DSP与串行Flash的<b class='flag-5'>接口</b>通讯

    推荐七个好用的、可提高工作效率的网站工具

    推荐七个好用的、可提高工作效率的网站工具
    的头像 发表于 05-05 17:04 2207次阅读

    通过智能设计运行提高工作效率

    电子发烧友网站提供《通过智能设计运行提高工作效率.pdf》资料免费下载
    发表于 09-14 09:34 0次下载
    通过智能设计运行<b class='flag-5'>提高工作效率</b>