-
比尔·盖茨的财富难不成也是省出来的?
只要能做到不浪费就很难得了,难怪什么东东给中国人copy出来后,就会被做烂掉。
-
你的是C000,用的多的设置是9800,我把倍频设到最高F800,放MP3还是一样的慢。
还有就是SD卡的速度提不起来,一提高就读不出数据了,现在最大的问题就是这两个了,还得花时间研究。
忘了说我现在的播放程序没有文件系统支持,只是把卡里的扇区数做在了程序里,上电后直接去指定扇区位置读出来送VS1003的。
-
C8051F的SPI最大时钟是系统OSC的二分之一。
我现在比较晕的地方是怎样设置VS1003B的内核时钟倍频,说明书上看得一知半解的,看了几个程序的VS1003设置都不一样。
现在C8051F015的时钟是11.0592,分频比率是0x03,问题是MMC卡快不起来,太快就读不出了,SD卡比MMC卡的时钟频率还要低。
-
求教一下bozai ,在MP3播放时听起来感觉播放的很慢,播放时间比电脑上放的时间长,音调也不对劲。不知需要做些什么处理能改善此现象?你的SD卡读取速度大概是多少,我的MMC卡SCK时钟用示波器看了在1.3M左右,放128Kbps的MP3速度还行,放182K的就有点吃不消 了,感觉放出来的声音很卡,请教一下要注意些什么?
-
uint8 MMC_SD_init()
{
uint8 i;
uint8 retry;
uint8 r1=0;
uint8 type=0; // 卡类型返回值:0xA0 SD 0xB0 MMC
SDCS = 0; // 使能Card
SPI_speed=0x13; //低速 SPI=300k Fsystem=12Mhz
retry = 0;
do
{
for(i=0;i 30) return (type=0x01); //超时退出,个别卡需要更多次循环才有反应
} while(r1 != 0x01); // MMC、SD卡成功转到SPI模式
retry = 0;
//****** SD卡在进入SPI模式后,激活命令和MMC卡一样为Cmd1,同时Cmd55+Cmd41 仍然有效******//
/* do
{
r1 = MMC_SD_SendCmd(1, 0); //发Cmd1(active激活)命令
retry++;
if(retry > 100) return 1; //超时退出
} while(r1);*/
do
{
r1 = MMC_SD_SendCmd(55, 0); // 先发送 Cmd55
if(r1 == 0x01) // 如果有反应
{
r1 = MMC_SD_SendCmd(41,0); // 再发送 Cmd41 进行激活
if(r1 == 0x00) type = 0x10; // 激活成功就是SD卡
}
else { // 如果发送 Cmd55无反应,改发送 Cmd1
r1 = MMC_SD_SendCmd(1,0);
if(r1 == 0x00) type = 0x20; // 激活成功就是MMC卡
}
retry++;
if(retry > 255) return (type=0x01); // 超时退出, 个别卡需要更多次循环才有反应
} while(r1 != 0x00); // MMC、SD卡激活后的返回值均为0x00*/
// SPI_SendByte(0xFF); // 高速SPI前先发送8个时钟
// SPI_speed = 0x07; // 切换到高速 SPI
r1 = MMC_SD_SendCmd(59, 0); //关CRC
r1 = MMC_SD_SendCmd(16, 512); //设置读取一次的字节数
SDCS = 1; // 关闭Card
// SPI_speed=0x07; //切换到高速 SPI
return type; //参数返回,1为初始化错误,10为SD卡,20为MMC卡
}
//-----------------------------------------------------------
// End of File
//-----------------------------------------------------------
-
//---------------------------------------------------
// 函数名:MMC_SD_ReadSingleBlock
// 功 能:读一个扇区
// 参 数:扇区,数据缓冲区
// 返回值:
//---------------------------------------------------
uint8 MMC_SD_ReadSingleBlock(uint32 sector,uint8 *buffer)
{
uint8 r1;
uint16 i;
SDCS=0; // 使能Card
r1 = MMC_SD_SendCmd(17, sector
-
//---------SD_MMC.C-----------------
//---------------------------------------------------------
// SD_MMC 底层驱动函数库
// 编译环境:Keil C V2.40
// 编写日期:2008-04-07
// 最后更新:2008-05-04
//---------------------------------------------------------
#include "main.h"
#include "sd_mmc.h"
//---------------------------------------------------
// 函数名:SPI_SendByte
// 功 能:SPI 数据发送
// 参 数:uchar
// 返回值:
//---------------------------------------------------
void SPI_SendWreit(uchar temp)
{
SPI0DAT=temp;
while(TXBSY); // 查询发送标志位
}
//---------------------------------------------------
// 函数名:SPI_SendByte
// 功 能:SPI传送一个字节
// 参 数:uchar
// 返回值:uchar
//---------------------------------------------------
uint8 SPI_SendByte(uint8 val) // uint8= uchar
{
SPI0DAT = val;
while(TXBSY);
return SPI0DAT;
}
//---------------------------------------------------
// 函数名:MMC_SD_SendCmd
// 功 能:发送卡命令
// 参 数:uint8,uint32
// 返回值:uint8
//---------------------------------------------------
uint8 MMC_SD_SendCmd(uint8 Cmd, uint32 arg)
{
uint8 r1;
uint8 retry=0;
SPI_SendWreit(0xFF); //发命令前先发送8个时钟
SPI_SendWreit(Cmd | 0x40); //分别写入命令
SPI_SendWreit(arg>>24);
SPI_SendWreit(arg>>16);
SPI_SendWreit(arg>>8);
SPI_SendWreit(arg);
SPI_SendWreit(0x95); //仅本次有效的 CRC值
while((r1 = SPI_SendByte(0xFF)) == 0xFF) //等待响应
if(retry++ > 8) break; //超时退出
return r1; //返回状态值
}