OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5383|回复: 30

FPGA+VS1003+flash方案,播放音频文件遇到问题了,诚心求教!

[复制链接]

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
发表于 2015-12-26 19:34:10 | 显示全部楼层 |阅读模式
6金钱
本帖最后由 bittersweetj 于 2015-12-26 20:14 编辑

大家好,公司项目采用的是FPGA+VS1003+flash方案,flash用于保存音频文件。目前播放遇到问题了,描述如下:
首先我确认了以下几点:
1.首先是硬件方面,目前已经完成了寄存器配置的测试,使用SCI通道写入数据再读出已验证读写正确。VS1003的SDI的正弦测试也通过了,可以通过SDI发送命令开关正弦波。
2.将音频文件通过flash烧录器烧写进flash中,通过烧录器读回数据,可以确认写入的文件是正确的。
3.直接将数据从flash中读出通过SDI总线送入VS1003中,通过FPGA自带的逻辑分析仪和示波器打过,数据也是和音频文件一样的。

但是     。。。。 耳机没有任何声音,VS1003的left、right端用示波器也无法打出任何数据。传送SDI的时候在每个字节传送完成后即检测一次DREQ的状态,为低时停止发送,为高时候发下一字节,直到将整个音频文件发送完毕。

目前SDI使用的时钟是5MHz,SCI_MODE配置为0x8000,CLKF寄存器配置为0x9800,声音大小VOL寄存器写的是0x2020。MP3/MIDI/WAV格式的文件都试过。
现在实在没招了。上来求教各位,谢谢了!

最佳答案

查看完整内容[请看2#楼]

终于成功了,感觉还是时序的问题。目前是4字节就把XDCS拉高一次,而且DREQ变化以后只将当前字节发完并且拉高XDCS,而不是原来的:32字节发送一次XDCS拉高一次,DREQ在32字节发送之中拉低以后继续发完32字节在把XDCS拉高。 目前外部SDI速率为2Mbit,但VS1003内部时钟,1倍频率解码还是不行,播放很慢,将速率配到了2倍,速度就好多了。 听到的声音没有顿卡,很清楚。 谢谢大神的指导。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2015-12-26 19:34:11 | 显示全部楼层
xuande 发表于 2016-1-2 10:53
祝贺!
新年第一件开心事。

终于成功了,感觉还是时序的问题。目前是4字节就把XDCS拉高一次,而且DREQ变化以后只将当前字节发完并且拉高XDCS,而不是原来的:32字节发送一次XDCS拉高一次,DREQ在32字节发送之中拉低以后继续发完32字节在把XDCS拉高。
目前外部SDI速率为2Mbit,但VS1003内部时钟,1倍频率解码还是不行,播放很慢,将速率配到了2倍,速度就好多了。
听到的声音没有顿卡,很清楚。
谢谢大神的指导。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165186
金钱
165186
注册时间
2010-12-1
在线时间
2106 小时
发表于 2015-12-26 19:49:06 | 显示全部楼层
楼主是要代码么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2015-12-26 20:14:56 | 显示全部楼层

不是,是来请教问题了,刚刚在编辑原帖,请您再看看问题描述 谢谢
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2015-12-27 13:01:00 | 显示全部楼层

诚心求教啊,,,比较纳闷,不知道是时序问题还是什么问题。SDI正弦测试时通过了的,但是往芯片灌数据就没有反应。如果先把耳机端断开,left/right端能出数据吗?(是否因为耳机端的阻抗匹配不正确导致示波器打不出数据来,有这个担心)
回复

使用道具 举报

58

主题

6287

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11347
金钱
11347
注册时间
2014-4-1
在线时间
1266 小时
发表于 2015-12-27 13:10:46 | 显示全部楼层

left/right端的输出是模拟信号,为什么总说“出数据”?
这两端是模拟输出,应当对阻抗要求不严格。

貌似问题出在VS1003上面,先想办法把1003调试成功。


回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2015-12-27 20:38:17 | 显示全部楼层
xuande 发表于 2015-12-27 13:10
left/right端的输出是模拟信号,为什么总说“出数据”?
这两端是模拟输出,应当对阻抗要求不严格。

我的意思是现在在left/right端打到没有电平变化,如果是有声音模拟信号出来的话,至少应该是有一定波形。目前打到的信号是一个持续的1V多的电平,。您说先把1003调通,应该注意一些什么问题呢?比如在SDI传输过程中DREQ拉低以后,XDCS需不需要拉高?等等类似的问题,谢谢!
回复

使用道具 举报

58

主题

6287

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11347
金钱
11347
注册时间
2014-4-1
在线时间
1266 小时
发表于 2015-12-27 22:27:23 | 显示全部楼层
bittersweetj 发表于 2015-12-27 20:38
我的意思是现在在left/right端打到没有电平变化,如果是有声音模拟信号出来的话,至少应该是有一定波形。 ...


没有做过vs1003,
但时序问题还是好办的。
可以提些具体问题来看。

回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2015-12-27 23:01:18 | 显示全部楼层
xuande 发表于 2015-12-27 22:27
没有做过vs1003,
但时序问题还是好办的。
可以提些具体问题来看。

我现在就是对时序还不太明白,datasheet上有说需要每32字节以后检测DREQ状态,我现在有做这个检测(目前改为了1字节一检测,之前是32字节检测一次,如截图所示),我在检测到了DREQ拉低以后将DCS拉高,并且停止送数据。
从FPGA内部的逻辑分析仪抓到的图像如截图,感觉上没有什么问题。我现在寄存器的配置只配置了CLKF 值为0x9800,声音寄存器VOL,值为0x2020,其他的都未配置。
IMG_20151223_171036.jpg

回复

使用道具 举报

58

主题

6287

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11347
金钱
11347
注册时间
2014-4-1
在线时间
1266 小时
发表于 2015-12-28 11:24:31 | 显示全部楼层
The DREQ pin/signal is used to signal if VS1003’s FIFO is capable of receiving data. If DREQ
is high, VS1003 can take at least 32 bytes of SDI data or one SCI command. When these
criteria are not met, DREQ is turned low, and the sender should stop transferring new data.

DREQ是VS1003的输出信号。如果输出高电平,表示VS1003可以接收至少32字节数据或命令,否则就会拉低,主控方应当停止发送。

所以,只要检测到DREQ为高,就可以放心大胆地发送32字节,期间不必考虑DREQ的状态,即使为低也无所谓;
随后,要等DREQ再次变高,重复以上过程。


回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2015-12-28 11:35:49 | 显示全部楼层
xuande 发表于 2015-12-28 11:24
The DREQ pin/signal is used to signal if VS1003’s FIFO is capable of receiving data. If DREQ
is hi ...

好的,非常感谢,那么当32个字节后检测到dreq拉低了,停止从SDI上发送数据以外,XDCS、SCLK这些信号需要怎样操作呢?我看datasheet没有说得很清楚。另外在网上搜了一些帖子 ,说初始化完毕以后要在SPI上做4次写零的操作,不知这个是否有必要?如果是"写"0,那难道是使用写命令0x02后面跟数据还是说直接灌4字节0数据在SPI上就可以了呢?谢谢。
回复

使用道具 举报

58

主题

6287

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11347
金钱
11347
注册时间
2014-4-1
在线时间
1266 小时
发表于 2015-12-28 11:46:23 | 显示全部楼层
本帖最后由 xuande 于 2015-12-28 11:52 编辑
bittersweetj 发表于 2015-12-28 11:35
好的,非常感谢,那么当32个字节后检测到dreq拉低了,停止从SDI上发送数据以外,XDCS、SCLK这些信号需要 ...

1、道理上,只要不写内容,XDCS、XCS高低都无所谓。但一般还是拉高吧,避免误操作,更可靠。
     如果XDCS、XCS之一为低,SCLK的变化就是写入内容的过程;如果为高,SCLK怎么样都不会翻天。
    稳妥起见,在空闲状态应当把XDCS和XCS都拉高,而SCLK都拉低。

2、不了解四个0字节的事。如果手册没有要求,估计是为了延时,等待1003到位。    查下0对应什么命令,或者什么数据,就可以知道吧。一般来说,作为命令或者数据,0都会表示空操作。




回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2015-12-28 12:26:47 | 显示全部楼层
xuande 发表于 2015-12-28 11:46
1、道理上,只要不写内容,XDCS、XCS高低都无所谓。但一般还是拉高吧,避免误操作,更可靠。
     如果X ...

谢谢!我下午先把代码改一下试试,看情况有没有改善。再来给您答复。
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2015-12-28 14:11:49 | 显示全部楼层
xuande 发表于 2015-12-28 11:46
1、道理上,只要不写内容,XDCS、XCS高低都无所谓。但一般还是拉高吧,避免误操作,更可靠。
     如果X ...

我把DCS拉高拉低都试了试,数据从SDI打出去了以后,芯片模拟端依然没有反应。。。。
至于4字节的0,我试了一试反而把0地址寄存器的值全置零了,貌似发现芯片的一个bug?
回复

使用道具 举报

58

主题

6287

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11347
金钱
11347
注册时间
2014-4-1
在线时间
1266 小时
发表于 2015-12-28 14:51:58 | 显示全部楼层

查查其他问题吧。

测量的时候,发送动作不能停。



回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2015-12-28 15:13:32 | 显示全部楼层
xuande 发表于 2015-12-28 14:51
查查其他问题吧。

测量的时候,发送动作不能停。

好的,我再试一试。刚刚也排出了时钟问题。现在配置寄存器的时钟大概在1MHZ左右,SDI打音频数据大概在5MHZ左右。vs1003外部时钟是12.288MHZ,默认启动倍频参数是和外部时钟一样,在配置了CLKF以后内部倍频3倍36MHZ左右,那么按照datasheet来说(CLKIN/7)这两个时钟也应该没有问题。
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2015-12-29 15:24:28 | 显示全部楼层
xuande 发表于 2015-12-28 14:51
查查其他问题吧。

测量的时候,发送动作不能停。

测量的时候没啥反应。。。
另外请教一下MP3的发送问题,比如我用UE32打开任意MP3文件,文件从零地址开始都是以"0x49 0x44 0x33 0x03..."开始,那么我发送的话是以''0100 1001  0100 0100 0011 0011 0000 0011...''顺序形式往下发对吧?不需要做什么byteswap之类的操作吧?目前VS1003是采用的MSB first的形式。
回复

使用道具 举报

58

主题

6287

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11347
金钱
11347
注册时间
2014-4-1
在线时间
1266 小时
发表于 2015-12-29 17:27:14 | 显示全部楼层
本帖最后由 xuande 于 2015-12-29 17:35 编辑
bittersweetj 发表于 2015-12-29 15:24
测量的时候没啥反应。。。
另外请教一下MP3的发送问题,比如我用UE32打开任意MP3文件,文件从零地址开始 ...


1003的DA输出是一个物理过程,MP3数据解包是另一个过程,
在都不确定好坏的情况下,应当把它们断开来调试。
一下搞定全部过程是不现实的。

可否用FPGA按1003的格式生成一个波形?
哪怕阶梯波也行,能用示波器测到的。

这样子先搞好1003,再往前走。


回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2015-12-30 10:36:27 | 显示全部楼层
xuande 发表于 2015-12-29 17:27
1003的DA输出是一个物理过程,MP3数据解包是另一个过程,
在都不确定好坏的情况下,应当把它们断开来 ...

VS1003有一个feeding PCM的功能,需要加上WAV文件的header。只有试试这个。
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2016-1-2 10:13:34 | 显示全部楼层
xuande 发表于 2015-12-29 17:27
1003的DA输出是一个物理过程,MP3数据解包是另一个过程,
在都不确定好坏的情况下,应当把它们断开来 ...

终于出声音了!不过播放MP3的时候速度很快,像快进,还不知道为何,,,,
目前是做了以下几个调整:
调整了复位、寄存器置位以后的延时,将SCLK下降沿作为采样时间点,特别是仿造例程每32个字节以后将DCS拉高,并且检测DREQ。
节后继续做测试。
回复

使用道具 举报

58

主题

6287

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11347
金钱
11347
注册时间
2014-4-1
在线时间
1266 小时
发表于 2016-1-2 10:53:19 | 显示全部楼层
bittersweetj 发表于 2016-1-2 10:13
终于出声音了!不过播放MP3的时候速度很快,像快进,还不知道为何,,,,
目前是做了以下几个调整:
...


祝贺!
新年第一件开心事。

速度快,可能是送数据时的速度问题,也可能是1003的参数问题。


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165186
金钱
165186
注册时间
2010-12-1
在线时间
2106 小时
发表于 2016-1-2 11:01:39 | 显示全部楼层
bittersweetj 发表于 2016-1-2 10:13
终于出声音了!不过播放MP3的时候速度很快,像快进,还不知道为何,,,,
目前是做了以下几个调整:
...

这种情况,可能是你没有判断DREQ,猛发数据导致的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2016-1-2 20:19:30 | 显示全部楼层
xuande 发表于 2016-1-2 10:53
祝贺!
新年第一件开心事。

感谢您的支持!节后继续测试,试试您说的意见建议!
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2016-1-2 20:20:48 | 显示全部楼层
正点原子 发表于 2016-1-2 11:01
这种情况,可能是你没有判断DREQ,猛发数据导致的

我是每32个字节以后去判断一次,有时候32字节完成后没有拉低,我就继续传下一次32字节,但有时候在32字节还没传送完就拉低了,等到传送完这次32字节以后再判断,是这个原因吗?
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2016-1-2 20:26:20 | 显示全部楼层
正点原子 发表于 2016-1-2 11:01
这种情况,可能是你没有判断DREQ,猛发数据导致的

还有没有可能和解码时间、采样率两个寄存器的值相关呢?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165186
金钱
165186
注册时间
2010-12-1
在线时间
2106 小时
发表于 2016-1-3 18:03:49 | 显示全部楼层
bittersweetj 发表于 2016-1-2 20:26
还有没有可能和解码时间、采样率两个寄存器的值相关呢?

和采样率,可能也有关系。
不能设置错了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2016-1-4 10:39:57 | 显示全部楼层
正点原子 发表于 2016-1-3 18:03
和采样率,可能也有关系。
不能设置错了。

谢谢,请问一下怎么获得MP3文件的解码时间和采样率等等的信息呢?我再把合适的值在初始化的时候写入对应的寄存器。
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2016-1-4 20:26:19 | 显示全部楼层
正点原子 发表于 2016-1-3 18:03
和采样率,可能也有关系。
不能设置错了。

我将CLKF寄存器复位,让内部时钟保持1X速度(外部时钟是12.288MHZ),SDI速度不超过其1/4的速度,播放速度要正常许多,但是有很多杂音和顿卡。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165186
金钱
165186
注册时间
2010-12-1
在线时间
2106 小时
发表于 2016-1-4 23:08:26 | 显示全部楼层
bittersweetj 发表于 2016-1-4 20:26
我将CLKF寄存器复位,让内部时钟保持1X速度(外部时钟是12.288MHZ),SDI速度不超过其1/4的速度,播放速 ...

那还得调试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2016-1-5 15:44:30 | 显示全部楼层

原子哥,请教一下,VS1003正常工作的话,需要设置哪几个寄存器呢?另外我对时序也存在一些疑问,比如我在32字节结束以后,需要将DCS拉高吗?检测到DREQ为低的时候一定是需要的拉高的,如果DREQ此时依然为高呢?还需要将DCS拉高吗?datasheet上并没有说的很清楚,只说了DREQ如果被拉低是正常的,并没有说此时SPI总线应该如何处理。。。谢谢了。
回复

使用道具 举报

2

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-12-26
在线时间
13 小时
 楼主| 发表于 2016-1-6 14:41:05 | 显示全部楼层

终于成功了,感觉还是时序的问题。目前是4字节就把XDCS拉高一次,而且DREQ变化以后只将当前字节发完并且拉高XDCS,而不是原来的:32字节发送一次XDCS拉高一次,DREQ在32字节发送之中拉低以后继续发完32字节在把XDCS拉高。
目前外部SDI速率为2Mbit,但VS1003内部时钟,1倍频率解码还是不行,播放很慢,将速率配到了2倍,速度就好多了。
听到的声音没有顿卡,很清楚。
谢谢大神的指导。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-9-21 11:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表