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
McBSP初始化以及和EDMA的结合使用(C64X DSP)相关推荐
- 基于TMS320C6713的McBSP和EDMA实现串口通信
针对TI公司的DSP芯片TMS320C6713,利用片上同步多通道缓冲串行口(McBSP)和增强型直接存储器存取(EDMA)实现了串口通信功能.该方案解决了芯片只有同步串口而不能进行异步传输的问题,丰 ...
- Xiaojie雷达之路---EDMA Driver External Functions详解
文章目录 getNumInstances init open configErrorMonitoring configChannel startDmaTransfer isTransferComple ...
- DSP28335 Mcbsp SPI实现软件片选
思路是把FSX(片选)引脚设置为GPIO脚,控制输出 具体代码如下 管脚初始化函数修改如下 InitMcbspbGpio(void) {--GpioCtrlRegs.GPAMUX2.bit.GPIO2 ...
- C64X EDMA优先级及优先级队列
C64X EDMA优先级及优先级队列 下图为EDMA传输请求方框图: 从图中我们可以看到,请求有三种: l L2控制器传输请求:L2控制器发布所有用于CACHE服务的传输请求:如存取非CACHE内存. ...
- EDMA 和QDMA 还看不懂,先收藏着
1)EDMA概要 ①EDMA数据传输有两种发起方式: ü CPU发起的EMDA数据传输(非同步方式):需要传输时,CPU设置ESR寄存器的相应位为1,从而触发一个EDMA事件的产生,事 ...
- EDMA 和QDMA
http://hi.baidu.com/phoebus08/blog/item/5d3ccffba88452d6b58f316d.html 1)EDMA概要 ①EDMA数据传输有两种发起方式: ü ...
- EDMA - DMA QDMA 完美总结
EDMA - DMA QDMA -------------------------------- 做个参考,和6487/8 的EDMA3的user guide有点区别. --------------- ...
- 6416与aic23进行语言数据采集和处理的程序beta版
本文实现从aic32的line-input获得音频数据并在line-output播放,使用McBSP和EDMA来高效的传输数据,避免DSP的高负载. 数据传输: codec与DSP通过McBSP2传输 ...
- DaVinci DM6437 中文教程
一.DaVinci DM6437 概述 TMS320DM6437是TI公司2006年推出的.专门为高性能.低成本视频应用开发的.主频600MHz的.32位定点DSP达芬奇 (DaVinci(TM)) ...
- DSP中断使用简明教程
一. 简述 本文介绍TMS320C6000系列中断设置的简明方法.通过示例定时器中断,MCBSP串口接收中断及外部中断这三种中断实现过程,介绍如何实现中断各个寄存器的配置,中断向量表书写以及中断服务函 ...
最新文章
- 5月第4周网络安全报告:应用程序漏洞占比达70.3%
- 浏览是不是计算机网络功能,什么是因特网——计算机网络是怎么为你服务的?...
- 802.11N blockACK
- unity3d 多人寻路堵塞堆叠问题
- 关于指针,可能是网上最详细的讲解了
- navicat 怎么调试存储过程_Mysql调试存储过程最简单的方法
- 月圆花美 中秋快乐!
- ps画布扩展颜色灰色不可用的原因和解决方法
- MySQL CONCAT函数:字符串拼接
- Sql Server数据库查询去重数据,并保留最新的数据,以及删除重复数据
- 学生信息管理系统(php MySql),基于PHP学生信息管理系统设计系统设计(MySQL)(含录像)...
- 红帽linux考证时间,红帽认证考试时间
- 中小企业信息化建设管理方案规划设计1
- matlab卡住了 打不开,win7系统matlab打不开无法运行的解决方法
- 阿里字体图标库的使用
- 天啦噜!Stateflow动态测试竟然so easy
- 什么是 ASP.NET
- 水星怎么设置网速最快_水星mw300r怎么提高网速
- 大数据之Flume:Flume概述
- 用C语言开发NES游戏(CC65) 前言