McBSP初始化以及和EDMA的结合使用(C64X DSP)

(1)时钟、帧以及相关寄存器设定

http://blog.csdn.net/aesthete/archive/2006/07/06/885425.aspx

2)McBSP初始化

        McBSP可以通过两种方式进行数据传输:

EDMA方式:McBSP发送事件通知EDMA通道进行传输,有接收事件REVT和输出事件XEVT,它们都与固定EDMA通道进行了绑定;

CPU方式:McBSP通过中断方式通知CPU进行数据的传输,有接收中断RINT和输出中断XINT,中断的设定由SPCR.RINTM和SPCR.XINTM控制,如果要使用中断方式,应该设为00b;CPU也可以通过轮询方式(Polled)来控制数据的传输,主要是通过查询SPCR.RRDY和SPCR.XRDY来实现;

 

McBSP串口复位,两种方式:

①设备复位:REST引脚置为低电平,所有的串口部件都复位,相应的寄存器也处于复位状态;

②寄存器方式复位:跟设备复位不同,寄存器方式复位可以独立复位各部件,如单独对接收部件复位等;寄存器复位是通过设置SPCR.XRST...等完成的;

 

MsBSP的EDMA传输方式初始化步骤:

      SPRC.GRST(XRST, RRST, FRST)设定为0,如果刚刚进行了设备复位,则无需再去设定;

     设置SRGR、SPCR、PCR、RCR寄存器,注意不要设置上述的几个复位字段;

      设置SPRC.GRST为1使GRS启动,此时GRS选定的时钟源就可以驱动CLKG开始工作;(如果接收部件和输出部件的帧同步和时钟都由外部源驱动的话,则这一步可以省略,因为无需Sampel Rate Generator支持工作);

      等待两个位时钟(CLKR、CLKX):

N = ((1+CLKGDV) * 2 * CLKSM) + ((1+CLKGDV) * 2 * (Ps /P) * (!CLKSM));

         启用中断

          需要设定DSP的控制寄存器CSR.GIE位和IER.NMIE;

          对于EDMA,启动CPU中断INT8,启用EDMA中断EDMA_INT,并且选定合适的EDMA通道(12~15通道,17和18通道);

          EDMA初始化:

对EDMA通道进行编程设定,如:

设定源地址Source Address为DRR用于读,或者为内存位置用于写;

设定目的地址Destination Address为DXR用于写,或者为内存位置用于读;

CNT设置为要传输元素和帧个数;

接收同步事件R/WSYNC为McBSP的REVT用于读;

输出同步事件R/WSYNC为McBSP的XEVT用于写;

设置EDMA通道传输完成中断位TCINT为1,启用Transfer Complete中断;

PRI推荐为1;

          准备EDMA的启动:设置EDMA事件启用寄存器EER的对应于某(些)通道的位,启用某(些)通道的事件触发;

         如果McBSP接收部件以及输出部件在帧传输过程中是作为从设备(Slave,即帧同步信号是从外部获取的)的,则需要设置SPCR.XRST或SPCR.RRST为1,表示准备接收帧同步信号并且开始数据传输;还有一种进行同步的方法是使用帧同步中断来唤醒接收/输出部件,但是需要设定SPCR.(R/X)INTM为10b;

          准备接收或者输出帧主设备(Master,即同步信号从内部获取)运行,需要设定SPCR.RRST或者SPCR.XRST为1;

          如果FSGM=1,表示帧同步信号由SRG的FSG驱动,则需要设置FRST为1来启动FSG;如果FSGM=0,表示每次DXR复制到XSR都会产生一帧,因此FRST无意义;

MsBSP的CPU中断传输方式初始化步骤:

        设置SPCR.XINTM或者SPCR.RINTM为00b,表示允许McBSP在DXR或者DRR中的数据准备好时给CPU发送中断;除了上述步骤的EDMA相关部分,其余都相同,EDMA部分替换为如下步骤:

①通过中断选择器MUXL/H把XINT(0/1/2)和/或者RINT(0/1/2)中断映射到CPU;

2.     ②启用映射的中断。一旦McBSP初始化完成,传输每一个元素(写入DXR或者从DRR中读取)都会引起一次ISR的执行;

 

MsBSP的CPU轮询传输方式初始化步骤:

        去除EDMA方式中的EDMA相关和中断相关,最后一步之后编写一个轮询循环检查SPCR.RRDY或者SPCR.XRDY以便确定McBSP是否准备好了接收或者输出。

 

(3)CSL在McBSP和EDMA中的应用

        以DM642为例,要使用CSL API和C语言进行编程,需要在CCS集成开发环境的Project->Build Option中作一些设定,如link csldm642.lib以及link rts6400.lib,也需要预定义DSP芯片类型,如CHIP_DM642。当然,也可以在cmd文件中使用-l 选项加载csldm642.lib和rts6400.lib,在源文件或者头文件中#define CHIP_DM642。

        在编程过程中,常用的CSL API如下:

 

声明CSL对象:

MCBSP_Handle hMcbsp

EMDA_Handle hEdma

EDMA_Handle hEdma_NULL

 

设置中断向量表:

IRQ_setVecs(vectors)

 

初始化CSL库:

CSL_init()

 

配置McBSP:

MCBSP_Config mcbspCfg

MCBSP_config(hMcbsp, &mcbspCfg)

 

打开McBSP通道:

hMcbsp = MCBSP_open(MCBSP_DEV0, MCBSP_OPEN_RESET);

 

启用sample rate generator:

MCBSP_enableSrgr(hMcbsp)

 

复位EDMA通道:

DMA_reset(INV)

EDMA_clearPram(0x00000000)

 

启用中断:

IRQ_nmiEnable()

IRQ_globalEnable()

IRQ_disable(IRQ_EVT_DMAINT0)

IRQ_clear(IRQ_EVT_DMAINT0)

IRQ_enable(IRQ_EVT_DMAINT0)

 

打开EDMA通道:

hEdma = EDMA_open(EDMA_CHA_REVT0, EDMA_OPEN_RESET);

 

配置EDMA通道:

EDMA_Config config;

EDMA_config(&config);

 

EDMA_configArgs()

 

配置空的EDMA参数集,需要结束时link到此参数集:

hEdma_NULL = EDMA_allocTable(−1);

EDMA_reset(hEdma_NULL);

EDMA_link(hEdma, hEdma_NULL);

 

启用EDMA:

EDMA_enableChannel(hEdma)

 

启用McBSP接收和传输部件

MCBSP_enableRcv(hMcbsp)

MCBSP_enableXmt(hMcbsp)

 

启用帧同步:

MCBSP_enableFsync(hMcbsp)

 

处理EDMA中断:

EDMA_intTest()

EDMA_intClear()

 

关闭McBSP 和 EDMA 通道:

MCBSP_close(hMcbsp)

DMA_close(hDma)

EDMA_close(hEdma)

转载于:https://my.oschina.net/alphajay/blog/98321

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值