(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)