搜索
bottom↓
楼主: sharpufo

【开源作品】OOPY 音乐播放器,STM32 inside, 支持CD格式WAV、无损FLAC软解码播放,裸

  [复制链接]

出0入0汤圆

发表于 2011-4-27 11:43:03 | 显示全部楼层
好东西立马收下,谢谢楼主!

出0入0汤圆

发表于 2011-4-27 13:41:08 | 显示全部楼层
楼主很牛啊!!!

出0入0汤圆

 楼主| 发表于 2011-4-27 14:28:41 | 显示全部楼层
回复【96楼】oyjpt
-----------------------------------------------------------------------

无关紧要的警告。
例如:中文字符的警告、有些变量未用到的警告,函数隐式声明,等等,我也比较懒,这些警告都没改掉。


建议使用最新版本 0.03 在【67楼】.

注意:我使用的ZE外部晶振是16.9344M,默认6倍频。你的ZE不必是这个频率,但是应该修改倍频数使速度至少在64MHZ以上。
同时初始化TIM3的时候应该使其中断周期为10ms.即修改Timer_Config(100,(6773)*RCC_PLL_CLOCKMUL/4);这一行
另外ATMEGA48接的晶振必须是16.9344M. 音轨文件采样率必须为44100,16位,可以是单声道或者双声道.
FLAC文件压缩率只能是在LV0-LV2


按键说明:

   正常播放模式时: 上- 短按进入当前目录的音轨选择,长按进入目录选择
                   下- 长按改变重复播放模式,依次为 全部、目录、单曲、随机(所有文件不重复乱序)
                   左- 短按上一曲 ,长按快退10秒
                   右- 短按下一曲,长按快进10秒
                   中- 短按暂停、播放切换

   在选择界面时:
                   上- 短按、按住光标向上滚动
                   下- 短按、按住光标向下滚动
                   左- 退出
                   右- ENTER
                   中- 短按下一页,长按上一页。

出0入0汤圆

发表于 2011-4-27 15:55:32 | 显示全部楼层
我一开始是直接替换成 3.5 的库和 Fatfs0.08A, 但是发觉 fatfs 0.08 和 0.07 有些不一样。于是换回来了。

我用的屏是 SSD1963.

出0入0汤圆

 楼主| 发表于 2011-4-27 18:25:43 | 显示全部楼层
回复【103楼】lvhaian 安哥
我一开始是直接替换成 3.5 的库和 fatfs0.08a, 但是发觉 fatfs 0.08 和 0.07 有些不一样。于是换回来了。
我用的屏是 ssd1963.
-----------------------------------------------------------------------

为了通过f_readdir函数得到文件的长文件名unicode,这个工程中的0.07e中的ff.c是修改过的。
没有开启长文件名支持,但是可以通过f_readdir函数得到文件的长文件名unicode.文件寻址操作(f_open)是通过短文件名的。
用的库是2.0.3的,屏幕我的是otm3225,具体lcd驱动部分在tft_otm3225.c需要根据你的屏幕修改。

出0入0汤圆

 楼主| 发表于 2011-4-27 18:55:19 | 显示全部楼层
回复【84楼】mldcq
-----------------------------------------------------------------------

不好意思,敝人没做录音模块。貌似网上就有很多吧?

出0入0汤圆

发表于 2011-4-27 20:42:58 | 显示全部楼层
老大你的那个tft屏在哪里买的,能不能给个链接,谢谢了!

出0入0汤圆

 楼主| 发表于 2011-4-27 22:37:30 | 显示全部楼层
回复【106楼】oyjpt  
-----------------------------------------------------------------------
不想有广告嫌疑,自己去找吧,2.4寸 TFT C51 AVR STM32 单片机配件,你问下是不是otm3225.

出0入0汤圆

发表于 2011-4-27 22:46:55 | 显示全部楼层
强悍

出0入0汤圆

发表于 2011-4-27 23:12:36 | 显示全部楼层
好的谢谢了

出100入143汤圆

发表于 2011-4-27 23:34:50 | 显示全部楼层
好东西

出0入0汤圆

发表于 2011-5-5 08:58:18 | 显示全部楼层
牛人 ~~~~

出0入0汤圆

发表于 2011-5-5 14:37:49 | 显示全部楼层
下来看看,支持个

出0入0汤圆

发表于 2011-5-8 22:16:44 | 显示全部楼层
先手了

出0入0汤圆

发表于 2011-5-9 11:11:49 | 显示全部楼层
mark下~

出0入46汤圆

发表于 2011-5-9 11:34:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-9 12:40:31 | 显示全部楼层
做的很好,就是代码开起来有些费劲,技术不过关,呵呵。

出0入0汤圆

发表于 2011-5-9 12:43:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-9 14:22:56 | 显示全部楼层
绿色按键换成金属光泽的外观会更好看

出0入0汤圆

发表于 2011-5-9 15:59:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-13 11:02:37 | 显示全部楼层
强,没有你做的好!

出0入0汤圆

发表于 2011-5-14 16:48:59 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2011-5-14 16:56:21 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2011-5-18 09:46:10 | 显示全部楼层
很强悍啊。学习

出0入0汤圆

发表于 2011-5-18 10:18:29 | 显示全部楼层
这个要帮顶

出0入0汤圆

发表于 2011-5-19 18:47:10 | 显示全部楼层
音频的东东,最喜欢,谢谢楼主!!

出0入0汤圆

发表于 2011-5-23 16:40:01 | 显示全部楼层
楼主 0 0 3 更新下载不了,解压缩错误!

出0入0汤圆

发表于 2011-5-23 16:59:20 | 显示全部楼层
mark~珍藏~

出0入0汤圆

发表于 2011-5-23 20:43:52 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-5-25 17:06:23 | 显示全部楼层
好想收藏,但是下载不到唉。

出0入0汤圆

发表于 2011-5-30 14:15:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-30 23:38:08 | 显示全部楼层
收藏了 谢谢

出0入0汤圆

发表于 2011-5-31 10:12:18 | 显示全部楼层
STM32 music player

出0入0汤圆

发表于 2011-5-31 11:44:14 | 显示全部楼层
mark and thanks

出0入0汤圆

发表于 2011-5-31 13:14:44 | 显示全部楼层
楼主注意身体啊,身体要紧啊。
革_命的本钱啊!

出0入0汤圆

发表于 2011-5-31 13:17:56 | 显示全部楼层
标题写得真是人才呀!

出0入0汤圆

发表于 2011-5-31 14:09:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-31 14:27:23 | 显示全部楼层
mark 下~~  不容易啊~

出0入0汤圆

发表于 2011-6-24 17:31:14 | 显示全部楼层
下班了,明天再看

出0入0汤圆

发表于 2011-6-24 18:17:47 | 显示全部楼层
当然的Cool了!

出0入0汤圆

发表于 2011-6-24 19:52:51 | 显示全部楼层
mark 支持楼主

出0入0汤圆

发表于 2011-6-24 20:42:38 | 显示全部楼层
Mark 学习

出0入0汤圆

发表于 2011-6-25 18:54:21 | 显示全部楼层
好东西,要顶!

出0入0汤圆

发表于 2011-6-26 21:00:02 | 显示全部楼层
楼主提供的TFT图纸LCD_RS-->A0,
程序中#define Bank1_SRAM4_ADDR ((u32)0x6C000000)
#define LCD_DATA_ADDR (Bank1_SRAM4_ADDR + 0x20000F)
#define LCD_CMD_ADDR  (Bank1_SRAM4_ADDR + 0)
我不是很明白,我理解应该为:
#define Bank1_SRAM4_ADDR    ((u32)0x6C000000)
#define LCD_DATA_ADDR (Bank1_SRAM4_ADDR + 1)// Bank1_SRAM4_ADDR + 2是不是也可以?
#define LCD_CMD_ADDR  (Bank1_SRAM4_ADDR + 0)
我是菜鸟,不知理解对不对,烦请解惑,谢谢!

出0入0汤圆

发表于 2011-6-27 15:00:08 | 显示全部楼层
很专业~

出0入0汤圆

发表于 2011-6-27 16:04:44 | 显示全部楼层
支持LZ,就是机器的作工要改进一下。我也准备做一个带功放和音箱一体的。

出0入0汤圆

发表于 2011-6-29 00:27:21 | 显示全部楼层
太好了有时间要搞一个玩玩

出0入0汤圆

发表于 2011-7-2 23:13:04 | 显示全部楼层
MARK 一下。

出0入0汤圆

发表于 2011-7-3 00:51:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-4 22:03:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-5 14:51:27 | 显示全部楼层
不错不错!

出0入0汤圆

 楼主| 发表于 2011-7-8 20:52:20 | 显示全部楼层
回复【127楼】tantao820
楼主 0 0 3 更新下载不了,解压缩错误!
-----------------------------------------------------------------------
请用迅雷等下载工具再次下载,注意看文件大小,看压缩包是否完整。

出0入0汤圆

发表于 2011-8-2 07:57:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-2 08:43:22 | 显示全部楼层
mark,有空慢慢研究

出0入0汤圆

发表于 2011-8-2 10:05:44 | 显示全部楼层
MARK==

出0入0汤圆

发表于 2011-8-2 15:27:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-6 08:42:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-7 10:28:49 | 显示全部楼层
强烈围观中。。。。

出0入0汤圆

发表于 2011-8-8 10:45:16 | 显示全部楼层
现在也在做类似的东西,用了大大的代码中的flac解码部分,但现在解出来的PCM码失真很大

看到说明里讲flac模块用的是traxmod的代码,但现在traxmod的官网上不去了,希望大大能发一份traxmod的flac代码上来,谢谢了!

出0入0汤圆

发表于 2011-8-8 12:03:17 | 显示全部楼层
回复【159楼】sibaru
现在也在做类似的东西,用了大大的代码中的flac解码部分,但现在解出来的pcm码失真很大
看到说明里讲flac模块用的是traxmod的代码,但现在traxmod的官网上不去了,希望大大能发一份traxmod的flac代码上来,谢谢了!
-----------------------------------------------------------------------

解码出来的PCM不能会有失真的, 不然FLAC就不叫无损了... 估计是你音频I2S输出有问题.

出0入0汤圆

发表于 2011-8-8 22:51:35 | 显示全部楼层
回复【160楼】cheungman  
-----------------------------------------------------------------------

我没有用I2S输出,就是简单地将生成的PCM码流加上WAV文件头,作为WAV文件写入文件系统。
发现生成的WAV文件大小比正常解出来的WAV大小少了整整一半,播放出来的话,能听出大致声音,但是有失真。

现在我找不出什么可能的错误的地方,只能先找找lz提到的traxmod的flac模块看看了。

出0入0汤圆

发表于 2011-8-8 22:53:11 | 显示全部楼层
while(br= fread(flac_read_buf,1,fc.max_framesize,flacfile))
        {
                j++;
                bytesleft = br;
                i = flac_decode_frame(&fc, decoded_buf, flac_read_buf,bytesleft);
                if(i < 0)
                {
                        eof=1;
                        bytesleft=0;
                        printf("fail!\n");
                        return 1;
                }
                decoded_buf_sz=fc.blocksize*fc.channels;
                consumed = fc.gb.index / 8;
       
                //fwrite(decoded_buf,1,decoded_buf_sz,outfile);
                fwrite(decoded_buf,1,decoded_buf_sz,outfile);
                for(i=0;i<2*FLAC_MAX_BLOCKSIZE;i++)
                        decoded_buf=0;
                fseek(flacfile,consumed-bytesleft,SEEK_CUR);
        }

大致循环就是这样,其中调用的都是lz的flac库里的函数,我觉得应该没啥问题的啊

出0入0汤圆

发表于 2011-8-12 13:03:28 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2011-8-13 22:45:23 | 显示全部楼层
有创意。好好学习。

出0入0汤圆

发表于 2011-8-14 03:12:08 | 显示全部楼层
好好学习。

出0入0汤圆

发表于 2011-8-23 15:46:28 | 显示全部楼层
我用PCM 1794 也是用I2S 不知道是否一样,考虑用触摸屏,我已经购买了,不过论坛好像关于触摸的程序不多!

出0入0汤圆

发表于 2011-8-24 08:40:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-24 16:48:57 | 显示全部楼层
回复【楼主位】sharpufo 风生水起月皎白
-----------------------------------------------------------------------

收藏

出0入0汤圆

发表于 2011-8-25 18:23:19 | 显示全部楼层
用maga16代替maga48可以吗?

出0入0汤圆

发表于 2011-8-25 21:16:07 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2011-8-27 00:01:37 | 显示全部楼层
厉害啊,支持楼主了,感谢分享。

出0入0汤圆

发表于 2011-8-30 14:05:42 | 显示全部楼层
楼主,我也在做STM32的播放机。能留下联系方式,有很多问题咨询

出0入0汤圆

发表于 2011-9-3 10:49:36 | 显示全部楼层
楼主你的TFT_OTM3225.c 里面的函数能否给多一点注释。作用是什么?但不知道后面有些函数的作用!我的TFT跟楼主的不同。我的学习板例程当中TFT程序能正常使用,于是我就更改fsmc_lcd.c和fsmc_lcd.h替换了你的,试着把只是改了LCD_WRITE_CMD() 和LCD_WRITE_DATA()这两个函数内部,也是不能点亮TFT.估计要把otm3225.c里面函数改才行。
例如:好像
void LCD_PutChar8x16()和void LCD_PutChar8x16_OR 不知道到各自的作用是什么?
void LCD_PutChar()和void LCD_PutChar_OR()有什么不同,从名称上看不出的它的作用
void LCD_Txt_Putc(unsigned char c)和void LCD_Txt_Roll_Up(void)又不知道是作用是什么?

出0入0汤圆

发表于 2011-9-3 11:15:46 | 显示全部楼层
__inline void         LCD_WRITE_CMD(U16 index)                           //写命令到TFT
{
*(vu8*)LCD_CMD_ADDR=(index>>8);
*(vu8*)LCD_CMD_ADDR=(index);

//FSMC_LCD_Write_Byte(index>>8,0);
//FSMC_LCD_Write_Byte(index,0);
}

__inline void         LCD_WRITE_DATA(U16 Data)                        //写数据到TFT
{
*(vu8*)LCD_DATA_ADDR=(Data>>8);
*(vu8*)LCD_DATA_ADDR=(Data);

//FSMC_LCD_Write_Byte(Data>>8,1);
//FSMC_LCD_Write_Byte(Data,1);
}

这段也不太明白,*(vu8*)是什么来的,在哪里定义了。而且后面FSMC_LCD_Write_Byte()为什么给注释掉。 这个不是写入TFT的主要函数吗?

出0入0汤圆

发表于 2011-9-8 13:25:25 | 显示全部楼层
做的不错

出0入0汤圆

发表于 2011-9-10 11:43:57 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-9-11 23:46:51 | 显示全部楼层
回复【162楼】sibaru
-----------------------------------------------------------------------
"fwrite(decoded_buf,1,decoded_buf_sz,outfile); "
这里错了,decoded_buf_sz是解码后缓冲区的大小,但其指decoded_buf是short int型(16位),每采样是2字节,所以应该是
"fwrite(decoded_buf,1,decoded_buf_sz*2,outfile); "


回复【175楼】yeson
-----------------------------------------------------------------------
void LCD_PutChar8x16()和void LCD_PutChar8x16_OR 的差别是一个是背景会被指定颜色覆盖,后一个会保留背景。
void LCD_PutChar()和void LCD_PutChar_OR()同上
void LCD_Txt_Putc(unsigned char c)向文本ASC缓存里输入一个字符c
void LCD_Txt_Roll_Up(void) 文本ASC缓存向上滚动一行

vu8:volatile unsigned char 的宏定义

该操作直接向TFT的地址进行字节写操作,而FSMC_LCD_Write_Byte()是函数,被替换掉可以省掉调用函数的开销.

出0入0汤圆

发表于 2011-9-13 12:54:23 | 显示全部楼层
很好很强大

出0入0汤圆

发表于 2011-9-20 15:53:34 | 显示全部楼层
回复【180楼】sharpufo
-----------------------------------------------------------------------

你好,有没有之前用128*64类似的液晶显示,只播WAV的,我是103RBT,看了你的介绍估计不能解码FLAC吧!我想先仿造一个,我一只想把你的移植到我的TFT上面也弄一个听,光移植TFT搞了2个星期还是不行。所以打算从简!

出0入0汤圆

发表于 2011-9-22 18:29:51 | 显示全部楼层
如何把otm3225的程序改成ILI93XX系列的TFT啊!我尝试过,好像两个驱动芯片相差很远,比较复杂!有无人高手有移植的经验

出0入0汤圆

发表于 2011-9-23 10:07:49 | 显示全部楼层
回复【180楼】sharpufo
-----------------------------------------------------------------------

我用学习板做了一个界面,已经能显示根目录,子目录,带触摸的。现在想加入WAV播放。但对楼主的WAV播放源代码有很多不明白。不知道是如何实现播放的?

我理解是这样,不知道是否正确。应该在先用WAV_Check_PCM_Buf_And_Refill()检查PCM_Buf 里面是否有内容,然后WAV_Fill_PCM_Buf()把读出的wav内容填入,然后执行playWAV()

int playWAV(char * filename)
{
FIL file;
UINT br;
int i,pause_play,pause_disp;
int eof;
struct wavhead head;
U32 freq;
INIT_PLAY_WAV:
pause_play=0;
DISABLE_AUDIO;
if(f_open(&file,filename,FA_READ)!=FR_OK)return 1;
LoadWavHead(&file,&head);
DumpWavHead(&head);
freq=head.fmt.SamplePerSec;
if(
//freq!=I2S_AudioFreq_48k &&
freq!=I2S_AudioFreq_44k// &&
//  freq!=I2S_AudioFreq_22k &&
//   freq!=I2S_AudioFreq_16k &&
//    freq!=I2S_AudioFreq_8k
        )
        {f_close(&file);return 2;}

if(head.fmt.Channels!=2 && head.fmt.Channels!=1)
        {f_close(&file);return 2;}

if(head.fmt.BitsPerSample!=16)
        {f_close(&file);return 2;}

if(head.dataOffset)
f_lseek(&file,head.dataOffset);
else return 2;

//I2S_SetFreq(head.fmt.SamplePerSec);/*if use iis in stm32 instead you have to set samplerate before enable audio play 。*/

LCD_Txt_Set_YX(TIM_DIS_LINE,0);
LCD_Printf("PLAYTIME :");
LCD_Txt_Display();
LCD_BMP( 0,0,15,15,icon_folder);
LCD_BMP( 0,3*16,15,3*16+15,icon_music_red);
//播放前先填充满缓冲区
WAV_Fill_PCM_Buf(&file,&head);
eof=0;oldtime=-1;
pcm_send_data=0;
sync_lrck=1;
ENABLE_AUDIO;

while(eof==0)
{
if(key_right||key_left||key_up ||key_up_long)
        {
        DISABLE_AUDIO;
        f_close(&file);
        if(nowtime>10 && key_left){key_left=0;goto INIT_PLAY_WAV;}
        return 0;
        }

//检测并重填缓冲区
WAV_Check_PCM_Buf_And_Refill(&file,&eof,&head);

//更新时间显示
WAV_TimeUpdate(&file,&head);
//暂停<->播放 pause<->play
if(key_play)
        {
         key_play=0;
         if(pause_play==0)
                 {
                pause_play=1;
                DISABLE_AUDIO;
                LCD_PutString(200,(TIM_DIS_LINE)*16,"PAUSE",RED,BLACK);
                }
        else
                {
                LCD_PutString(200,(TIM_DIS_LINE)*16,"     ",RED,BLACK);
                pause_play=0;
                pcm_buf[now_buf].ptr &= 0xfffe;
                sync_lrck=1;
                ENABLE_AUDIO;
                }
        }

//暂停状态时跳动显示"PAUSE"字符
if(pause_play)
        {
        pause_disp++;
        if(pause_disp==PAUSE_DISP_TIME)
           LCD_PutString(200,(TIM_DIS_LINE)*16,"     ",RED,BLACK);
        if(pause_disp>=2*PAUSE_DISP_TIME)
           {
           pause_disp=0;
           LCD_PutString(200,(TIM_DIS_LINE)*16,"PAUSE  ",RED,BLACK);
           }
        }
}

//等待剩余数据发送完
for(eof=0;;)
{
for(i=0;i<PCM_BUFFER_NUM;i++)
        if(pcm_buf.ptr>=pcm_buf.size)eof++;

if(eof>=PCM_BUFFER_NUM)break;
}

DISABLE_AUDIO;
f_close(&file);
return 0;
}


但我省略了快进部分代码贴出来,对playWAV()里面的运作过程就是不太明白,既然是从SPI,应该有接受到主MEGA48发出信号,才送出信号,但为什么在这函数里面没有检测,如何把WAV送到SPI2上面的呢?还有比如INIT_PLAY_WAV作用是什么;不知道在那里定义。没有找到!DISABLE_AUDIO ENABLE_AUDIO; 我在commone.h里面找到定义,只是SPI发送一个指令?这个指令到底什么作用 到底那个部分说明了把数据传到spi口,怎么好像没有找到这部分的命令,另外PCM_BUM 是定义为SPI的数据寄存器吗的地址吗?怎么我没有找到的!

也上问题请楼主帮忙解答,小弟万分感激

出0入0汤圆

发表于 2011-9-23 11:54:31 | 显示全部楼层
回复【63楼】sharpufo

(原文件名:sd_card.jpg)
引用图片

-----------------------------------------------------------------------

void SPI2_GPIO_config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Disable the JTAG interface and enable the SWJ interface */
  /* Configure SPI2 pins: CK, WS and SD */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

}

怎么SPI2 SD卡接口跟上面的原理图好像不对应

出0入0汤圆

发表于 2011-9-23 11:54:42 | 显示全部楼层
感谢楼主分享。

出0入0汤圆

发表于 2011-9-23 13:26:28 | 显示全部楼层
Mark,太帅了

出0入0汤圆

 楼主| 发表于 2011-9-23 20:41:01 | 显示全部楼层
回复【184楼】yeson
-----------------------------------------------------------------------

SPI2做从机,在atmega48发送的CS片选信号周期内,SPI2被激活并在BCK信号的每个周期送出SPI发送寄存器的1位数据,共16位。发送完16位数据后会同时接收到16位数据并进入【接收中断】。在【接收中断】里准备下一次SPI传输的数据,注意,接收到的是无用的数据,进入接收中断是为了准备下次SPI传输的数据。
把SPI2使能就开始传送音频数据了,禁能就停止传送。
先填充满缓冲区数据,然后使能SPI2就开始传送数据,在playWAV主循环中不断检查缓冲区是否发送完,并进行重填,直至文件结束或者检查到有相关按键。

出10入10汤圆

发表于 2011-9-23 21:36:13 | 显示全部楼层
很强悍!

出0入0汤圆

发表于 2011-9-25 11:45:59 | 显示全部楼层
回复【188楼】sharpufo
回复【184楼】yeson  
-----------------------------------------------------------------------
spi2做从机,在atmega48发送的cs片选信号周期内,spi2被激活并在bck信号的每个周期送出spi发送寄存器的1位数据,共16位。发送完16位数据后会同时接收到16位数据并进入【接收中断】。在【接收中断】里准备下一次spi传输的数据,注意,接收到的是无用的数据,进入接收中断是为了准备下次spi传输的数据。
把spi2使能就开始传送音频数据了,禁能就停止传送。
先填充满缓冲区数据,然后使能spi2就开始传送数据,在playwav主循环中不断检查缓冲区是否发送完,并进行重填,直至文件结束或者检查到有相关按键。
-----------------------------------------------------------------------
感谢,sharpufo的热心解答,但我之前好象看到你有说到用到TIM3触发,作用是什么?
我一直想想跑起你的程序,发现来的103ZE用到了GPIOG口,我的实验板却是103RBT6没有G口。所以只好找回你以前发布的HELLO WAV PLAER。同样的都是RBT6的芯片,已经成功改了TFT程序,能点亮TFT和显示英文字符,但却无法显示中文,估计在SPI1卡了,无法读取SD,导致字库无法读取。我大概看了你的MMC代码,好象只有CS跟我的实验板不同,我也相应更改了PA3,但还是不行这个项目都没有找到关于IO口设定的语句,另外发现你HELLO WAVPLAYER的WAV播放好象跟现在ZE这个不一样。好象用到TIM。还望指导

出0入0汤圆

发表于 2011-9-26 08:56:46 | 显示全部楼层
sharpufo 能留下你的QQ吗?或者加我:1951873 关于HELL WAV PLAYER ,我现在已经移植到我的实验板,能显示TFT,但卡在LCD初始化,三个颜色部分,后来我把TFT程序单独建立一个项目,发现,能先显示英文字符,但中文不能显示,通过调试发现,原来不能读SD取得字库文件,整个程序卡在SD读取部分 。我后来也认真研究过,可能我的板子很的SPI1 CS 引脚不同,我已经在MMC.c里面,这里改成我的板子CS 为PA.3引脚。但还是未能读取SD卡,想请教的程序,还有那部分是关于SPI1的设置,我知道SPI口关于GPIOA的设置了。

#define SELECT()        GPIO_ResetBits(GPIOA, GPIO_Pin_3)
#define        DESELECT()      GPIO_SetBits(GPIOA, GPIO_Pin_3)

另外我发现,你的ZE那个播放机SD卡,怎么用那么多IO脚,不是就4个吗,难道不是SPI模式

出0入0汤圆

 楼主| 发表于 2011-9-27 21:53:09 | 显示全部楼层
回复【191楼】yeson
-----------------------------------------------------------------------

由于种种原因,已经离开这个圈子,几个月不接触这个了,HELLO WAV PLAYER 更久,很多细节已经淡忘。

ZE SD卡是SDIO 4bit模式,不是SPI模式.
HELLO WAV PLAYER用 的RB 是SPI模式.

出0入0汤圆

发表于 2011-9-28 08:54:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-28 10:14:36 | 显示全部楼层
回复【192楼】sharpufo

回复【191楼】yeson  
-----------------------------------------------------------------------
由于种种原因,已经离开这个圈子,几个月不接触这个了,hello wav player 更久,很多细节已经淡忘。
ze sd卡是sdio模式,不是spi模式.
hello wav player用 的rb 是spi模式.
-----------------------------------------------------------------------

很谢谢你,公开源代码,为我们这些后来的菜鸟提供很好借鉴。我理解你因为自己的原因不在涉及这方面的内容,抱歉给你带来麻烦,也希望你能见谅,作为一个后来学习者,遇到问题,有暂无发处理的心情。如果真的如果,有时间能否把你关于这方面的代码资料,打包发一次给我,不必专门整理。因为HELLO WAV PLAYER。实在有部分函数丢失了。如果真的没有时间和已经没有资料,按就算了。由衷感谢你的帮助。
    也回报一下这几天的成绩,TFT我从其他地方拿来了函数,自己更改,终于能显示了,中文英文都可以了。原来不能读卡是因为hello wav plaer 里面的SD卡底层 mmc.c里面缺失了SPI1的使能和对应IO配置函数!我也补充上去终于能读卡了。但显示还是存在问题,只限BMP显示,我还会努力去理解你的程序的。当然还发现主程序当中,不知道什么原因 delayms无法启动 ms10_counter无法增加, 导致程序卡死!
    我想你现在也对这个不太感兴趣。仍然最后感谢!我还是会努力尝试去做。尽管可能最后结果未如所愿!谢谢你

出0入0汤圆

 楼主| 发表于 2011-9-28 12:09:26 | 显示全部楼层
其实也没有更多的代码资料,不知道丢失是哪些函数呢?
ms10_counter不增加表明没有正常进入TIM3中断。

出0入0汤圆

发表于 2011-9-28 23:16:05 | 显示全部楼层
回复【195楼】sharpufo
其实也没有更多的代码资料,不知道丢失是哪些函数呢?
ms10_counter不增加表明没有正常进入tim3中断。
-----------------------------------------------------------------------

没有了stm32_Init(); 所以这个程序无法运行,我后来自己增加上去。能编译了,然后能出到上面的菜单,但通过JTAG调试发觉ms10_counter 没有增加,正如你所说可能没有进入TIM3中断,我查看TIM3的寄存器,也没有使能,那么我想估计你丢失了TIM3的使能函数,TIM2有使能,却没有相关中断或者作用函数,还有所有中断函数的文件好像没有了。没有了,不知道你原来的中断如何设定的。有SPI2的使能,但却没有SPI2 IO配置 包括按键KEY几个键的IO口输出输入配置。

因为HELLO WAV PLAYER这个播放器跟我的实验板 MCU都是 STM32F103RBT 比较接近,所以比较好移植,但楼主你之前公布的HELLO WAV PLAYER这个单WAV播放器的rar包应该是半成品,就如上面我说的那些函数都没有,,而OOPLAYER 这个又相差比较大。所以不好替换!希望楼主真的有时间能找着,HELLO WAV PLAYER之后成功后的这个项目我想先弄好这个,才搞OOPLAYER这个带FLAC的项目。

出0入0汤圆

发表于 2011-9-29 07:50:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-8 10:29:04 | 显示全部楼层
mark ,学习了

出0入0汤圆

发表于 2011-10-8 11:08:33 | 显示全部楼层
漂亮的很啊。

出0入0汤圆

发表于 2011-10-8 13:20:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-8 18:02:01 | 显示全部楼层
不错的播放器,标记学习!

出0入0汤圆

发表于 2011-10-9 20:20:14 | 显示全部楼层
回复【102楼】sharpufo
-----------------------------------------------------------------------

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-26 00:32

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

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