基于TMS320DM6437的McBSP与EDMA实现串口通信
P通道对象,McBSP通道ID,用户定义的配置参数及状态信息,返回参数为指向该通道的句柄hMcbsp。该句柄作为调用API的参数。
然后设置McBSP通道0,调用函数LLC_mcbspHwSetup(LLC_McbspHandle hMcbsp,const LLC_McbspHwSetup*setup)。第1个参数即为刚才返回的指向McBSP通道0的句柄,第2个参数为一个结构体,包含了前面定义的接收和发送数据结构以及帧同步和时钟参数结构,这样就按照实际应用的要求完成了对McBSP0通道的设置。配置完成后,相应的McBSP寄存器的值为:SPCR=0X0000400;RCR=0x00050040;XCR=0x00050040;SRGR=0x20000001;PCR=0x00000080。
最后利用函数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决定。
TMS320DM6437的EDMA共有128个参数RAM,其中存放每个EDMA通道需要的各个传输控制参数,参数RAM的默认对应关系为:EDMA EVENTO对应参数RAMO,EDMAEVENT1对应参数RAM1,等。以此类推。但是也可以在DCHMAPO-63寄存器里修改相应位自行对应。参数RAM的具体结构如图2所示。
一个参数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配置剩余的
TMS320DM6437 McBSP EDMA 串口通信 相关文章:
- 如何实现(电脑)PC机与单片机AT89C51的串行通信(04-19)
- ARM7串口9位方式多机通信的编程技术(05-20)
- RS232接口转USB接口的通信方法(01-12)
- Linux下ARM 和单片机的串口通信设计(04-17)
- GPS定位信息提取及应用(07-31)
- USB虚拟串口通信实现(04-19)