本帖最后由 jiaohaitao 于 2012-7-29 17:27 编辑
代码如下,用的振南的文件系统,模拟spi读写sd卡实现mp3播放。
下面的录音程序是比着1003的数据手册上的程序改的
调试的时候,刚开始用串口输出缓冲区的数据,正常。
一旦加上文件系统写数据到sd文件的函数,就会出错。串口也不再输出数据,感觉卡在了某个地方,这是要退出录音的话
令KEY!=1;还是卡在那,有时猛拍两下单片机会跳出来,,,,,郁闷死了。。。。
我感觉有问题的地方就是因为内存不足,在读缓冲区的时候,我就把缓冲字符改成了256b,而手册上是512b
而文件系统的写函数又会占据一定时间,导致。。。。。。下面就不知道了
有遇到这样问题的同学没???指导下,不胜感激!!!
//录音函数
void RecordAdpcm1003(void)
{
unsigned int w = 0, idx = 0;
SD_Reset();
SD_Init();
UART_Send_Str("SD已就绪....
");// Check and locate free space on disk
//上面是sd初始化
if(FAT32_Open_File(&FileInfo,"\recorder0.wav",0))
{
UART_Send_Str("打开文件成功
");
}
else
UART_Send_Str("打开文件失败
");
//上面是打开要存入录音数据文件
UART_Send_Str("下面开始录音.........
");
//寄存器设置,都是按数据手册来的
VS_Write_Reg(0x0b,0x14,0x14);
VS_Write_Reg(0x02,0,0);
VS_Write_Reg(0x03,0x44,0x30);//(SCI_CLOCKF, 0x4430); //* 2.0x 12.288MHz
delay1(10);
VS_Write_Reg(0x0c,0,12);//WriteMp3SpiReg(SCI_AICTRL0, 12); // Div -> 12=8kHz 8=12kHz 6=16kHz
delay1(10);
VS_Write_Reg(0x0d,0,0);//WriteMp3SpiReg(SCI_AICTRL1, 0); // Auto gain
delay1(10);
//这里line_in=0
if (line_in)
{
VS_Write_Reg(0x00,0x58,0x04);//WriteMp3SpiReg(SCI_MODE, 0x5804); //Normal SW reset + other bits
}
else
{
VS_Write_Reg(0x00,0x18,0x04);//WriteMp3SpiReg(SCI_MODE, 0x1804); // Normal SW reset + other bits
}
//写入wav文件的头
for (idx=0; idx < sizeof(header); idx++)
{
db[idx] = header[idx];
UART_Send_Byte(header[idx]);//把wav的格式头输出到串口
}
FAT32_Add_Dat(&FileInfo,sizeof(header),header);//把格式头写到文件中,这个写文件是可以执行的,下面的就不行了
idx=0;
//key=1时录音
while(KEY==1)
{
do {
w=VS_Read_Reg(0x09); //w = ReadMp3SpiReg(SCI_HDAT1);
}
while ((w < 128 || w >= 896)); // wait until 512 bytes available *
//下面是对256个字节的处理
while(idx < 256)
{
w=VS_Read_Reg(0x08);//w = ReadMp3SpiReg(SCI_HDAT0);
db[idx++] = w>>8;
db[idx++] = w&0xFF;
}
UART_Send_Str(db); //问题在这:如果不加下面的写数据到文件的函数,就会正常输出数据到串口
// FAT32_Add_Dat(&FileInfo,256,db);//一旦加上这个函数,就只会写入上面第一装入db[]中的数据,,,,而后单片机就会卡住了
idx = 0;
}
VS_Reset();
UART_Send_Str("录音结束.......
");
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
实时播放很简单,1003设置下寄存器,就是个话筒了,就是按照录音的设置,你试试就知道的,亲
一周热门 更多>