请教:VS1003录音时,不能用文件系统把数据写进sd卡中

2020-02-02 09:28发布

本帖最后由 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("录音结束....... ");
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
jiaohaitao
1楼-- · 2020-02-02 12:15
 精彩回答 2  元偷偷看……
jiaohaitao
2楼-- · 2020-02-02 18:04
顶一下,谁有1003录音的代码,能否让小弟参考下撒。。。。。。
jiaohaitao
3楼-- · 2020-02-02 22:13
高手出来撒。。。。还有当要中断wma格式的文件时,怎么设置才能继续播放。。。。
木v风
4楼-- · 2020-02-03 03:00
我也正在做录音并播放这一块,但是我需要实时播放,不好整啊
jiaohaitao
5楼-- · 2020-02-03 05:41
木v风 发表于 2012-11-7 17:08
我也正在做录音并播放这一块,但是我需要实时播放,不好整啊

实时播放很简单,1003设置下寄存器,就是个话筒了,就是按照录音的设置,你试试就知道的,亲
木v风
6楼-- · 2020-02-03 07:43
 精彩回答 2  元偷偷看……

一周热门 更多>