搜索
bottom↓
回复: 54

用AT91SAM7S64做的WAV播放器实验成功,直接输出I2S到TDA1541音频DAC,很爽啊,哈哈,发帖庆

[复制链接]

出0入0汤圆

发表于 2008-1-28 20:42:53 | 显示全部楼层 |阅读模式
终于可以不用CD唱机和电脑来播放HIFI音乐了:) 正很舒服地在听着阿莫前阵子发的那个阿伦的“雨丝情愁.WAV”,一个字爽,二个字开心,哈哈!
先上图

1
2
3
4
5

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2008-1-28 20:56:24 | 显示全部楼层
外置的音频解码器是很早以前用HIFIDIY的TDA1541解码器套件做的,虽然现在TDA1541是很老的16BIT 音频DAC芯片,以现在的眼光来看指标不怎么样,不过这款芯片做的DAC评价非常高,有不少国外著名的HIFI厂家都用它,特点是音乐性非常好,尤其HIFIDIY的这个套件是经过反复调_教的,很特别的采用了电感+电子管进行LPF滤波,音乐性是非常不错的
     这次只是利用了里面的DAC部分,去掉了SPDIF的接收芯片CS8412,用AT91SAM7S64的I2S接口直接输出到TDA1541的I2S输入端口.
    虽然玩AT91SAM7S64有快1年了不过I2S接口还是第一次使用,其实简单的程序上周日的时候就已经调通了,可是用示波器检测I2S虽然有正常输出,可是发觉播放时间不对,原本正常应该I2S口输出10秒钟可是实际上20秒才结束,搞了很久,一直检查以为是I2S初始化设置有问题,直到刚才在突然发现是I2S输出的字节数多了一倍,本来PDC是以字的方式来传输的,于是传输的次数应该少一倍,结果自己写程序的时候太马虎,结果把每次读SD卡的字节数除了2,检查了许多次都没注意到,汗~~

出0入0汤圆

发表于 2008-1-28 21:04:49 | 显示全部楼层
兄弟你太强了...

出0入0汤圆

发表于 2008-1-28 21:14:53 | 显示全部楼层
alien2006强人,向你学习,期待楼主更详细的资料

出0入0汤圆

 楼主| 发表于 2008-1-28 21:17:17 | 显示全部楼层
哈哈,谢谢猎手兄弟,只是刚刚实验成功,还非常不完善呢.以前从来没玩过SD卡了FAT系统,刚刚上周才开始了解,现在程序是漏洞百出啊,SD卡读写也不稳定,有时候要RESET才能成功读取.好在现在能播放音乐了,真的非常开心.

出0入0汤圆

 楼主| 发表于 2008-1-28 21:25:27 | 显示全部楼层
AT91SAM7S的PDC通道真是非常爽,只在RAM中开了2个512字节的缓冲区,交替着给I2S的PDC TX通道和SD卡分别读取,二者互不干扰,这样可以避免I2S数据断流导致对音质的影响.即使这么小的缓冲也没问题.
    目前整个程序占用的RAM只有2K,非常节省.看起来没必要用S256了,S64的资源也足够用了.并且听说可以超频到100MHZ以上,估计这样的话用来做软件解码APE和MP3这些估计也够

出0入0汤圆

发表于 2008-1-28 22:51:43 | 显示全部楼层
alien2006 好快手啊,我还在S64寄存器里打转,刚开始用ARM几天,很多东西实在转不过弯来~~~~~

另外,使用18.432的晶振只能正确播放48K采样率的文件,44.1K的要16.9344晶振12分频才得到吧。

出0入0汤圆

 楼主| 发表于 2008-1-28 23:27:01 | 显示全部楼层
是的彩虹兄,
    18.432的晶振写SSC_CMR=17, 34分频后大约是1.4095MHZ, 相对标准的1.4112偏差了0.1%, 现在为了调试方便还在用串口输出,所以还没改16.9344的晶振, 上周的时候已经去电子市场买来了,真不容易,杭州诺大一个电子市场,问了几乎所有有卖晶振的地方,只有一家专门做晶振的地方有这个频率,还好及时,再过几天电子市场要放假了.
    ATMEL的ARM都有PDC,这个真是个好东东啊,要不然又要读SD卡又要I2S输出很难不产生数据断流啊. 我还好ARM芯片一直在玩,有点基础

出0入0汤圆

发表于 2008-1-28 23:49:33 | 显示全部楼层
不会吧?SSC_CMR=17是34分频了,分频太多了吧?我用*AT91C_SSC_CMR = 6也就是12分频在18.432晶振下可以产生1.536M的I2S总线时钟,也就是48K采样率的数据流码率,实际测试SSC输出的TK=1.536M,TF=48K,TD=96K(发送1K频率方波的数据),TDA1543 DA输出后的方波也是1K频率。如果你用34分频会不会音调变低啊?

出0入0汤圆

发表于 2008-1-28 23:51:15 | 显示全部楼层
搬来小板凳,听课中

出0入0汤圆

发表于 2008-1-28 23:59:02 | 显示全部楼层
楼主牛啊!
春节放假的7天里不知道有没有时间也搞一个。
我以前新欢收集旧电路板,从破光驱CD上拆了不少16.9344的晶振,正好可以用上。

出0入0汤圆

 楼主| 发表于 2008-1-29 00:18:11 | 显示全部楼层
S64时钟是要经过倍频和分频的呀, PLL=18432000*26/5=95846400 然后MCK取PLL时钟的2分频 MCK=47923200HZ,这个频率是S64上最常用的频率了,可以很好地配合USART口,USB口,SSC频率=47923200/34=1409506HZ,虽然少了0.1%不过还能听,哈哈,就是感觉稍稍有点音场不够开阔啊.


TO 10楼:
   才知道破光驱里有那么多好东东啊,可惜以前我把那些旧的东西要不仍了要不送人了,看起来下次还真得收集收集.
   另外想问下BOZAI,关于FAT表我没弄懂,由于我现在的卡是新格式化的,所以保存的文件是连续存储的,读起来方便,不过要是以后文件碎片怎么办办?看资料上说是在FAT表里的链表结构,可是我找了好久也没对应上没整明白

出0入0汤圆

发表于 2008-1-29 00:32:21 | 显示全部楼层
to 【11楼】 alien2006
    简单来说fat文件系统就是把除区表剩下来的空间分块,一块是一个簇,一个簇可以包含几个扇区。所以fat的单位是簇,这就会导致你一个文件只有一个字节,它也要占用一个簇的空间(你可以建一个文件,然后写一个字节保存,然后看属性它占用多大空间就知道它的簇是多少)
    那么fat表就是纪录每一个簇的情况的(一个簇对应一个fat表项)。一个表项用几个字节来表示(12,16,32bit,fat12/16/32就是源于这个)。那么这个表项存了哪些信息呢,一般全0代表对应的那个簇没有使用,全1(只是示例)文件结尾。 其它值就代表当前簇的下一个簇的簇号,这下就应该明白怎么回事了吧。
    目录项给出文件的起始簇,通过计算可以得到文件的起始扇区。当这个簇信息读完了,好了,到分区表中找这个簇纪录的值,如果是结束就结束了,如果是其它值,那么这个值就是下一个簇的簇号,然后下一个簇的fat表项又纪录下下一个簇的簇号.......

出0入0汤圆

 楼主| 发表于 2008-1-29 00:40:49 | 显示全部楼层
嗯,谢谢BOZAI兄弟,真快啊:)
   就是前几天我读我的SD卡的时候,FAT表里表项跟簇的怎么个对应关系没搞明白,FAT表里好像除了前面几行外怎么好像其他都是FF00这些内容.今天实在太晚了,明天我把卡再读一下看看.到时候还得麻烦你帮我看看了:)

出0入0汤圆

发表于 2008-1-29 00:54:03 | 显示全部楼层
如果没用的簇都会是零的,文件结束的,fat12是12位的1,就是0xfff,fat16是16位的1就是0xffff,fat32比较特别是28为1就是0x0fffffff

我截了我几张卡的fat表,一张几乎是空的,另两张有东西,两个fat16,一个fat32:
不知道你是不是用winhex分析的:
1
2
3
头像被屏蔽

出0入0汤圆

发表于 2008-1-29 08:49:49 | 显示全部楼层
alien2006 强啊。抢先一步了。

将DIY资料也打包上传吧。先置COOL!

出0入0汤圆

 楼主| 发表于 2008-1-29 14:33:48 | 显示全部楼层
TO 14楼BOZAI
   太谢谢你帖的截图,看了你帖的FAT16和FAT32对照的内容,一下子恍然大悟了,我手头只有份微软的FAT资料,基本只提到FAT16在FAT表中的链连接,我的卡是FAT32的,一直对文件占用的簇跟这个FAT表如何对应没理解,所以我是根本没去读FAT表直接找到ROOTDIR分区中相应文件所指向的起始簇依次顺序往下读的,好在文件正好是连续存放的所以还能正常播放. 要是碰到了碎片还真不知道会放出什么吓人的声音呢,汗~~~
    刚截了我的SD卡的2张图
这是FIRSTROOTDIR的
1
这是FAT的
2

    现在终于理解了,目录区每个文件记录所指向的起始簇,对应在FAT表中以4字节为单位(FAT16则是2字节)的一个偏移量,这个偏移量所对应的4字节内容(28位有效)就是该文件下一个簇的地址,若碰到文件在该簇中结束则是FFFFFF0F表示. 就像目录中那个"YSQC    WAV":对应的起始簇位置是0x00000008于是我在FAT中偏移8*4字节处找到该文件的下一簇为09...,由于这个文件总长是35122698字节,那么所需占用的簇总数就是35122698/bpb_BytePerSec/bpb_SecPerClus +1 正好是68600个簇(我的卡是格式化成每个簇正好一个扇区,取巧了),那么在FAT表中偏移(68600+8-1)个双字的地方(即68607*4+0x23A00 = 0x669FC)就有一个文件结束的标志FFFFFF0F,
1
    是这么理解的吧:)
    现在我读文件的程序还极其不完善,只是为了暂时先将YSQC.WAV读出来而到处取巧的方法,处理FAT的函数库还得全部重新写才行!
想来应该还应该考虑下面的几条
1、碰到多分区如何处理
2、FAT16/FAT32要分开处理
3、每簇多扇区的情况
4、目录还没处理
5、长文件名
6、中文
   还是长路漫漫啊~~

出0入0汤圆

发表于 2008-1-30 18:27:49 | 显示全部楼层
to 【16楼】 alien2006
    不客气,就是你说的意思了。

    目前我就多分区的问题没有处理,也没有去弄它,一般卡就一个区。如果是硬盘的话会有多个,到时候还要去判断是主分区还是扩展分区。还有点麻烦。还有我现有的程序不适合操作多分区,真要弄得话还要在目前的数据结构上再包一层,改起来也麻烦,所以就一直没弄。
    这些全弄懂的确要花一段时间的。

出0入0汤圆

发表于 2008-6-20 23:58:21 | 显示全部楼层
好,帮顶!

出0入0汤圆

发表于 2008-6-21 10:01:06 | 显示全部楼层
渴望你和彩虹的东西量产,俺给认识的人都买一个送过去.说是我最好的朋友做的.

出0入0汤圆

发表于 2008-6-21 15:14:27 | 显示全部楼层
qiang ren

出0入0汤圆

发表于 2008-12-4 02:16:36 | 显示全部楼层
这个裤贴没资料啊

出0入0汤圆

发表于 2009-3-20 20:23:28 | 显示全部楼层
楼主能说下SD卡的读写和SSC的发送是怎么通过PDC来调整的吗???急啊!!!顶起!!!

出0入0汤圆

发表于 2009-5-19 20:05:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-5-25 21:57:44 | 显示全部楼层
收藏

出0入0汤圆

发表于 2009-6-25 16:01:38 | 显示全部楼层
Mark

出0入0汤圆

发表于 2009-7-8 17:16:45 | 显示全部楼层
记号下

出0入0汤圆

发表于 2009-7-26 01:10:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-7-26 01:29:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-11 23:58:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-11 09:10:50 | 显示全部楼层
很好 !正准备做这个呢!

出0入0汤圆

发表于 2009-9-14 16:43:01 | 显示全部楼层
怎么没资料

出0入0汤圆

发表于 2009-9-14 17:51:37 | 显示全部楼层
牛人啊不知道什么时候才能赶上

出0入0汤圆

发表于 2009-9-14 21:48:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-1 22:21:52 | 显示全部楼层
老帖也mark!!!

出235入235汤圆

发表于 2010-3-2 14:19:29 | 显示全部楼层
mark,期待楼主资料

出0入0汤圆

发表于 2010-5-12 18:24:50 | 显示全部楼层
期待楼主的资料

出0入0汤圆

发表于 2010-5-12 19:53:51 | 显示全部楼层
记号~~

出0入0汤圆

发表于 2010-5-13 12:54:50 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-6-9 12:38:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-15 21:42:55 | 显示全部楼层
这帖子楼主没有上传资料啊,只是讲了一下结果.很好奇通过SPI读取SD卡数据放入I2S的PDC过程,而且用了乒乓算法, 能给出一个参考资料么? 如果不能给出,这贴也不该置cool.

出0入198汤圆

发表于 2010-9-13 16:30:55 | 显示全部楼层
回复【41楼】qiujianben
-----------------------------------------------------------------------

楼主要对得起这个裤子啊,都两年了,还在等你的资料~~

出0入0汤圆

发表于 2010-9-13 17:59:59 | 显示全部楼层
哈,ls痴心人一个!

出0入0汤圆

发表于 2010-9-29 21:14:25 | 显示全部楼层
就是,楼主不会把我们都遗忘了吧?

出0入0汤圆

发表于 2010-10-7 17:55:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-9 17:24:58 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-11-12 11:34:25 | 显示全部楼层
mark fat

出0入0汤圆

发表于 2012-9-12 21:12:33 | 显示全部楼层
mark!            

出0入0汤圆

发表于 2012-11-11 21:22:45 | 显示全部楼层
MARK                    

出0入0汤圆

发表于 2012-12-4 10:00:28 | 显示全部楼层
楼主用没用过CS4330啊?给个驱动程序呗

出0入0汤圆

发表于 2013-1-24 01:31:34 | 显示全部楼层
mark!!!!!!!!!!

出0入0汤圆

发表于 2013-2-19 16:14:00 | 显示全部楼层
强!
能共享下就更好了

出20入0汤圆

发表于 2013-9-23 12:22:12 | 显示全部楼层
楼主强啊,我也买了个TDA1541在玩,很好

出0入0汤圆

发表于 2015-3-4 11:25:02 | 显示全部楼层
很有参考价值的帖子,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 02:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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