McBsp与I2C与AIC23B的使用打算用 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 = { …………………………………… ………………………………………… 有关“ 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。采用这种方式可以有效防止 在DMA的中断服务程序中为了可靠可以把这个Buffer的数据再拷贝到另一个待处理的空间,即两级 参考:http://www.cnblogs.com/zong-blogs/archive/2011/06/23/2087862.html DMA设置:DMA_Config DMA_DMACSDP_RMK( DMA_DMACSDP_DSTBEN_NOBURST , // Destination burst :-不使用突发 DMA_DMACSDP_DSTPACK_OFF, DMA_DMACSDP_DST_DARAM, DMA_DMACSDP_SRCBEN_NOBURST DMA_DMACSDP_SRCPACK_OFF, DMA_DMACSDP_SRC_PERIPH, DMA_DMACSDP_DATATYPE_16BIT), DMA_DMACCR_RMK( //DMACCR 通道控制寄存器 DMA_DMACCR_DSTAMODE_POSTINC, DMA_DMACCR_SRCAMODE_CONST, // Source address mode :- DMA_DMACCR_ENDPROG_ON, DMA_DMACCR_REPEAT_ON, DMA_DMACCR_AUTOINIT_ON, DMA_DMACCR_EN_STOP, DMA_DMACCR_PRIO_LOW, DMA_DMACCR_FS_ELEMENT, DMA_DMACCR_SYNC_REVT0), DMA_DMACICR_RMK( // DMACICR 中断控制寄存器 DMA_DMACICR_BLOCKIE_ON, DMA_DMACICR_FRAMEIE_OFF, DMA_DMACICR_FIRSTHALFIE_OFF, DMA_DMACICR_DROPIE_OFF, DMA_DMACICR_TIMEOUTIE_OFF), 0, 0, 0, 0, 2, N/2, 0, 0 }; |
|