【功能描述】
用ARM 的DMA来搬外设(I2S)FIFO的数据到SDRAM去,实现录音功能
【配置描述】
1、I2S配置
使能I2S收命令时,I2S会输出时钟(示波器看正常),I2S那边就会有采样率为44.1KSa/s的数据源源不断填入I2S的接受FIFO中,I2S的DMA请求配置是当FIFO(大小为32字)满一半的时候,也就是当I2S接收FIFO中数据超过16个字的时候,触发DMA传输请求;
2、DMA这边配置为传输宽度为字(32bit,一般与外设的fifo的宽度相同),采用突发传输模式(8个字),每次传输大小为I2S的半个FIFO容量(16字),源地址是I2S接收FIFO的输出口,源地址不变;目的地址是SDRAM,地址递增;源地址为硬件握手接口,目的地址为软件握手接口
【bug 描述】
理论上说,配置好DMA并使能后,只有当外设的DMA传输请求过来时,DMA获得总线控制权后才会回外设一个ACK,然后启动DMA传输,DMA的传输率应该是44.1K/16(I2S每更新16个数据请求一次DMA传输),但是本实验里,DMA配置好后,使能之后,DMA就开始去I2S接收FIFO那里搬东西了,DMA的搬移频率远比I2S 接收FIFO数据更新频率(44.1KHz)快,就会导致I2S接收FIFO每采集到一个新数据(比如数据A),在下一个数据B来临之前也就是在接下去的1/44.1ms这段时间里,DMA一直读那个相同的数据A,导致SDRAM中一大片一大片的数据是重复的
【酬谢】哪位有类似经历或者有**思路的告知一下,本人只剩48分,全部奉上
|