OpenEdv-开源电子网

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

MP3播放很卡

[复制链接]

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
发表于 2012-4-14 13:33:48 | 显示全部楼层 |阅读模式
系统时钟72M,SPI不管几分频MP3播放都很卡,而且噪音很大的感觉,什么原因呢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-14 13:35:31 | 显示全部楼层
RCC->APB2ENR|=1<<4;       //PORTC时钟使能 
GPIOC->CRL&=0XFFFF0000; 
GPIOC->CRL|=0X00003383;//PC0.1.3 推挽 ,DREQC2输入     
GPIOC->ODR|=0x000B;    //PC0.1.3上拉 
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-14 13:36:12 | 显示全部楼层
#define VS_DCS_H  GPIOC->BSRR=1<<3   
#define VS_DCS_L  GPIOC->BRR=1<<3

#define VS_CS_H  GPIOC->BSRR=1<<0
#define VS_CS_L  GPIOC->BRR=1<<0

#define VS_RST_H  GPIOC->BSRR=1<<1
#define VS_RST_L  GPIOC->BRR=1<<1

#define VS_DREQ  (GPIOC->IDR&1<<2)
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-4-14 16:42:42 | 显示全部楼层
回复【3楼】以枫之名:
---------------------------------
直接用我们的例子呢?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-14 16:47:11 | 显示全部楼层
直接用例子很流畅,我在51上实现也很流畅,但参照我在51的程序,修改后,到STM32就不行了,具体现象是这样,初始化时,SPI 256分频,然后播放时,如果是4分频,没声音,8分频和16分频,声音完全是尖锐的噪音,32分频至256分频可以听到音乐,但是播放的慢,而且噪声大。而且修该硬复位的延时,对声音有影响,但均不能做到流畅播放
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-4-14 16:59:41 | 显示全部楼层
回复【5楼】以枫之名:
---------------------------------
那你对比下就知道了.一好一坏,剩下就是你自己找问题了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-14 17:03:07 | 显示全部楼层
#define VS_DREQ   GPIOA->IDR&1<<12   这样子检测DREQ可以吧?   while(VS_DREQ==0);
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-4-14
在线时间
0 小时
发表于 2012-4-14 17:04:36 | 显示全部楼层
多检查
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-14 17:13:20 | 显示全部楼层
重新写了一遍,还是失真啊,悲剧
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-4-14 17:52:37 | 显示全部楼层
我开始怀疑楼主之前那个显示图片的程序也有问题了。。。
https://github.com/roxma
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-14 17:55:58 | 显示全部楼层
什么问题
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-4-14 19:02:57 | 显示全部楼层
具体什么问题我也不清楚呀,

你的两个程序都用了SPI,都有速度慢的问题
https://github.com/roxma
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-14 19:41:03 | 显示全部楼层
哦,一个是STC12的,一个是STM32的,都是用SPI,都能看到刷屏
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-14 19:43:07 | 显示全部楼层
顶不顺了,调了一下午,把原子哥的例程删节到只有VS1003的功能,烧进去能播放,然后我照抄主函数和子函数,都是不能播放,原子哥的例程里是不是设置了什么?
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-14 19:44:21 | 显示全部楼层
#define VS_XDCS_H  GPIOA->BSRR=1<<4
#define VS_XDCS_L  GPIOA->BRR=1<<4
#define VS_XCS_H   GPIOA->BSRR=1<<8
#define VS_XCS_L   GPIOA->BRR=1<<8
#define VS_RST_H  GPIOA->BSRR=1<<11
#define VS_RST_L  GPIOA->BRR=1<<11
#define VS_DQ   GPIOA->IDR&1<<12
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-14 19:44:38 | 显示全部楼层
只有这部分是不同的
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-14 19:45:42 | 显示全部楼层
int main(void)
{            
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
SPI_Flash_Init(); //SPI FLASH初始化       
  SD_Init();  //初始化SD卡           
VS_Init();   
while(1)  
{           
u8 n;
u16 i;
u32 ii;  
VS_HD_Reset(); //硬复位          
VS_Soft_Reset();   //软复位VS10XX                 
for(ii=0;ii<50000;ii++)   //播放音乐的主循环
{
    SD_ReadSingleBlock(32299+ii,BUFFER);//读取一个扇区的数据   
SPIx_SetSpeed(SPI_SPEED_8);//高速,对VS1003B,最大值不能超过36.864/6Mhz,这里设置为4.5M 
i=0;
do      //主播放循环
    {       
if(VS_DQ!=0)  // 非暂停 送数据给VS1003 
{      
     VS_XDCS=0;    
            for(n=0;n<32;n++)
{
SPIx_ReadWriteByte(BUFFER[i++]);  
}
VS_XDCS=1;    
  }
}while(i<511); //循环发送512个字节 
}
}
}

这个是删节后的函数,原子哥那样设置IO能播放,同样的IO,我那样设置就播放不了
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-14 20:32:22 | 显示全部楼层
原因找到了,是因为GPIOA->IDR&1<<12不行,请问下原子哥,怎么才能让读IDR代替PAin(12)
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-4-14 22:11:00 | 显示全部楼层
回复【18楼】以枫之名:
---------------------------------
软件仿真测试了,这条语句可以啊,不过建议加些括号吧,有时候运算的优先级会搞死人的。

比如这样写,意思才比较明确
GPIOA->IDR& (1<<12)

如果是宏定义,我一般会这样写
( GPIOA->IDR& (1<<12)  )


另外,如果 pa12脚的状态是 1那么, 那个宏的结果是 (1<<12)
而PAin(12)的结果是1
这个在写程序的时候也需要注意的
https://github.com/roxma
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-15 11:05:59 | 显示全部楼层
哎,真的是括号的问题( GPIOA->IDR& (1<<12)  )
这样就没问题了,郁闷死了
回复 支持 反对

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2012-4-15 11:06:16 | 显示全部楼层
回复【19楼】Pony279:
---------------------------------
太感谢了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 13:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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