打印
[LPC]

lpc1768的i2s相关问题求解答~~

[复制链接]
2414|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
happydaysxw|  楼主 | 2014-2-12 13:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
happydaysxw|  楼主 | 2014-2-12 14:20 | 只看该作者
目前我i2s传输的数据长度为32位,dma一次性接收8个数据后下面就是重复数据了,怎么解决这个问题呢?

使用特权

评论回复
板凳
guangbiao| | 2014-2-12 14:34 | 只看该作者
楼主说明白点。。。参考信息太少无法分析的。。。

使用特权

评论回复
地板
happydaysxw|  楼主 | 2014-2-12 14:51 | 只看该作者
guangbiao 发表于 2014-2-12 14:34
楼主说明白点。。。参考信息太少无法分析的。。。

我用i2s传输音频数据,dma方式接收,传输宽度为32位,传输方向是i2s的接收fifo,到内存,dma传输数据个数为160,但是实际运行时,dma目的地址上前8个数据是正确的,后面就是重复数据了

使用特权

评论回复
5
happydaysxw|  楼主 | 2014-2-12 14:56 | 只看该作者
由于i2s的接收FIFO是8*32位的,我觉得是不是这个的原因呢?如果是这样的话,dma的传输数据个数就只能小于等于8吗?目前我测试的结果是这样的,那么我希望传输更多的数据要怎么办呢?

使用特权

评论回复
6
guangbiao| | 2014-2-12 15:15 | 只看该作者
DMA接收数据个数不要设置成160,要设置成触发接收DMA请求的FIFO深度。
如果你FIFO的深度是8,那DMA接收的个数也设成8。
然后在DMA传输完成中断中,修改目标地址(便宜8个字)保存下一次的DMA传输数据,直到设置的缓冲区尾部(比如你设置的160个字),再从缓冲区头部开始或者存到别的地址。

使用特权

评论回复
7
guangbiao| | 2014-2-12 15:16 | 只看该作者
偏移

使用特权

评论回复
8
happydaysxw|  楼主 | 2014-2-12 16:21 | 只看该作者
guangbiao 发表于 2014-2-12 15:15
DMA接收数据个数不要设置成160,要设置成触发接收DMA请求的FIFO深度。
如果你FIFO的深度是8,那DMA接收的个 ...

哦~谢啦~我试试

使用特权

评论回复
9
happydaysxw|  楼主 | 2014-2-12 17:18 | 只看该作者
guangbiao 发表于 2014-2-12 15:15
DMA接收数据个数不要设置成160,要设置成触发接收DMA请求的FIFO深度。
如果你FIFO的深度是8,那DMA接收的个 ...

这样的话,就会每接收8个数据进一次中断,过于频繁,dma不是可以配制成自动循环接收吗?就是在接收完数据后自动开始接收下8个数据。但是我用的LPC1768,没看到要怎么配制成这种模式

使用特权

评论回复
10
guangbiao| | 2014-2-12 17:40 | 只看该作者
happydaysxw 发表于 2014-2-12 17:18
这样的话,就会每接收8个数据进一次中断,过于频繁,dma不是可以配制成自动循环接收吗?就是在接收完数据 ...

你可以将FIFO配置成每接收到1个数据,就触发一次DMA传输,即将FIFO深度配置成1。
然后将DMA接受的数据设置成你想要的数目(比如160),这样DMA在接收完160个数据后会产生中断。
如果你将DMA配置成循环模式,当接收完指定数目的数据后,DMA会再从缓冲区的开始位置进行存储。

使用特权

评论回复
11
guangbiao| | 2014-2-12 17:49 | 只看该作者
其实FIFO的作用就是怕你的应用程序处理不过来,而进行的数据缓冲。
既然你每个数据都能通过DMA转移,相当于通过DAM将你的缓冲区变成了一个更大的FIFO。
而且你自己的这个FIFO的深度由你自己控制,可长可短。
所以就没有必要在使用原有的FIFO了,除非你程序处理不过来,这种情况基本不可能,因为DMA是CPU无关的,可以将其看做一个硬件行为。

使用特权

评论回复
12
happydaysxw|  楼主 | 2014-2-12 17:57 | 只看该作者
guangbiao 发表于 2014-2-12 17:40
你可以将FIFO配置成每接收到1个数据,就触发一次DMA传输,即将FIFO深度配置成1。
然后将DMA接受的数据设 ...

将FIFO配置成每接收到1个数据,就触发一次DMA传输,即将FIFO深度配置成1。。是这样配置吗?
LPC_I2S->I2SDMA2 = (0x01<<8);
这样配置了之后,LPC_GPDMACH0->DMACCControl  |=0xa0 ;设置接收数据个数为160,但是这样的结果就是我最开始说的接收了8个之后就重复一个数据了
这样配置对吗?

使用特权

评论回复
13
guangbiao| | 2014-2-13 10:02 | 只看该作者
happydaysxw 发表于 2014-2-12 17:57
将FIFO配置成每接收到1个数据,就触发一次DMA传输,即将FIFO深度配置成1。。是这样配置吗?
LPC_I2S->I2S ...

不会吧,楼主连这个都要问吗?现成的数据手册在哪里,自己多看看就知道怎么配置了哦!!!
方法都告诉你了,实践出真知。

使用特权

评论回复
14
happydaysxw|  楼主 | 2014-2-13 10:35 | 只看该作者
guangbiao 发表于 2014-2-13 10:02
不会吧,楼主连这个都要问吗?现成的数据手册在哪里,自己多看看就知道怎么配置了哦!!!
方法都告诉你 ...

我就是按照数据手册配的嘛。。不对才问的噻

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

17

帖子

0

粉丝