分享

http://www.51mobile.com.cn/thread-192-1-1.html 手机研发群

 LC书房斋 2014-01-23

McBsp与I2C与AIC23B的使用

  (2011-11-30 01:11:32)
标签: 

杂谈

分类: DSP学习
打算用
1、5509a的I2C接口来接aic23b的控制接口,两线结构——数据传输线+时钟线
2、5509a的mcbsp0来接aic23b 的数据传输口,有三种模式,选择DSP模式,可以无缝连接,5509a作为从机,aic23b作为主机
3、5509a的dma来对数据进行暂存
大致实现过程:
声音通过mic,或者line in方式进入aic23b 的模拟通道,打开ad转换,设置好采样速率8k OR 44k,将数据通过aic23b的数字通道送到5509a的mcbsp0,这时启动DMA将数据转存到daram中 CPU可以对数据进行处理 再将其转存到DARAM的输出缓存中,DMA会将其送到MCBSP0的发送端口,传输到AIC23B的数字通道,通过DA转换将数据输出到扬声器中。
attention:
1、aic23b传输过程先传输左声道数据在传输右声道数据,并且设置为先传MSB
2、传输速率都有AIC23B决定,并且要特别注意 AIC23B的时钟模式 我使用的是 normal 模式
3、DMA设置为自动初始化方式,每次加载一样的设置到工作寄存器,要特别注意当传输产生中断时要特别注意要清空DMA的中断的状态寄存器,否则就只会发生一次中断
4、I2C的csl API函数有问题 ,最好编写自己的设置函数 具体参考一下:

有关McBsp:
MCBSP_Config Mcbsp1Config = {
 //设置串口控制寄存器1()
 MCBSP_SPCR1_RMK
 //设置串口控制寄存器2()
 MCBSP_SPCR2_RMK
 //设置接收帧格式(接收帧段1每帧1个字,段1每个字长32bit)  
 //单数据段,接收字长度为32位,每段1个字,接收延迟1bit
 MCBSP_RCR1_RMK
 MCBSP_RCR2_RMK
 //设置发送帧格式(发送帧段1每帧1个字,段1每个字长32bit)  
 //单数据段,发生字长度为32位,每段1个字,发送延迟1bit
 MCBSP_XCR1_RMK
 MCBSP_XCR2_RMK
……………………………………
 //设置引脚控制寄存器(设置不产生帧同步信号,并且外部通过CLKX引脚提供发送时钟
 //帧同步信号高有效,CLKX下降沿发送信号,CLKRP作为输出时钟信号)
 MCBSP_PCR_RMK
…………………………………………
有关“ fatal error: could not open source file ***.h”如下解决:
McBsp与I2C与AIC23B的使用
McBSP可以有三种方式跟CPU通信:每收到或发送一个单元,置标志位,CPU轮询此标志位;每收到或发送一个单元,给CPU发送中断;通过DMA收到或发送完一组单元,再给CPU中断。通常,为了减轻CPU负担,都采用第三种方法。

采用DMA的方式,即串口每发送或接受到一个单元,都会自动触发DMA将其搬送到一个内部的Buffer,等Buffer满了再通过中断方式告诉CPU处理。这时DMA最好采用ABU(Auto Buffering)模式,在这种模式下,DMA会在两个Buffer(其实是一个大Buffer的前一半和后一半)之间自动切换,每个Buffer满了(接收)或空了(发送)都会给CPU发出中断,在CPU处理这个Buffer的时候,DMA会自动去操作另一个Buffer。采用这种方式可以有效防止 Buffer中的数据在串口速率较高时被新数据冲掉的问题。

DMA的中断服务程序中为了可靠可以把这个Buffer的数据再拷贝到另一个待处理的空间,即两级 Buffer,然后置标志位,CPU在主程序中查询标志位然后作出相应的处理。DMA操作的Buffer可以通过寄存器配置,Buffer的大小和起始位置应设置正确。在指定Buffer的起始位置时应该注意,起始位置应该为大于Buffer大小的下一个2的整数幂的倍数。例如,在8K16bit采样的情况下,以20ms数据为Buffer大小,那么一次处理的数据是8000×32×0.025120bit320word。所以,DMA Buffer应为640word(两个320word Buffer)大小,而Buffer的起始地址应该为1024=2^10>640的整数倍,如0x70000x7400……

参考:http://www.cnblogs.com/zong-blogs/archive/2011/06/23/2087862.html

DMA设置:
DMA_Config  DMARcvConfig = { // DMACSDP 源与目标参数寄存器
DMA_DMACSDP_RMK(
DMA_DMACSDP_DSTBEN_NOBURST , // Destination burst :-不使用突发 
DMA_DMACSDP_DSTPACK_OFF,     // Destination packing :-目标口禁止打包
DMA_DMACSDP_DST_DARAM,       // Destination selection :-接收的目标口是DARAM
DMA_DMACSDP_SRCBEN_NOBURST  , // Source burst :-源突发禁止
DMA_DMACSDP_SRCPACK_OFF,     // Source packing :-源口禁止打包
DMA_DMACSDP_SRC_PERIPH,             // source selection,外设mcbsp
DMA_DMACSDP_DATATYPE_16BIT),   // Data type :- 设置数据类型16bit字长
DMA_DMACCR_RMK( //DMACCR 通道控制寄存器
DMA_DMACCR_DSTAMODE_POSTINC,   // Destination address mode :-自动执行后增量(由于本例中数据类型是16bit,所以+2)
DMA_DMACCR_SRCAMODE_CONST, // Source address mode :-
DMA_DMACCR_ENDPROG_ON,     // End of programmation bit :-
DMA_DMACCR_REPEAT_ON,     //  Repeat condition :-(不管编程配置结束位,结束传输自动初始化开始)
DMA_DMACCR_AUTOINIT_ON,     // Auto initialization bit :- 
DMA_DMACCR_EN_STOP,           // Channel enable :-设置时先关闭通道
DMA_DMACCR_PRIO_LOW,                //  Channel priority :-设置为低优先级
DMA_DMACCR_FS_ELEMENT,       //  Frame\Element Sync :-单元事件同步
DMA_DMACCR_SYNC_REVT0),       //Synchronization control :-McBSP0 Receive Event(REVT1)
DMA_DMACICR_RMK( // DMACICR 中断控制寄存器
DMA_DMACICR_BLOCKIE_ON,     // Whole block interrupt enable :-块传输完成后中断使能
        DMA_DMACICR_LASTIE_OFF,       // Last frame Interrupt enable :-
DMA_DMACICR_FRAMEIE_OFF,       // Whole frame interrupt enable :- 
DMA_DMACICR_FIRSTHALFIE_OFF,   // HAlf frame interrupt enable :- 
DMA_DMACICR_DROPIE_OFF,       // Sync. event drop interrupt enable :-
DMA_DMACICR_TIMEOUTIE_OFF),     // Time out inetrrupt enable  :-/
0,   // DMACSSALMcBSP0为DRR10 McBSP1为DRR11,McBSP2为DRR12,源地址低位*/
0,   // DMACSSAU 源地址高位
0,   // DMACDSAL 目的地址,内部乒乓缓存地址*/ 
0,   // DMACDSAU */
2,       // DMACEN ,1帧内数据长度  16*2 两个数据一个帧
N/2,   // DMACFN ,帧数大小*/
0,   // DMACFI */
0     // DMACEI */
};

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多