TMS320DM6437的McBSP与EDMA实现串口通信(二)

2019-07-29 16:30发布

一个参数RAM的长度为32个字节。首先是32 bit的可选参数OPT,对于可选参数,通过对各个位置0或1设置事件优先级,数据单元大小,源地址/目的地址变更模式,传输结束代码,是否使能传输参数链接(LINK)功能,同步传输方式等。SRC和DST为EDMA传输所需的源地址和目的地址。SRCBIDX和DSTBIDX用于二维传输中,表示一个ARRAY的开始到下个ARRAY的开始所跨越的字节数。SRCCIDX和DSTCIDX用于三维传输中,一个FRAME的开始到下个FRAME的开始所跨越的字节数。BCNTRLD:三维传输里需要重新加载的BCNT。LINK:传输完成后重新加载的参数RAM地址,默认是LINK到空参数RAM。
       在此实例中采用的双缓冲结构,即在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接收数据配置实现
       开发环境采用CCS 3.3。通过调用LLD API实现对EDMA Driver的配置以及传输操作。
       在使用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中断实现
       结合DSP/BIOS设置了EDMA中断,以便在一个接收Buffer被填满时,产生的EDMA中断可通知DSP处理该Buffer的数据。
       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连接起来,具体参数在DSP/BIOS配置文件中的HWI模块设置,如图3所示
1.jpg
最后,由于选用了TMS320DM6437的可屏蔽中断5,还需使能IER寄存器里的对应位,C64_enableIER(C64_EINT5)。
       2.2.4 EDMA发送数据配置实现
       EDMA发送数据程序流程和接收数据程序流程大略一致,但较为简单。只需请求一个EDMA传输通道,配置其源地址为DSP内部存放FPGA所需数据内存首地址,目的地址为McBSP的DXR寄存器。其余参数和EDMA接收数据通道参数相同。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。